From 58b11fbd100ecd324dd58146ca2134e2d54587aa Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 8 Apr 2019 11:54:37 +0200 Subject: [PATCH] removed code (incl symbolic links) --- CMakeLists.txt | 76 - Makefile | 235 - Makefile.include | 58 - README.md | 91 - RELEASE.txt | 205 - cleansharedmemory.sh | 1 - cmake/FindCBF.cmake | 11 - cmake/FindQwt.cmake | 118 - cmake/FindROOT.cmake | 167 - cmk.sh | 204 - commitVersions.sh | 15 - configure | 58 - .../html/angularCalibrationHowTo/WARNINGS | 0 .../angularCalibrationHowTo.css | 0 .../angularCalibrationHowTo.html | 0 .../html/angularCalibrationHowTo/images.aux | 0 .../html/angularCalibrationHowTo/images.log | 0 .../html/angularCalibrationHowTo/images.pl | 0 .../html/angularCalibrationHowTo/images.tex | 0 .../html/angularCalibrationHowTo/img1.png | Bin .../html/angularCalibrationHowTo/img10.png | Bin .../html/angularCalibrationHowTo/img11.png | Bin .../html/angularCalibrationHowTo/img12.png | Bin .../html/angularCalibrationHowTo/img13.png | Bin .../html/angularCalibrationHowTo/img14.png | Bin .../html/angularCalibrationHowTo/img15.png | Bin .../html/angularCalibrationHowTo/img16.png | Bin .../html/angularCalibrationHowTo/img17.png | Bin .../html/angularCalibrationHowTo/img18.png | Bin .../html/angularCalibrationHowTo/img2.png | Bin .../html/angularCalibrationHowTo/img3.png | Bin .../html/angularCalibrationHowTo/img4.png | Bin .../html/angularCalibrationHowTo/img5.png | Bin .../html/angularCalibrationHowTo/img6.png | Bin .../html/angularCalibrationHowTo/img7.png | Bin .../html/angularCalibrationHowTo/img8.png | Bin .../html/angularCalibrationHowTo/img9.png | Bin .../html/angularCalibrationHowTo/index.html | 0 .../html/angularCalibrationHowTo/internals.pl | 0 .../html/angularCalibrationHowTo/labels.pl | 0 .../html/angularCalibrationHowTo/node1.html | 0 .../html/angularCalibrationHowTo/node2.html | 0 .../html/angularCalibrationHowTo/node3.html | 0 .../html/angularCalibrationHowTo/node4.html | 0 .../html/angularCalibrationHowTo/node5.html | 0 .../html/energyCalibrationHowTo/WARNINGS | 0 .../energyCalibrationHowTo.css | 0 .../energyCalibrationHowTo.html | 0 .../html/energyCalibrationHowTo/images.aux | 0 .../html/energyCalibrationHowTo/images.log | 0 .../html/energyCalibrationHowTo/images.pl | 0 .../html/energyCalibrationHowTo/images.tex | 0 .../html/energyCalibrationHowTo/img1.png | Bin .../html/energyCalibrationHowTo/img10.png | Bin .../html/energyCalibrationHowTo/img11.png | Bin .../html/energyCalibrationHowTo/img12.png | Bin .../html/energyCalibrationHowTo/img13.png | Bin .../html/energyCalibrationHowTo/img14.png | Bin .../html/energyCalibrationHowTo/img15.png | Bin .../html/energyCalibrationHowTo/img16.png | Bin .../html/energyCalibrationHowTo/img17.png | Bin .../html/energyCalibrationHowTo/img18.png | Bin .../html/energyCalibrationHowTo/img19.png | Bin .../html/energyCalibrationHowTo/img2.png | Bin .../html/energyCalibrationHowTo/img20.png | Bin .../html/energyCalibrationHowTo/img21.png | Bin .../html/energyCalibrationHowTo/img22.png | Bin .../html/energyCalibrationHowTo/img23.png | Bin .../html/energyCalibrationHowTo/img24.png | Bin .../html/energyCalibrationHowTo/img25.png | Bin .../html/energyCalibrationHowTo/img26.png | Bin .../html/energyCalibrationHowTo/img27.png | Bin .../html/energyCalibrationHowTo/img28.png | Bin .../html/energyCalibrationHowTo/img29.png | Bin .../html/energyCalibrationHowTo/img3.png | Bin .../html/energyCalibrationHowTo/img30.png | Bin .../html/energyCalibrationHowTo/img31.png | Bin .../html/energyCalibrationHowTo/img32.png | Bin .../html/energyCalibrationHowTo/img33.png | Bin .../html/energyCalibrationHowTo/img34.png | Bin .../html/energyCalibrationHowTo/img35.png | Bin .../html/energyCalibrationHowTo/img36.png | Bin .../html/energyCalibrationHowTo/img37.png | Bin .../html/energyCalibrationHowTo/img38.png | Bin .../html/energyCalibrationHowTo/img39.png | Bin .../html/energyCalibrationHowTo/img4.png | Bin .../html/energyCalibrationHowTo/img40.png | Bin .../html/energyCalibrationHowTo/img5.png | Bin .../html/energyCalibrationHowTo/img6.png | Bin .../html/energyCalibrationHowTo/img7.png | Bin .../html/energyCalibrationHowTo/img8.png | Bin .../html/energyCalibrationHowTo/img9.png | Bin .../html/energyCalibrationHowTo/index.html | 0 .../html/energyCalibrationHowTo/internals.pl | 0 .../html/energyCalibrationHowTo/labels.pl | 0 .../html/energyCalibrationHowTo/node1.html | 0 .../html/energyCalibrationHowTo/node2.html | 0 .../html/energyCalibrationHowTo/node3.html | 0 .../html/energyCalibrationHowTo/node4.html | 0 .../html/energyCalibrationHowTo/node5.html | 0 .../slsDetectorClientDocs/acquisition.html | 0 .../html/slsDetectorClientDocs/actions.html | 0 .../html/slsDetectorClientDocs/advanced.html | 0 .../html/slsDetectorClientDocs/bc_s.png | Bin .../html/slsDetectorClientDocs/bdwn.png | Bin .../html/slsDetectorClientDocs/closed.png | Bin .../html/slsDetectorClientDocs/config.html | 0 .../html/slsDetectorClientDocs/ctb.html | 0 .../html/slsDetectorClientDocs/data.html | 0 .../html/slsDetectorClientDocs/doxygen.css | 0 .../html/slsDetectorClientDocs/doxygen.png | Bin .../html/slsDetectorClientDocs/dynsections.js | 0 .../html/slsDetectorClientDocs/ftv2blank.png | Bin .../html/slsDetectorClientDocs/ftv2cl.png | Bin .../html/slsDetectorClientDocs/ftv2doc.png | Bin .../ftv2folderclosed.png | Bin .../slsDetectorClientDocs/ftv2folderopen.png | Bin .../slsDetectorClientDocs/ftv2lastnode.png | Bin .../html/slsDetectorClientDocs/ftv2link.png | Bin .../slsDetectorClientDocs/ftv2mlastnode.png | Bin .../html/slsDetectorClientDocs/ftv2mnode.png | Bin .../html/slsDetectorClientDocs/ftv2mo.png | Bin .../html/slsDetectorClientDocs/ftv2node.png | Bin .../html/slsDetectorClientDocs/ftv2ns.png | Bin .../slsDetectorClientDocs/ftv2plastnode.png | Bin .../html/slsDetectorClientDocs/ftv2pnode.png | Bin .../slsDetectorClientDocs/ftv2splitbar.png | Bin .../slsDetectorClientDocs/ftv2vertline.png | Bin .../html/slsDetectorClientDocs/index.html | 0 .../html/slsDetectorClientDocs/jquery.js | 0 .../html/slsDetectorClientDocs/nav_f.png | Bin .../html/slsDetectorClientDocs/nav_g.png | Bin .../html/slsDetectorClientDocs/nav_h.png | Bin .../html/slsDetectorClientDocs/network.html | 0 .../html/slsDetectorClientDocs/open.png | Bin .../html/slsDetectorClientDocs/output.html | 0 .../html/slsDetectorClientDocs/pages.html | 0 .../html/slsDetectorClientDocs/receiver.html | 0 .../slsDetectorClientDocs/search/all_61.html | 0 .../slsDetectorClientDocs/search/all_61.js | 0 .../slsDetectorClientDocs/search/all_63.html | 0 .../slsDetectorClientDocs/search/all_63.js | 0 .../slsDetectorClientDocs/search/all_64.html | 0 .../slsDetectorClientDocs/search/all_64.js | 0 .../slsDetectorClientDocs/search/all_69.html | 0 .../slsDetectorClientDocs/search/all_69.js | 0 .../slsDetectorClientDocs/search/all_6e.html | 0 .../slsDetectorClientDocs/search/all_6e.js | 0 .../slsDetectorClientDocs/search/all_6f.html | 0 .../slsDetectorClientDocs/search/all_6f.js | 0 .../slsDetectorClientDocs/search/all_72.html | 0 .../slsDetectorClientDocs/search/all_72.js | 0 .../slsDetectorClientDocs/search/all_74.html | 0 .../slsDetectorClientDocs/search/all_74.js | 0 .../slsDetectorClientDocs/search/close.png | Bin .../slsDetectorClientDocs/search/mag_sel.png | Bin .../search/nomatches.html | 0 .../search/pages_61.html | 0 .../slsDetectorClientDocs/search/pages_61.js | 0 .../search/pages_63.html | 0 .../slsDetectorClientDocs/search/pages_63.js | 0 .../search/pages_64.html | 0 .../slsDetectorClientDocs/search/pages_64.js | 0 .../search/pages_69.html | 0 .../slsDetectorClientDocs/search/pages_69.js | 0 .../search/pages_6e.html | 0 .../slsDetectorClientDocs/search/pages_6e.js | 0 .../search/pages_6f.html | 0 .../slsDetectorClientDocs/search/pages_6f.js | 0 .../search/pages_72.html | 0 .../slsDetectorClientDocs/search/pages_72.js | 0 .../search/pages_74.html | 0 .../slsDetectorClientDocs/search/pages_74.js | 0 .../slsDetectorClientDocs/search/search.css | 0 .../slsDetectorClientDocs/search/search.js | 0 .../slsDetectorClientDocs/search/search_l.png | Bin .../slsDetectorClientDocs/search/search_m.png | Bin .../slsDetectorClientDocs/search/search_r.png | Bin .../html/slsDetectorClientDocs/settings.html | 0 .../html/slsDetectorClientDocs/sync_off.png | Bin .../html/slsDetectorClientDocs/sync_on.png | Bin .../html/slsDetectorClientDocs/tab_a.png | Bin .../html/slsDetectorClientDocs/tab_b.png | Bin .../html/slsDetectorClientDocs/tab_h.png | Bin .../html/slsDetectorClientDocs/tab_s.png | Bin .../html/slsDetectorClientDocs/tabs.css | 0 .../html/slsDetectorClientDocs/test.html | 0 .../html/slsDetectorClientDocs/timing.html | 0 .../html/slsDetectorClientHowTo/WARNINGS | 0 .../html/slsDetectorClientHowTo/images.aux | 0 .../html/slsDetectorClientHowTo/images.log | 0 .../html/slsDetectorClientHowTo/images.pl | 0 .../html/slsDetectorClientHowTo/images.tex | 0 .../html/slsDetectorClientHowTo/img1.png | Bin .../html/slsDetectorClientHowTo/img2.png | Bin .../html/slsDetectorClientHowTo/index.html | 0 .../html/slsDetectorClientHowTo/labels.pl | 0 .../html/slsDetectorClientHowTo/node1.html | 0 .../html/slsDetectorClientHowTo/node2.html | 0 .../html/slsDetectorClientHowTo/node3.html | 0 .../html/slsDetectorClientHowTo/node4.html | 0 .../html/slsDetectorClientHowTo/node5.html | 0 .../html/slsDetectorClientHowTo/node6.html | 0 .../slsDetectorClientHowTo.css | 0 .../slsDetectorClientHowTo.html | 0 .../html/slsDetectorGuiHowTo/WARNINGS | 0 .../html/slsDetectorGuiHowTo/index.html | 0 .../html/slsDetectorGuiHowTo/internals.pl | 0 .../html/slsDetectorGuiHowTo/labels.pl | 0 .../html/slsDetectorGuiHowTo/node1.html | 0 .../html/slsDetectorGuiHowTo/node10.html | 0 .../html/slsDetectorGuiHowTo/node11.html | 0 .../html/slsDetectorGuiHowTo/node12.html | 0 .../html/slsDetectorGuiHowTo/node13.html | 0 .../html/slsDetectorGuiHowTo/node14.html | 0 .../html/slsDetectorGuiHowTo/node15.html | 0 .../html/slsDetectorGuiHowTo/node16.html | 0 .../html/slsDetectorGuiHowTo/node17.html | 0 .../html/slsDetectorGuiHowTo/node2.html | 0 .../html/slsDetectorGuiHowTo/node3.html | 0 .../html/slsDetectorGuiHowTo/node4.html | 0 .../html/slsDetectorGuiHowTo/node5.html | 0 .../html/slsDetectorGuiHowTo/node6.html | 0 .../html/slsDetectorGuiHowTo/node7.html | 0 .../html/slsDetectorGuiHowTo/node8.html | 0 .../html/slsDetectorGuiHowTo/node9.html | 0 .../slsDetectorGuiHowTo.css | 0 .../slsDetectorGuiHowTo.html | 0 .../html/slsDetectorInstall/WARNINGS | 0 .../html/slsDetectorInstall/index.html | 0 .../html/slsDetectorInstall/labels.pl | 0 .../slsDetectorInstall/slsDetectorInstall.css | 0 .../slsDetectorInstall.html | 0 .../html/slsDetectorUsersDocs/annotated.html | 0 .../html/slsDetectorUsersDocs/bc_s.png | Bin .../html/slsDetectorUsersDocs/bdwn.png | Bin .../html/slsDetectorUsersDocs/classes.html | 0 .../classslsDetectorUsers-members.html | 0 .../classslsDetectorUsers.html | 0 .../classslsReceiverUsers-members.html | 0 .../classslsReceiverUsers.html | 0 .../html/slsDetectorUsersDocs/closed.png | Bin .../dir_0188e84ef4beaf9eafc4e93c2b604ff4.html | 0 .../dir_2a81099005c87b10dbd3ab3fe073d08e.html | 0 .../dir_2fe67bc3f7560f250851af45f127d239.html | 0 .../dir_cda5313c19a4ccff8ceebb4444cecd0a.html | 0 .../html/slsDetectorUsersDocs/doxygen.css | 0 .../html/slsDetectorUsersDocs/doxygen.png | Bin .../html/slsDetectorUsersDocs/dynsections.js | 0 .../html/slsDetectorUsersDocs/files.html | 0 .../html/slsDetectorUsersDocs/ftv2blank.png | Bin .../html/slsDetectorUsersDocs/ftv2cl.png | Bin .../html/slsDetectorUsersDocs/ftv2doc.png | Bin .../slsDetectorUsersDocs/ftv2folderclosed.png | Bin .../slsDetectorUsersDocs/ftv2folderopen.png | Bin .../slsDetectorUsersDocs/ftv2lastnode.png | Bin .../html/slsDetectorUsersDocs/ftv2link.png | Bin .../slsDetectorUsersDocs/ftv2mlastnode.png | Bin .../html/slsDetectorUsersDocs/ftv2mnode.png | Bin .../html/slsDetectorUsersDocs/ftv2mo.png | Bin .../html/slsDetectorUsersDocs/ftv2node.png | Bin .../html/slsDetectorUsersDocs/ftv2ns.png | Bin .../slsDetectorUsersDocs/ftv2plastnode.png | Bin .../html/slsDetectorUsersDocs/ftv2pnode.png | Bin .../slsDetectorUsersDocs/ftv2splitbar.png | Bin .../slsDetectorUsersDocs/ftv2vertline.png | Bin .../html/slsDetectorUsersDocs/functions.html | 0 .../slsDetectorUsersDocs/functions_func.html | 0 .../slsDetectorUsersDocs/functions_vars.html | 0 .../html/slsDetectorUsersDocs/globals.html | 0 .../slsDetectorUsersDocs/globals_defs.html | 0 .../slsDetectorUsersDocs/globals_func.html | 0 .../slsDetectorUsersDocs/globals_vars.html | 0 .../html/slsDetectorUsersDocs/index.html | 0 .../html/slsDetectorUsersDocs/jquery.js | 0 .../slsDetectorUsersDocs/mainClient_8cpp.html | 0 .../mainClient_8cpp_source.html | 0 .../mainReceiver_8cpp.html | 0 .../mainReceiver_8cpp_source.html | 0 .../html/slsDetectorUsersDocs/nav_f.png | Bin .../html/slsDetectorUsersDocs/nav_g.png | Bin .../html/slsDetectorUsersDocs/nav_h.png | Bin .../html/slsDetectorUsersDocs/open.png | Bin .../slsDetectorUsersDocs/search/all_61.html | 0 .../slsDetectorUsersDocs/search/all_61.js | 0 .../slsDetectorUsersDocs/search/all_64.html | 0 .../slsDetectorUsersDocs/search/all_64.js | 0 .../slsDetectorUsersDocs/search/all_65.html | 0 .../slsDetectorUsersDocs/search/all_65.js | 0 .../slsDetectorUsersDocs/search/all_66.html | 0 .../slsDetectorUsersDocs/search/all_66.js | 0 .../slsDetectorUsersDocs/search/all_67.html | 0 .../slsDetectorUsersDocs/search/all_67.js | 0 .../slsDetectorUsersDocs/search/all_69.html | 0 .../slsDetectorUsersDocs/search/all_69.js | 0 .../slsDetectorUsersDocs/search/all_6b.html | 0 .../slsDetectorUsersDocs/search/all_6b.js | 0 .../slsDetectorUsersDocs/search/all_6d.html | 0 .../slsDetectorUsersDocs/search/all_6d.js | 0 .../slsDetectorUsersDocs/search/all_70.html | 0 .../slsDetectorUsersDocs/search/all_70.js | 0 .../slsDetectorUsersDocs/search/all_72.html | 0 .../slsDetectorUsersDocs/search/all_72.js | 0 .../slsDetectorUsersDocs/search/all_73.html | 0 .../slsDetectorUsersDocs/search/all_73.js | 0 .../slsDetectorUsersDocs/search/all_7e.html | 0 .../slsDetectorUsersDocs/search/all_7e.js | 0 .../search/classes_73.html | 0 .../slsDetectorUsersDocs/search/classes_73.js | 0 .../slsDetectorUsersDocs/search/close.png | Bin .../search/defines_70.html | 0 .../slsDetectorUsersDocs/search/defines_70.js | 0 .../slsDetectorUsersDocs/search/files_6d.html | 0 .../slsDetectorUsersDocs/search/files_6d.js | 0 .../slsDetectorUsersDocs/search/files_73.html | 0 .../slsDetectorUsersDocs/search/files_73.js | 0 .../search/functions_61.html | 0 .../search/functions_61.js | 0 .../search/functions_64.html | 0 .../search/functions_64.js | 0 .../search/functions_65.html | 0 .../search/functions_65.js | 0 .../search/functions_66.html | 0 .../search/functions_66.js | 0 .../search/functions_67.html | 0 .../search/functions_67.js | 0 .../search/functions_69.html | 0 .../search/functions_69.js | 0 .../search/functions_6d.html | 0 .../search/functions_6d.js | 0 .../search/functions_70.html | 0 .../search/functions_70.js | 0 .../search/functions_72.html | 0 .../search/functions_72.js | 0 .../search/functions_73.html | 0 .../search/functions_73.js | 0 .../search/functions_7e.html | 0 .../search/functions_7e.js | 0 .../slsDetectorUsersDocs/search/mag_sel.png | Bin .../search/nomatches.html | 0 .../slsDetectorUsersDocs/search/search.css | 0 .../slsDetectorUsersDocs/search/search.js | 0 .../slsDetectorUsersDocs/search/search_l.png | Bin .../slsDetectorUsersDocs/search/search_m.png | Bin .../slsDetectorUsersDocs/search/search_r.png | Bin .../search/variables_6b.html | 0 .../search/variables_6b.js | 0 .../search/variables_72.html | 0 .../search/variables_72.js | 0 .../slsDetectorUsers_8h.html | 0 .../slsDetectorUsers_8h_source.html | 0 .../slsReceiverUsers_8h.html | 0 .../slsReceiverUsers_8h_source.html | 0 .../html/slsDetectorUsersDocs/sync_off.png | Bin .../html/slsDetectorUsersDocs/sync_on.png | Bin .../html/slsDetectorUsersDocs/tab_a.png | Bin .../html/slsDetectorUsersDocs/tab_b.png | Bin .../html/slsDetectorUsersDocs/tab_h.png | Bin .../html/slsDetectorUsersDocs/tab_s.png | Bin .../html/slsDetectorUsersDocs/tabs.css | 0 .../html/slsDetectors-FAQ/WARNINGS | 0 .../html/slsDetectors-FAQ/footnode.html | 0 .../html/slsDetectors-FAQ/images.aux | 0 .../html/slsDetectors-FAQ/images.log | 0 .../html/slsDetectors-FAQ/images.out | 0 .../html/slsDetectors-FAQ/images.pl | 0 .../html/slsDetectors-FAQ/images.tex | 0 .../html/slsDetectors-FAQ/img1.png | Bin .../html/slsDetectors-FAQ/img10.png | Bin .../html/slsDetectors-FAQ/img100.png | Bin .../html/slsDetectors-FAQ/img101.png | Bin .../html/slsDetectors-FAQ/img102.png | Bin .../html/slsDetectors-FAQ/img103.png | Bin .../html/slsDetectors-FAQ/img104.png | Bin .../html/slsDetectors-FAQ/img105.png | Bin .../html/slsDetectors-FAQ/img106.png | Bin .../html/slsDetectors-FAQ/img107.png | Bin .../html/slsDetectors-FAQ/img108.png | Bin .../html/slsDetectors-FAQ/img109.png | Bin .../html/slsDetectors-FAQ/img11.png | Bin .../html/slsDetectors-FAQ/img110.png | Bin .../html/slsDetectors-FAQ/img111.png | Bin .../html/slsDetectors-FAQ/img112.png | Bin .../html/slsDetectors-FAQ/img113.png | Bin .../html/slsDetectors-FAQ/img114.png | Bin .../html/slsDetectors-FAQ/img115.png | Bin .../html/slsDetectors-FAQ/img116.png | Bin .../html/slsDetectors-FAQ/img117.png | Bin .../html/slsDetectors-FAQ/img118.png | Bin .../html/slsDetectors-FAQ/img119.png | Bin .../html/slsDetectors-FAQ/img12.png | Bin .../html/slsDetectors-FAQ/img120.png | Bin .../html/slsDetectors-FAQ/img121.png | Bin .../html/slsDetectors-FAQ/img122.png | Bin .../html/slsDetectors-FAQ/img123.png | Bin .../html/slsDetectors-FAQ/img124.png | Bin .../html/slsDetectors-FAQ/img125.png | Bin .../html/slsDetectors-FAQ/img126.png | Bin .../html/slsDetectors-FAQ/img127.png | Bin .../html/slsDetectors-FAQ/img128.png | Bin .../html/slsDetectors-FAQ/img129.png | Bin .../html/slsDetectors-FAQ/img13.png | Bin .../html/slsDetectors-FAQ/img130.png | Bin .../html/slsDetectors-FAQ/img131.png | Bin .../html/slsDetectors-FAQ/img132.png | Bin .../html/slsDetectors-FAQ/img133.png | Bin .../html/slsDetectors-FAQ/img134.png | Bin .../html/slsDetectors-FAQ/img135.png | Bin .../html/slsDetectors-FAQ/img136.png | Bin .../html/slsDetectors-FAQ/img137.png | Bin .../html/slsDetectors-FAQ/img138.png | Bin .../html/slsDetectors-FAQ/img139.png | Bin .../html/slsDetectors-FAQ/img14.png | Bin .../html/slsDetectors-FAQ/img140.png | Bin .../html/slsDetectors-FAQ/img141.png | Bin .../html/slsDetectors-FAQ/img142.png | Bin .../html/slsDetectors-FAQ/img143.png | Bin .../html/slsDetectors-FAQ/img144.png | Bin .../html/slsDetectors-FAQ/img145.png | Bin .../html/slsDetectors-FAQ/img146.png | Bin .../html/slsDetectors-FAQ/img147.png | Bin .../html/slsDetectors-FAQ/img148.png | Bin .../html/slsDetectors-FAQ/img149.png | Bin .../html/slsDetectors-FAQ/img15.png | Bin .../html/slsDetectors-FAQ/img150.png | Bin .../html/slsDetectors-FAQ/img151.png | Bin .../html/slsDetectors-FAQ/img152.png | Bin .../html/slsDetectors-FAQ/img153.png | Bin .../html/slsDetectors-FAQ/img154.png | Bin .../html/slsDetectors-FAQ/img155.png | Bin .../html/slsDetectors-FAQ/img156.png | Bin .../html/slsDetectors-FAQ/img157.png | Bin .../html/slsDetectors-FAQ/img158.png | Bin .../html/slsDetectors-FAQ/img159.png | Bin .../html/slsDetectors-FAQ/img16.png | Bin .../html/slsDetectors-FAQ/img160.png | Bin .../html/slsDetectors-FAQ/img161.png | Bin .../html/slsDetectors-FAQ/img162.png | Bin .../html/slsDetectors-FAQ/img163.png | Bin .../html/slsDetectors-FAQ/img164.png | Bin .../html/slsDetectors-FAQ/img165.png | Bin .../html/slsDetectors-FAQ/img166.png | Bin .../html/slsDetectors-FAQ/img167.png | Bin .../html/slsDetectors-FAQ/img168.png | Bin .../html/slsDetectors-FAQ/img169.png | Bin .../html/slsDetectors-FAQ/img17.png | Bin .../html/slsDetectors-FAQ/img170.png | Bin .../html/slsDetectors-FAQ/img171.png | Bin .../html/slsDetectors-FAQ/img172.png | Bin .../html/slsDetectors-FAQ/img173.png | Bin .../html/slsDetectors-FAQ/img174.png | Bin .../html/slsDetectors-FAQ/img175.png | Bin .../html/slsDetectors-FAQ/img176.png | Bin .../html/slsDetectors-FAQ/img177.png | Bin .../html/slsDetectors-FAQ/img178.png | Bin .../html/slsDetectors-FAQ/img179.png | Bin .../html/slsDetectors-FAQ/img18.png | Bin .../html/slsDetectors-FAQ/img180.png | Bin .../html/slsDetectors-FAQ/img181.png | Bin .../html/slsDetectors-FAQ/img182.png | Bin .../html/slsDetectors-FAQ/img183.png | Bin .../html/slsDetectors-FAQ/img184.png | Bin .../html/slsDetectors-FAQ/img185.png | Bin .../html/slsDetectors-FAQ/img186.png | Bin .../html/slsDetectors-FAQ/img187.png | Bin .../html/slsDetectors-FAQ/img188.png | Bin .../html/slsDetectors-FAQ/img189.png | Bin .../html/slsDetectors-FAQ/img19.png | Bin .../html/slsDetectors-FAQ/img190.png | Bin .../html/slsDetectors-FAQ/img191.png | Bin .../html/slsDetectors-FAQ/img192.png | Bin .../html/slsDetectors-FAQ/img193.png | Bin .../html/slsDetectors-FAQ/img194.png | Bin .../html/slsDetectors-FAQ/img195.png | Bin .../html/slsDetectors-FAQ/img196.png | Bin .../html/slsDetectors-FAQ/img197.png | Bin .../html/slsDetectors-FAQ/img198.png | Bin .../html/slsDetectors-FAQ/img199.png | Bin .../html/slsDetectors-FAQ/img2.png | Bin .../html/slsDetectors-FAQ/img20.png | Bin .../html/slsDetectors-FAQ/img200.png | Bin .../html/slsDetectors-FAQ/img201.png | Bin .../html/slsDetectors-FAQ/img202.png | Bin .../html/slsDetectors-FAQ/img203.png | Bin .../html/slsDetectors-FAQ/img204.png | Bin .../html/slsDetectors-FAQ/img205.png | Bin .../html/slsDetectors-FAQ/img206.png | Bin .../html/slsDetectors-FAQ/img207.png | Bin .../html/slsDetectors-FAQ/img208.png | Bin .../html/slsDetectors-FAQ/img209.png | Bin .../html/slsDetectors-FAQ/img21.png | Bin .../html/slsDetectors-FAQ/img210.png | Bin .../html/slsDetectors-FAQ/img211.png | Bin .../html/slsDetectors-FAQ/img212.png | Bin .../html/slsDetectors-FAQ/img213.png | Bin .../html/slsDetectors-FAQ/img214.png | Bin .../html/slsDetectors-FAQ/img215.png | Bin .../html/slsDetectors-FAQ/img216.png | Bin .../html/slsDetectors-FAQ/img217.png | Bin .../html/slsDetectors-FAQ/img218.png | Bin .../html/slsDetectors-FAQ/img219.png | Bin .../html/slsDetectors-FAQ/img22.png | Bin .../html/slsDetectors-FAQ/img220.png | Bin .../html/slsDetectors-FAQ/img221.png | Bin .../html/slsDetectors-FAQ/img222.png | Bin .../html/slsDetectors-FAQ/img223.png | Bin .../html/slsDetectors-FAQ/img224.png | Bin .../html/slsDetectors-FAQ/img225.png | Bin .../html/slsDetectors-FAQ/img226.png | Bin .../html/slsDetectors-FAQ/img23.png | Bin .../html/slsDetectors-FAQ/img24.png | Bin .../html/slsDetectors-FAQ/img25.png | Bin .../html/slsDetectors-FAQ/img26.png | Bin .../html/slsDetectors-FAQ/img27.png | Bin .../html/slsDetectors-FAQ/img28.png | Bin .../html/slsDetectors-FAQ/img29.png | Bin .../html/slsDetectors-FAQ/img3.png | Bin .../html/slsDetectors-FAQ/img30.png | Bin .../html/slsDetectors-FAQ/img31.png | Bin .../html/slsDetectors-FAQ/img32.png | Bin .../html/slsDetectors-FAQ/img33.png | Bin .../html/slsDetectors-FAQ/img34.png | Bin .../html/slsDetectors-FAQ/img35.png | Bin .../html/slsDetectors-FAQ/img36.png | Bin .../html/slsDetectors-FAQ/img37.png | Bin .../html/slsDetectors-FAQ/img38.png | Bin .../html/slsDetectors-FAQ/img39.png | Bin .../html/slsDetectors-FAQ/img4.png | Bin .../html/slsDetectors-FAQ/img40.png | Bin .../html/slsDetectors-FAQ/img41.png | Bin .../html/slsDetectors-FAQ/img42.png | Bin .../html/slsDetectors-FAQ/img43.png | Bin .../html/slsDetectors-FAQ/img44.png | Bin .../html/slsDetectors-FAQ/img45.png | Bin .../html/slsDetectors-FAQ/img46.png | Bin .../html/slsDetectors-FAQ/img47.png | Bin .../html/slsDetectors-FAQ/img48.png | Bin .../html/slsDetectors-FAQ/img49.png | Bin .../html/slsDetectors-FAQ/img5.png | Bin .../html/slsDetectors-FAQ/img50.png | Bin .../html/slsDetectors-FAQ/img51.png | Bin .../html/slsDetectors-FAQ/img52.png | Bin .../html/slsDetectors-FAQ/img53.png | Bin .../html/slsDetectors-FAQ/img54.png | Bin .../html/slsDetectors-FAQ/img55.png | Bin .../html/slsDetectors-FAQ/img56.png | Bin .../html/slsDetectors-FAQ/img57.png | Bin .../html/slsDetectors-FAQ/img58.png | Bin .../html/slsDetectors-FAQ/img59.png | Bin .../html/slsDetectors-FAQ/img6.png | Bin .../html/slsDetectors-FAQ/img60.png | Bin .../html/slsDetectors-FAQ/img61.png | Bin .../html/slsDetectors-FAQ/img62.png | Bin .../html/slsDetectors-FAQ/img63.png | Bin .../html/slsDetectors-FAQ/img64.png | Bin .../html/slsDetectors-FAQ/img65.png | Bin .../html/slsDetectors-FAQ/img66.png | Bin .../html/slsDetectors-FAQ/img67.png | Bin .../html/slsDetectors-FAQ/img68.png | Bin .../html/slsDetectors-FAQ/img69.png | Bin .../html/slsDetectors-FAQ/img7.png | Bin .../html/slsDetectors-FAQ/img70.png | Bin .../html/slsDetectors-FAQ/img71.png | Bin .../html/slsDetectors-FAQ/img72.png | Bin .../html/slsDetectors-FAQ/img73.png | Bin .../html/slsDetectors-FAQ/img74.png | Bin .../html/slsDetectors-FAQ/img75.png | Bin .../html/slsDetectors-FAQ/img76.png | Bin .../html/slsDetectors-FAQ/img77.png | Bin .../html/slsDetectors-FAQ/img78.png | Bin .../html/slsDetectors-FAQ/img79.png | Bin .../html/slsDetectors-FAQ/img8.png | Bin .../html/slsDetectors-FAQ/img80.png | Bin .../html/slsDetectors-FAQ/img81.png | Bin .../html/slsDetectors-FAQ/img82.png | Bin .../html/slsDetectors-FAQ/img83.png | Bin .../html/slsDetectors-FAQ/img84.png | Bin .../html/slsDetectors-FAQ/img85.png | Bin .../html/slsDetectors-FAQ/img86.png | Bin .../html/slsDetectors-FAQ/img87.png | Bin .../html/slsDetectors-FAQ/img88.png | Bin .../html/slsDetectors-FAQ/img89.png | Bin .../html/slsDetectors-FAQ/img9.png | Bin .../html/slsDetectors-FAQ/img90.png | Bin .../html/slsDetectors-FAQ/img91.png | Bin .../html/slsDetectors-FAQ/img92.png | Bin .../html/slsDetectors-FAQ/img93.png | Bin .../html/slsDetectors-FAQ/img94.png | Bin .../html/slsDetectors-FAQ/img95.png | Bin .../html/slsDetectors-FAQ/img96.png | Bin .../html/slsDetectors-FAQ/img97.png | Bin .../html/slsDetectors-FAQ/img98.png | Bin .../html/slsDetectors-FAQ/img99.png | Bin .../html/slsDetectors-FAQ/index.html | 0 .../html/slsDetectors-FAQ/internals.pl | 0 .../html/slsDetectors-FAQ/labels.pl | 0 .../html/slsDetectors-FAQ/node1.html | 0 .../html/slsDetectors-FAQ/node10.html | 0 .../html/slsDetectors-FAQ/node11.html | 0 .../html/slsDetectors-FAQ/node12.html | 0 .../html/slsDetectors-FAQ/node13.html | 0 .../html/slsDetectors-FAQ/node14.html | 0 .../html/slsDetectors-FAQ/node15.html | 0 .../html/slsDetectors-FAQ/node16.html | 0 .../html/slsDetectors-FAQ/node17.html | 0 .../html/slsDetectors-FAQ/node18.html | 0 .../html/slsDetectors-FAQ/node19.html | 0 .../html/slsDetectors-FAQ/node2.html | 0 .../html/slsDetectors-FAQ/node20.html | 0 .../html/slsDetectors-FAQ/node21.html | 0 .../html/slsDetectors-FAQ/node22.html | 0 .../html/slsDetectors-FAQ/node23.html | 0 .../html/slsDetectors-FAQ/node24.html | 0 .../html/slsDetectors-FAQ/node25.html | 0 .../html/slsDetectors-FAQ/node26.html | 0 .../html/slsDetectors-FAQ/node27.html | 0 .../html/slsDetectors-FAQ/node28.html | 0 .../html/slsDetectors-FAQ/node29.html | 0 .../html/slsDetectors-FAQ/node3.html | 0 .../html/slsDetectors-FAQ/node30.html | 0 .../html/slsDetectors-FAQ/node31.html | 0 .../html/slsDetectors-FAQ/node32.html | 0 .../html/slsDetectors-FAQ/node33.html | 0 .../html/slsDetectors-FAQ/node34.html | 0 .../html/slsDetectors-FAQ/node35.html | 0 .../html/slsDetectors-FAQ/node36.html | 0 .../html/slsDetectors-FAQ/node37.html | 0 .../html/slsDetectors-FAQ/node38.html | 0 .../html/slsDetectors-FAQ/node39.html | 0 .../html/slsDetectors-FAQ/node4.html | 0 .../html/slsDetectors-FAQ/node40.html | 0 .../html/slsDetectors-FAQ/node41.html | 0 .../html/slsDetectors-FAQ/node42.html | 0 .../html/slsDetectors-FAQ/node43.html | 0 .../html/slsDetectors-FAQ/node44.html | 0 .../html/slsDetectors-FAQ/node45.html | 0 .../html/slsDetectors-FAQ/node46.html | 0 .../html/slsDetectors-FAQ/node47.html | 0 .../html/slsDetectors-FAQ/node48.html | 0 .../html/slsDetectors-FAQ/node49.html | 0 .../html/slsDetectors-FAQ/node5.html | 0 .../html/slsDetectors-FAQ/node50.html | 0 .../html/slsDetectors-FAQ/node51.html | 0 .../html/slsDetectors-FAQ/node52.html | 0 .../html/slsDetectors-FAQ/node53.html | 0 .../html/slsDetectors-FAQ/node54.html | 0 .../html/slsDetectors-FAQ/node55.html | 0 .../html/slsDetectors-FAQ/node56.html | 0 .../html/slsDetectors-FAQ/node57.html | 0 .../html/slsDetectors-FAQ/node58.html | 0 .../html/slsDetectors-FAQ/node59.html | 0 .../html/slsDetectors-FAQ/node6.html | 0 .../html/slsDetectors-FAQ/node60.html | 0 .../html/slsDetectors-FAQ/node61.html | 0 .../html/slsDetectors-FAQ/node62.html | 0 .../html/slsDetectors-FAQ/node63.html | 0 .../html/slsDetectors-FAQ/node64.html | 0 .../html/slsDetectors-FAQ/node65.html | 0 .../html/slsDetectors-FAQ/node66.html | 0 .../html/slsDetectors-FAQ/node7.html | 0 .../html/slsDetectors-FAQ/node8.html | 0 .../html/slsDetectors-FAQ/node9.html | 0 .../slsDetectors-FAQ/slsDetectors-FAQ.css | 0 .../slsDetectors-FAQ/slsDetectors-FAQ.html | 0 .../pdf/angularCalibrationHowTo.pdf | Bin .../pdf/energyCalibrationHowTo.pdf | Bin .../pdf/slsDetectorClientDocs.pdf | Bin .../pdf/slsDetectorClientHowTo.pdf | Bin .../docs => docs}/pdf/slsDetectorGuiHowTo.pdf | Bin .../docs => docs}/pdf/slsDetectorInstall.pdf | Bin .../pdf/slsDetectorUsersDocs.pdf | Bin .../docs => docs}/pdf/slsDetectors-FAQ.pdf | Bin evalVersionVariables.sh | 22 - examples/ang.off | 24 - examples/bad.chans | 5 - .../config_gen_script/beb_31_25.config_gen | 47 - examples/config_gen_script/config_gen | 71 - .../config_gen_script/eiger_2m_1gb.config_gen | 47 - examples/eiger_10Gb.config | 33 - examples/eiger_1Gb.config | 24 - examples/gotthard.config | 27 - examples/gotthard_setup.det | 32 - examples/jungfrau.config | 15 - examples/jungfrau_two.config | 25 - examples/mythen.config | 32 - examples/receiver.config | 1 - examples/scripts/.parab | 36 - examples/scripts/HeaderBeforeAfter.awk | 142 - examples/scripts/ScanScript.awk | 87 - examples/scripts/ScriptBeforeAfter.awk | 100 - examples/scripts/StartStopScript.awk | 79 - examples/scripts/slsReceiverScript | 23 - examples/scripts/xterms | 42 - examples/two_gotthard.config | 55 - examples/two_no_receiver.config | 64 - genVersionHeader.sh | 25 - recipe/build.sh | 15 - recipe/copy_gui.sh | 15 - recipe/copy_lib.sh | 23 - recipe/meta.yaml | 89 - serverBin/eigerDetectorServer_virtualMaster | 1 - serverBin/eigerDetectorServer_virtualSlave | 1 - serverBin/eigerDetectorServerv4.0.1.22.1 | 1 - serverBin/gotthardDetectorServer_virtual | 1 - serverBin/gotthardDetectorServerv4.0.1.4 | 1 - serverBin/jungfrauDetectorServer_virtual | 1 - serverBin/jungfrauDetectorServerv4.0.1.0 | 1 - serverBin/mythenDetectorServerv2.0.3 | 1 - .../eiger/highgain/calibration.snbeb045 | 1 - settingsdir/eiger/highgain/highgain.cal | 4 - settingsdir/eiger/highgain/highgain.trim | Bin 1048644 -> 0 bytes settingsdir/eiger/highgain/settings.snbeb045 | Bin 1048640 -> 0 bytes .../eiger/lowgain/calibration.snbeb045 | 1 - settingsdir/eiger/lowgain/lowgain.cal | 4 - settingsdir/eiger/lowgain/lowgain.trim | Bin 1048644 -> 0 bytes settingsdir/eiger/lowgain/settings.snbeb045 | Bin 1048640 -> 0 bytes settingsdir/eiger/standard/4500eV/noise.sn031 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/4500eV/noise.sn032 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/5400eV/noise.sn031 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/5400eV/noise.sn032 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/6400eV/noise.sn031 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/6400eV/noise.sn032 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/calibration.sn031 | 5 - settingsdir/eiger/standard/calibration.sn032 | 5 - settingsdir/eiger/standard/eigernoise.sn049 | Bin 1048648 -> 0 bytes settingsdir/eiger/standard/noise.sn031 | Bin 1048644 -> 0 bytes settingsdir/eiger/standard/noise.sn032 | Bin 1048644 -> 0 bytes settingsdir/eiger/standard/standard.cal | 4 - settingsdir/eiger/standard/standard.trim | Bin 1048644 -> 0 bytes .../eiger/veryhighgain/calibration.sn031 | 5 - .../eiger/veryhighgain/calibration.sn032 | 5 - settingsdir/eiger/veryhighgain/noise.sn031 | Bin 1048644 -> 0 bytes settingsdir/eiger/veryhighgain/noise.sn032 | Bin 1048644 -> 0 bytes .../eiger/veryhighgain/veryhighgain.cal | 4 - .../eiger/veryhighgain/veryhighgain.trim | Bin 1048644 -> 0 bytes .../eiger/verylowgain/calibration.sn031 | 5 - .../eiger/verylowgain/calibration.sn032 | 5 - settingsdir/eiger/verylowgain/noise.sn031 | Bin 1048644 -> 0 bytes settingsdir/eiger/verylowgain/noise.sn032 | Bin 1048644 -> 0 bytes settingsdir/eiger/verylowgain/verylowgain.cal | 4 - .../eiger/verylowgain/verylowgain.trim | Bin 1048644 -> 0 bytes settingsdir/mythen/fast/calibration.snxxx | 1 - settingsdir/mythen/fast/fast.cal | 1 - settingsdir/mythen/fast/fast.trim | 1296 --- settingsdir/mythen/fast/noise.snxxx | 1296 --- settingsdir/mythen/highgain/calibration.snxxx | 1 - settingsdir/mythen/highgain/highgain.cal | 1 - settingsdir/mythen/highgain/highgain.trim | 1296 --- settingsdir/mythen/highgain/noise.snxxx | 1296 --- settingsdir/mythen/standard/calibration.snxxx | 1 - settingsdir/mythen/standard/noise.snxxx | 1296 --- settingsdir/mythen/standard/standard.cal | 1 - settingsdir/mythen/standard/standard.trim | 1296 --- slsDetectorCalibration/.gitignore | 2 - slsDetectorCalibration/MovingStat.h | 156 - slsDetectorCalibration/RunningStat.h | 55 - slsDetectorCalibration/analogDetector.h | 1109 -- .../commonModeSubtraction.h | 82 - .../dataStructures/Mythen3_01_jctbData.h | 123 - .../dataStructures/Mythen3_02_jctbData.h | 127 - .../dataStructures/adcSar2_jctbData.h | 63 - .../dataStructures/chiptestBoardData.h | 89 - .../dataStructures/eigerHalfModuleData.h | 470 - .../gotthardDoubleModuleDataNew.h | 172 - .../dataStructures/gotthardModuleData.h | 148 - .../dataStructures/gotthardModuleDataNew.h | 170 - .../dataStructures/gotthardShortModuleData.h | 127 - .../dataStructures/jungfrau02Data.h | 156 - .../dataStructures/jungfrau10ModuleData.h | 155 - .../dataStructures/moench02Ctb10GbData.h | 246 - .../dataStructures/moench02CtbData.h | 169 - .../dataStructures/moench02ModuleData.h | 137 - .../dataStructures/moench03Ctb10GbData.h | 285 - .../dataStructures/moench03Ctb10GbT1Data.h | 284 - .../dataStructures/moench03CtbData.h | 157 - .../dataStructures/moench03T1CtbData.h | 158 - .../dataStructures/moench03T1ReceiverData.h | 285 - .../moench03T1ReceiverDataNew.h | 285 - .../dataStructures/moench03T1ZmqData.h | 268 - .../dataStructures/moench03T1ZmqDataNew.h | 268 - .../dataStructures/moench03TCtb10GbData.h | 285 - .../dataStructures/moench03TCtbData.h | 180 - slsDetectorCalibration/doxy.config | 85 - slsDetectorCalibration/energyCalibration.cpp | 534 - slsDetectorCalibration/energyCalibration.h | 462 - ...hardDoubleModuleCommonModeSubtractionNew.h | 30 - .../gotthardExecutables/Makefile.onTheFly | 22 - .../gotthard25umZmqAnalysis.C | 517 - .../interpolatingDetector.h | 653 -- .../interpolations/.__afs3A48 | Bin 48795 -> 0 bytes .../interpolations/eta2InterpolationBase.h | 436 - .../interpolations/eta3InterpolationBase.h | 294 - .../etaInterpolationAdaptiveBins.h | 281 - .../interpolations/etaInterpolationBase.h | 270 - .../interpolations/etaInterpolationGlobal.h | 85 - .../interpolations/etaInterpolationPosXY.h | 173 - .../etaInterpolationRandomBins.h | 417 - .../interpolations/etaVEL/EVELAlg.C | 678 -- .../interpolations/etaVEL/EtaVEL.cpp | 679 -- .../interpolations/etaVEL/EtaVEL.h | 164 - .../interpolations/etaVEL/EtaVELTr.py | 393 - .../etaVEL/etaVELInterpolation.cpp | 134 - .../etaVEL/etaVELInterpolation.h | 55 - .../interpolations/linearInterpolation.h | 234 - .../interpolations/noInterpolation.h | 104 - .../interpolations/slsInterpolation.h | 534 - slsDetectorCalibration/moench03CommonMode.h | 45 - slsDetectorCalibration/moenchCommonMode.h | 45 - .../moenchExecutables/Makefile.cluster_finder | 39 - .../moenchExecutables/Makefile.moench | 20 - .../moenchExecutables/Makefile.moench_eta | 23 - .../moenchExecutables/Makefile.moench_zmq | 28 - .../moenchExecutables/Makefile.phoenix | 24 - .../moenchExecutables/Makefile.reoder_image | 22 - .../moenchExecutables/Makefile.tiff_to_th2f | 27 - .../moench03ClusterFinder.cpp | 206 - .../moench03ClusterFinderPhoenix.cpp | 201 - .../moench03Interpolation.cpp | 322 - .../moenchExecutables/moench03MakeEta.cpp | 114 - .../moench03NoInterpolation.cpp | 171 - .../moench03ReorderImage.cpp | 163 - .../moenchExecutables/moenchZmqAnalog.cpp | 394 - .../moenchZmqClusterFinder.cpp | 201 - .../moenchZmqInterpolating.cpp | 292 - .../moenchExecutables/tiff_to_th2f.cpp | 57 - .../multiThreadedAnalogDetector.h | 574 - slsDetectorCalibration/pedestalSubtraction.h | 63 - slsDetectorCalibration/singlePhotonDetector.h | 685 -- slsDetectorCalibration/single_photon_hit.h | 94 - .../single_photon_hit_double.h | 98 - .../single_photon_hit_old.h | 93 - .../slsDetectorCalibration.doxy | 103 - slsDetectorCalibration/slsDetectorData.h | 340 - slsDetectorCalibration/slsReceiverData.h | 238 - slsDetectorCalibration/tiffIO.cpp | 77 - slsDetectorCalibration/tiffIO.h | 36 - slsDetectorGui/.gitignore | 6 - slsDetectorGui/CMakeLists.txt | 133 - slsDetectorGui/Makefile | 68 - slsDetectorGui/client/Makefile | 31 - slsDetectorGui/client/qClient.cpp | 237 - slsDetectorGui/client/qClient.h | 65 - slsDetectorGui/doxy.config | 106 - slsDetectorGui/forms/form_action.ui | 169 - slsDetectorGui/forms/form_detectormain.ui | 521 - slsDetectorGui/forms/form_scan.ui | 488 - slsDetectorGui/forms/form_tab_advanced.ui | 2109 ---- slsDetectorGui/forms/form_tab_dataoutput.ui | 897 -- slsDetectorGui/forms/form_tab_debugging.ui | 471 - slsDetectorGui/forms/form_tab_measurement.ui | 1084 -- slsDetectorGui/forms/form_tab_messages.ui | 82 - slsDetectorGui/forms/form_tab_plot.ui | 3028 ----- slsDetectorGui/forms/form_tab_settings.ui | 248 - slsDetectorGui/gitInfo.txt | 9 - slsDetectorGui/images/add.png | Bin 702 -> 0 bytes slsDetectorGui/images/browse.png | Bin 884 -> 0 bytes slsDetectorGui/images/calculate.png | Bin 833 -> 0 bytes slsDetectorGui/images/close.png | Bin 812 -> 0 bytes slsDetectorGui/images/download.png | Bin 757 -> 0 bytes slsDetectorGui/images/erase.png | Bin 606 -> 0 bytes slsDetectorGui/images/leftArrow.png | Bin 575 -> 0 bytes slsDetectorGui/images/mountain.png | Bin 757 -> 0 bytes slsDetectorGui/images/new.png | Bin 644 -> 0 bytes slsDetectorGui/images/refresh.png | Bin 1066 -> 0 bytes slsDetectorGui/images/refresher.png | Bin 692 -> 0 bytes slsDetectorGui/images/remove.png | Bin 359 -> 0 bytes slsDetectorGui/images/rightArrow.png | Bin 556 -> 0 bytes slsDetectorGui/images/save.png | Bin 674 -> 0 bytes slsDetectorGui/images/saveAll.png | Bin 755 -> 0 bytes slsDetectorGui/images/setup.png | Bin 605 -> 0 bytes slsDetectorGui/images/start.png | Bin 499 -> 0 bytes slsDetectorGui/images/stop.png | Bin 519 -> 0 bytes slsDetectorGui/images/upload.png | Bin 721 -> 0 bytes slsDetectorGui/include/gitInfoGui.h | 6 - slsDetectorGui/include/gitInfoGuiTmp.h | 6 - slsDetectorGui/include/icons.qrc | 22 - slsDetectorGui/include/qActionsWidget.h | 85 - slsDetectorGui/include/qCloneWidget.h | 164 - slsDetectorGui/include/qDebugStream.h | 119 - slsDetectorGui/include/qDefs.h | 301 - slsDetectorGui/include/qDetectorMain.h | 202 - slsDetectorGui/include/qDrawPlot.h | 624 -- slsDetectorGui/include/qScanWidget.h | 193 - slsDetectorGui/include/qServer.h | 137 - slsDetectorGui/include/qTabActions.h | 150 - slsDetectorGui/include/qTabAdvanced.h | 266 - slsDetectorGui/include/qTabDataOutput.h | 156 - slsDetectorGui/include/qTabDebugging.h | 103 - slsDetectorGui/include/qTabDeveloper.h | 158 - slsDetectorGui/include/qTabMeasurement.h | 207 - slsDetectorGui/include/qTabMessages.h | 86 - slsDetectorGui/include/qTabPlot.h | 188 - slsDetectorGui/include/qTabSettings.h | 116 - slsDetectorGui/slsDetectorGui.pro | 162 - .../slsDetectorPlotting/include/SlsQt1DPlot.h | 173 - .../include/SlsQt1DZoomer.h | 81 - .../slsDetectorPlotting/include/SlsQt2DHist.h | 145 - .../slsDetectorPlotting/include/SlsQt2DPlot.h | 118 - .../include/SlsQt2DPlotLayout.h | 82 - .../include/SlsQt2DZoomer.h | 78 - .../include/SlsQtNumberEntry.h | 147 - .../include/SlsQtValidators.h | 79 - .../slsDetectorPlotting/src/SlsQt1DPlot.cxx | 517 - .../slsDetectorPlotting/src/SlsQt1DZoomer.cxx | 109 - .../slsDetectorPlotting/src/SlsQt2DHist.cxx | 143 - .../slsDetectorPlotting/src/SlsQt2DPlot.cxx | 390 - .../src/SlsQt2DPlotLayout.cxx | 239 - .../src/SlsQtNumberEntry.cxx | 506 - slsDetectorGui/src/qActionsWidget.cpp | 219 - slsDetectorGui/src/qCloneWidget.cpp | 359 - slsDetectorGui/src/qDetectorMain.cpp | 908 -- slsDetectorGui/src/qDrawPlot.cpp | 2275 ---- slsDetectorGui/src/qScanWidget.cpp | 1247 --- slsDetectorGui/src/qServer.cpp | 431 - slsDetectorGui/src/qTabActions.cpp | 585 - slsDetectorGui/src/qTabAdvanced.cpp | 1631 --- slsDetectorGui/src/qTabDataOutput.cpp | 1102 -- slsDetectorGui/src/qTabDebugging.cpp | 619 -- slsDetectorGui/src/qTabDeveloper.cpp | 631 -- slsDetectorGui/src/qTabMeasurement.cpp | 926 -- slsDetectorGui/src/qTabMessages.cpp | 122 - slsDetectorGui/src/qTabPlot.cpp | 1542 --- slsDetectorGui/src/qTabSettings.cpp | 385 - slsDetectorGui/updateGitVersion.sh | 26 - slsDetectorSoftware/.gitignore | 4 - slsDetectorSoftware/CMakeLists.txt | 98 - slsDetectorSoftware/Makefile | 82 - slsDetectorSoftware/Makefile.Standalone | 68 - slsDetectorSoftware/Makefile.x04sa | 87 - slsDetectorSoftware/README | 19 - .../commonFiles/communication_funcs.c | 676 -- .../commonFiles/communication_funcs.h | 51 - slsDetectorSoftware/commonFiles/error_defs.h | 351 - .../commonFiles/sls_detector_defs.h | 599 - .../commonFiles/sls_detector_funcs.h | 136 - slsDetectorSoftware/commonFiles/versionAPI.h | 5 - slsDetectorSoftware/doxy.config | 162 - .../eigerDetectorServer/9mhvserial_bf.c | 210 - slsDetectorSoftware/eigerDetectorServer/Beb.c | 1346 --- slsDetectorSoftware/eigerDetectorServer/Beb.h | 103 - slsDetectorSoftware/eigerDetectorServer/Feb.c | 335 - slsDetectorSoftware/eigerDetectorServer/Feb.h | 59 - .../eigerDetectorServer/FebControl.c | 2072 ---- .../eigerDetectorServer/FebControl.h | 210 - .../eigerDetectorServer/FebInterface.c | 210 - .../eigerDetectorServer/FebInterface.h | 43 - .../eigerDetectorServer/FebRegisterDefs.h | 227 - .../eigerDetectorServer/HardwareIO.c | 87 - .../eigerDetectorServer/HardwareIO.h | 26 - .../HardwareMMappingDefs.h | 62 - .../eigerDetectorServer/LocalLinkInterface.c | 260 - .../eigerDetectorServer/LocalLinkInterface.h | 54 - .../eigerDetectorServer/Makefile | 38 - .../eigerDetectorServer/Makefile.virtual | 28 - .../eigerDetectorServer/ansi.h | 1 - .../bin/eigerDetectorServer_virtualMaster | Bin 94392 -> 0 bytes .../bin/eigerDetectorServer_virtualSlave | Bin 94392 -> 0 bytes .../bin/eigerDetectorServerv4.0.1.22.1 | Bin 306422 -> 0 bytes .../bin/hv9m_blackfin_serverv3.0.0.1 | Bin 30728 -> 0 bytes .../eigerDetectorServer/communication_funcs.c | 1 - .../eigerDetectorServer/communication_funcs.h | 1 - .../eigerDetectorServer/gitInfo.txt | 9 - .../eigerDetectorServer/gitInfoEiger.h | 6 - .../eigerDetectorServer/gitInfoEigerTmp.h | 6 - .../eigerDetectorServer/renameServer.sh | 4 - .../slsDetectorFunctionList.c | 1866 ---- .../slsDetectorFunctionList.h | 1 - .../eigerDetectorServer/slsDetectorServer.c | 1 - .../slsDetectorServer_defs.h | 100 - .../slsDetectorServer_funcs.c | 1 - .../slsDetectorServer_funcs.h | 1 - .../eigerDetectorServer/sls_detector_defs.h | 1 - .../eigerDetectorServer/sls_detector_funcs.h | 1 - .../eigerDetectorServer/sls_receiver_defs.h | 1 - .../eigerDetectorServer/sls_receiver_funcs.h | 1 - .../eigerDetectorServer/updateAPIVersion.sh | 7 - .../eigerDetectorServer/updateGitVersion.sh | 32 - .../eigerDetectorServer/versionAPI.h | 1 - .../eigerDetectorServer/xfs_types.h | 52 - .../eigerDetectorServer/xparameters.h | 538 - .../f90Interface/externPostProcessing.cpp | 47 - .../f90Interface/externPostProcessing.h | 58 - .../f90Interface/sls_detector_analysis_f.f90 | 174 - slsDetectorSoftware/gitInfo.txt | 9 - .../gotthardDetectorServer/.target-makefrag | 1 - .../gotthardDetectorServer/AD9257.h | 1 - .../gotthardDetectorServer/Makefile | 51 - .../gotthardDetectorServer/Makefile.propix | 49 - .../gotthardDetectorServer/Makefile.virtual | 30 - .../gotthardDetectorServer/ansi.h | 1 - .../commonServerFunctions.h | 1 - .../communication_funcs.c | 1 - .../communication_funcs.h | 1 - .../gotthardDetectorServer/config.txt | 23 - .../gotthardDetectorServer/firmware_funcs.c | 1975 ---- .../gotthardDetectorServer/firmware_funcs.h | 179 - .../gotthardDetectorServer/gitInfo.txt | 9 - .../gotthardDetectorServer/gitInfoGotthard.h | 6 - .../gitInfoGotthardTmp.h | 6 - .../gotthardDetectorServer_virtual | Bin 104160 -> 0 bytes .../gotthardDetectorServerv4.0.1.4 | Bin 117808 -> 0 bytes .../gotthardDetectorServer/mcb_funcs.c | 2340 ---- .../gotthardDetectorServer/mcb_funcs.h | 183 - .../gotthardDetectorServer/registers_g.h | 315 - .../gotthardDetectorServer/server.c | 103 - .../gotthardDetectorServer/server_defs.h | 60 - .../gotthardDetectorServer/server_funcs.c | 3153 ------ .../gotthardDetectorServer/server_funcs.h | 99 - .../sls_detector_defs.h | 1 - .../sls_detector_funcs.h | 1 - .../sls_receiver_defs.h | 1 - .../sls_receiver_funcs.h | 1 - .../gotthardDetectorServer/stop_server.c | 46 - .../updateAPIVersion.sh | 7 - .../updateGitVersion.sh | 30 - .../gotthardDetectorServer/versionAPI.h | 1 - slsDetectorSoftware/include/detectorData.h | 1 - .../include/slsDetectorUsers.h | 1 - .../include/slsReceiverUsers.h | 1 - .../jctbDetectorServer/AD9257.h | 141 - .../jctbDetectorServer/Makefile | 59 - slsDetectorSoftware/jctbDetectorServer/ansi.h | 1 - .../jctbDetectorServer/bf_init.sh | 1 - .../jctbDetectorServer/blackfin.c | 150 - .../jctbDetectorServer/blackfin.h | 25 - .../commonServerFunctions.h | 73 - .../jctbDetectorServer/communication_funcs.c | 1 - .../jctbDetectorServer/communication_funcs.h | 1 - .../jctbDetectorServer/convert_pof_to_raw.c | 58 - .../jctbDetectorServer/firmware_funcs.c | 4072 ------- .../jctbDetectorServer/firmware_funcs.h | 239 - .../jctbDetectorServer/get_server.sh | 12 - .../jctbDetectorServer/gitInfo.txt | 9 - .../jctbDetectorServer/gitInfoMoench.h | 6 - .../jctbDetectorServer/gitInfoMoenchTmp.h | 6 - .../jctbDetectorServer_developer | Bin 118204 -> 0 bytes .../jctbDetectorServer/mcb_funcs.c | 2696 ----- .../jctbDetectorServer/mcb_funcs.h | 174 - .../jctbDetectorServer/program_fpga.sh | 30 - .../jctbDetectorServer/registers_m.h | 551 - .../jctbDetectorServer/server.c | 139 - .../jctbDetectorServer/server_defs.h | 62 - .../jctbDetectorServer/server_funcs.c | 3725 ------- .../jctbDetectorServer/server_funcs.h | 102 - .../jctbDetectorServer/sharedmemory.c | 39 - .../jctbDetectorServer/sharedmemory.h | 48 - .../jctbDetectorServer/slow_adc.c | 245 - .../jctbDetectorServer/slow_adc.h | 10 - .../jctbDetectorServer/sls_detector_defs.h | 1 - .../jctbDetectorServer/sls_detector_funcs.h | 1 - .../jctbDetectorServer/sls_receiver_defs.h | 1 - .../jctbDetectorServer/sls_receiver_funcs.h | 1 - .../jctbDetectorServer/stop_server.c | 46 - .../jctbDetectorServer/updateGitVersion.sh | 31 - .../jungfrauDetectorServer/AD9257.h | 1 - .../jungfrauDetectorServer/Makefile | 31 - .../jungfrauDetectorServer/Makefile.virtual | 27 - .../jungfrauDetectorServer/RegisterDefs.h | 428 - .../jungfrauDetectorServer/ansi.h | 1 - .../bin/jungfrauDetectorServer_virtual | Bin 97960 -> 0 bytes .../bin/jungfrauDetectorServerv4.0.1.0 | Bin 116720 -> 0 bytes .../jungfrauDetectorServer/blackfin.h | 1 - .../commonServerFunctions.h | 1 - .../communication_funcs.c | 1 - .../communication_funcs.h | 1 - .../jungfrauDetectorServer/gitInfo.txt | 9 - .../jungfrauDetectorServer/gitInfoJungfrau.h | 6 - .../gitInfoJungfrauTmp.h | 6 - .../jungfrauDetectorServer/programfpga.h | 1 - .../slsDetectorFunctionList.c | 1762 --- .../slsDetectorFunctionList.h | 1 - .../slsDetectorServer.c | 1 - .../slsDetectorServer_defs.h | 176 - .../slsDetectorServer_funcs.c | 1 - .../slsDetectorServer_funcs.h | 1 - .../sls_detector_defs.h | 1 - .../sls_detector_funcs.h | 1 - .../sls_receiver_defs.h | 1 - .../sls_receiver_funcs.h | 1 - .../updateAPIVersion.sh | 7 - .../updateGitVersion.sh | 31 - .../jungfrauDetectorServer/versionAPI.h | 1 - .../moenchDetectorServer/.target-makefrag | 1 - .../moenchDetectorServer/Makefile | 51 - .../moenchDetectorServer/Makefile.virtual | 30 - .../moenchDetectorServer/ansi.h | 1 - .../communication_funcs.c | 1 - .../communication_funcs.h | 1 - .../moenchDetectorServer/firmware_funcs.c | 2613 ----- .../moenchDetectorServer/firmware_funcs.h | 179 - .../moenchDetectorServer/gitInfo.txt | 9 - .../moenchDetectorServer/gitInfoMoench.h | 6 - .../moenchDetectorServer/gitInfoMoenchTmp.h | 6 - .../moenchDetectorServer/mcb_funcs.c | 2528 ----- .../moenchDetectorServer/mcb_funcs.h | 173 - .../moenchDetectorServer/moenchVirtualServer | Bin 107120 -> 0 bytes .../moenchDetectorServer/registers_m.h | 309 - .../moenchDetectorServer/server.c | 112 - .../moenchDetectorServer/server_defs.h | 61 - .../moenchDetectorServer/server_funcs.c | 3083 ------ .../moenchDetectorServer/server_funcs.h | 97 - .../moenchDetectorServer/sharedmemory.c | 39 - .../moenchDetectorServer/sharedmemory.h | 48 - .../moenchDetectorServer/sls_detector_defs.h | 1 - .../moenchDetectorServer/sls_detector_funcs.h | 1 - .../moenchDetectorServer/sls_receiver_defs.h | 1 - .../moenchDetectorServer/sls_receiver_funcs.h | 1 - .../moenchDetectorServer/stop_server.c | 46 - .../moenchDetectorServer/trimming_funcs.c | 749 -- .../moenchDetectorServer/trimming_funcs.h | 20 - .../moenchDetectorServer/updateGitVersion.sh | 31 - .../multiSlsDetector/multiSlsDetector.cpp | 5428 --------- .../multiSlsDetector/multiSlsDetector.h | 1944 ---- .../multiSlsDetector/multiSlsDetectorClient.h | 162 - .../multiSlsDetectorCommand.h | 72 - .../mythen3DetectorServer/AD9257.h | 1 - .../mythen3DetectorServer/Makefile | 33 - .../mythen3DetectorServer/Makefile.virtual | 25 - .../mythen3DetectorServer/RegisterDefs.h | 101 - .../mythen3DetectorServer/ansi.h | 1 - .../mythen3DetectorServer/blackfin.h | 1 - .../commonServerFunctions.h | 1 - .../communication_funcs.c | 1 - .../communication_funcs.h | 1 - .../mythen3DetectorServer/gitInfo.txt | 9 - .../mythen3DetectorServer/gitInfoMythen3.h | 6 - .../mythen3DetectorServer/gitInfoMythen3Tmp.h | 6 - .../mythen3DetectorServer/mythen3Server | Bin 92440 -> 0 bytes .../mythen3DetectorServer/mythen3Server.gdb | Bin 435662 -> 0 bytes .../mythen3DetectorServer/programfpga.h | 1 - .../slsDetectorFunctionList.c | 1304 --- .../slsDetectorFunctionList.h | 1 - .../mythen3DetectorServer/slsDetectorServer.c | 1 - .../slsDetectorServer_defs.h | 167 - .../slsDetectorServer_funcs.c | 1 - .../slsDetectorServer_funcs.h | 1 - .../mythen3DetectorServer/sls_detector_defs.h | 1 - .../sls_detector_funcs.h | 1 - .../mythen3DetectorServer/sls_receiver_defs.h | 1 - .../sls_receiver_funcs.h | 1 - .../mythen3DetectorServer/updateGitVersion.sh | 31 - .../mythenDetectorServer/.target-makefrag | 1 - .../mythenDetectorServer/Makefile | 46 - .../mythenDetectorServer/Makefile.dum | 40 - .../mythenDetectorServer/Makefile.picasso | 49 - .../mythenDetectorServer/Makefile.virtual | 18 - .../mythenDetectorServer/ansi.h | 1 - .../communication_funcs.c | 1 - .../communication_funcs.h | 1 - .../mythenDetectorServer/firmware_funcs.c | 1765 --- .../mythenDetectorServer/firmware_funcs.h | 153 - .../mythenDetectorServer/gitInfo.txt | 9 - .../mythenDetectorServer/gitInfoMythen.h | 6 - .../mythenDetectorServer/gitInfoMythenTmp.h | 6 - .../mythenDetectorServer/mcb_funcs.c | 2716 ----- .../mythenDetectorServer/mcb_funcs.h | 157 - .../mythenDetectorServer/mythenDetectorServer | Bin 390567 -> 0 bytes .../mythenDetectorServerv2.0.3 | Bin 384078 -> 0 bytes .../mythenDetectorServer/mythenVirtualServer | Bin 103905 -> 0 bytes .../mythenDetectorServer/picasso_defs.h | 42 - .../mythenDetectorServer/registers.h | 184 - .../mythenDetectorServer/server.c | 91 - .../mythenDetectorServer/server_defs.h | 43 - .../mythenDetectorServer/server_funcs.c | 2857 ----- .../mythenDetectorServer/server_funcs.h | 79 - .../mythenDetectorServer/sharedmemory.c | 46 - .../mythenDetectorServer/sharedmemory.h | 52 - .../mythenDetectorServer/sls_detector_defs.h | 1 - .../mythenDetectorServer/sls_detector_funcs.h | 1 - .../mythenDetectorServer/sls_receiver_defs.h | 1 - .../mythenDetectorServer/sls_receiver_funcs.h | 1 - .../mythenDetectorServer/stop_server.c | 41 - .../mythenDetectorServer/trimming_funcs.c | 789 -- .../mythenDetectorServer/trimming_funcs.h | 17 - .../mythenDetectorServer/updateGitVersion.sh | 31 - .../patternGenerator/generate.sh | 30 - .../patternGenerator/generator.c | 162 - slsDetectorSoftware/patternGenerator/test.p | 201 - .../sharedMemory/SharedMemory.cpp | 174 - .../sharedMemory/SharedMemory.h | 105 - slsDetectorSoftware/slsADCReader/Makefile | 21 - slsDetectorSoftware/slsADCReader/slsADCReader | Bin 20662 -> 0 bytes .../slsADCReader/slsADCReader.cpp | 120 - slsDetectorSoftware/slsDetector/gitInfoLib.h | 6 - .../slsDetector/gitInfoLibTmp.h | 6 - slsDetectorSoftware/slsDetector/remove_shm.sh | 10 - .../slsDetector/slsDetector.cpp | 9759 ----------------- slsDetectorSoftware/slsDetector/slsDetector.h | 2495 ----- .../slsDetector/slsDetectorActions.cpp | 505 - .../slsDetector/slsDetectorActions.h | 284 - .../slsDetector/slsDetectorBase.h | 958 -- .../slsDetector/slsDetectorCommand.cpp | 7105 ------------ .../slsDetector/slsDetectorCommand.h | 187 - .../slsDetector/slsDetectorUsers.cpp | 523 - .../slsDetector/slsDetectorUsers.h | 935 -- .../slsDetector/slsDetectorUtils.cpp | 950 -- .../slsDetector/slsDetectorUtils.h | 1065 -- .../AngularConversion_Standalone.cpp | 527 - .../AngularConversion_Standalone.h | 490 - .../slsDetectorAnalysis/FileIO_Standalone.cpp | 650 -- .../slsDetectorAnalysis/FileIO_Standalone.h | 410 - .../slsDetectorAnalysis/Makefile | 87 - .../slsDetectorAnalysis/Makefile.arch | 575 - .../slsDetectorAnalysis/TSlsDetectorDict.cpp | 691 -- .../slsDetectorAnalysis/TSlsDetectorDict.h | 42 - .../slsDetectorAnalysis/angCalLogClass.h | 153 - .../angleConversionConstant.h | 42 - .../angularCalibration.cpp | 471 - .../slsDetectorAnalysis/angularCalibration.h | 154 - .../slsDetectorAnalysis/angularConversion.cpp | 308 - .../slsDetectorAnalysis/angularConversion.h | 406 - .../angularConversionStatic.cpp | 461 - .../angularConversionStatic.h | 184 - .../badChannelCorrections.h | 69 - .../slsDetectorAnalysis/detectorData.h | 56 - .../docs/html/annotated.html | 28 - .../html/classenergyCalibration-members.html | 55 - .../docs/html/classenergyCalibration.html | 1026 -- ...assenergyCalibrationFunctions-members.html | 38 - .../html/classenergyCalibrationFunctions.html | 428 - .../docs/html/classes.html | 69 - .../slsDetectorAnalysis/docs/html/doxygen.css | 358 - .../slsDetectorAnalysis/docs/html/doxygen.png | Bin 1281 -> 0 bytes .../html/energyCalibration_8h-source.html | 164 - .../docs/html/energyCalibration_8h.html | 76 - .../html/energyCalibration_8h_source.html | 190 - .../slsDetectorAnalysis/docs/html/files.html | 27 - .../docs/html/functions.html | 126 - .../docs/html/functions_func.html | 63 - .../docs/html/functions_vars.html | 49 - .../docs/html/globals.html | 36 - .../docs/html/globals_vars.html | 36 - .../slsDetectorAnalysis/docs/html/index.html | 25 - .../slsDetectorAnalysis/docs/html/installdox | 117 - .../docs/html/namespaces.html | 22 - .../docs/html/namespacestd.html | 24 - .../docs/html/search/all_61.html | 25 - .../docs/html/search/all_62.html | 31 - .../docs/html/search/all_63.html | 37 - .../docs/html/search/all_65.html | 66 - .../docs/html/search/all_66.html | 55 - .../docs/html/search/all_67.html | 37 - .../docs/html/search/all_6b.html | 25 - .../docs/html/search/all_6c.html | 25 - .../docs/html/search/all_6d.html | 25 - .../docs/html/search/all_6e.html | 25 - .../docs/html/search/all_70.html | 25 - .../docs/html/search/all_71.html | 25 - .../docs/html/search/all_73.html | 70 - .../docs/html/search/all_7e.html | 25 - .../docs/html/search/classes_65.html | 29 - .../docs/html/search/close.png | Bin 273 -> 0 bytes .../docs/html/search/files_65.html | 24 - .../docs/html/search/functions_63.html | 25 - .../docs/html/search/functions_65.html | 49 - .../docs/html/search/functions_66.html | 25 - .../docs/html/search/functions_67.html | 37 - .../docs/html/search/functions_6b.html | 25 - .../docs/html/search/functions_6c.html | 25 - .../docs/html/search/functions_6d.html | 25 - .../docs/html/search/functions_71.html | 25 - .../docs/html/search/functions_73.html | 64 - .../docs/html/search/functions_7e.html | 25 - .../docs/html/search/nomatches.html | 11 - .../docs/html/search/search.css | 198 - .../docs/html/search/search.js | 734 -- .../docs/html/search/search.png | Bin 527 -> 0 bytes .../docs/html/search/variables_61.html | 25 - .../docs/html/search/variables_62.html | 31 - .../docs/html/search/variables_63.html | 31 - .../docs/html/search/variables_65.html | 25 - .../docs/html/search/variables_66.html | 49 - .../docs/html/search/variables_6e.html | 25 - .../docs/html/search/variables_70.html | 25 - .../docs/html/search/variables_73.html | 25 - .../slsDetectorAnalysis/docs/html/tab_b.gif | Bin 35 -> 0 bytes .../slsDetectorAnalysis/docs/html/tab_l.gif | Bin 706 -> 0 bytes .../slsDetectorAnalysis/docs/html/tab_r.gif | Bin 2585 -> 0 bytes .../slsDetectorAnalysis/docs/html/tabs.css | 102 - .../docs/latex/FreeSans.ttf | Bin 22932 -> 0 bytes .../slsDetectorAnalysis/docs/latex/Makefile | 39 - .../docs/latex/annotated.tex | 5 - .../docs/latex/classenergyCalibration.tex | 337 - .../latex/classenergyCalibrationFunctions.tex | 135 - .../docs/latex/doxygen.sty | 78 - .../docs/latex/energyCalibration_8h.tex | 37 - .../slsDetectorAnalysis/docs/latex/files.tex | 4 - .../slsDetectorAnalysis/docs/latex/index.tex | 3 - .../docs/latex/namespaces.tex | 4 - .../docs/latex/namespacestd.tex | 4 - .../slsDetectorAnalysis/docs/latex/refman.tex | 46 - .../slsDetectorAnalysis/doxy.config | 65 - .../slsDetectorAnalysis/enCalLogClass.h | 133 - .../slsDetectorAnalysis/energyCalibration.cpp | 464 - .../slsDetectorAnalysis/energyCalibration.h | 400 - .../energyCalibrationMacro.C | 24 - .../slsDetectorAnalysis/energyConversion.cpp | 614 -- .../slsDetectorAnalysis/energyConversion.h | 147 - .../slsDetectorAnalysis/fileIO.cpp | 204 - .../slsDetectorAnalysis/fileIO.h | 420 - .../slsDetectorAnalysis/fileIOStatic.h | 730 -- .../slsDetectorAnalysis/movingStat.h | 147 - .../slsDetectorAnalysis/postProcessing.cpp | 901 -- .../slsDetectorAnalysis/postProcessing.h | 385 - .../postProcessingFileIO_Standalone.cpp | 602 - .../postProcessingFileIO_Standalone.h | 391 - .../postProcessingFuncs.cpp | 566 - .../slsDetectorAnalysis/postProcessingFuncs.h | 80 - .../postProcessing_Standalone.cpp | 593 - .../postProcessing_Standalone.h | 367 - .../slsDetectorAnalysis/runningStat.h | 92 - .../singlePhotonFilter.cpp | 678 -- .../slsDetectorAnalysis/singlePhotonFilter.h | 419 - .../slsDetectorAnalysis/single_photon_hit.h | 44 - .../slsDetectorClient/CMakeLists.txt | 71 - .../slsDetectorClient/Makefile | 111 - .../slsDetectorClient/Makefile.x04sa | 54 - .../slsDetectorClient/sls_detector_client.cpp | 46 - .../slsDetectorServer/AD9257.h | 141 - .../slsDetectorServer/Makefile | 26 - .../slsDetectorServer/blackfin.h | 162 - .../slsDetectorServer/commonServerFunctions.h | 73 - .../slsDetectorServer/communication_funcs.c | 1 - .../slsDetectorServer/communication_funcs.h | 1 - .../slsDetectorServer/programfpga.h | 190 - .../slsDetectorFunctionList.c | 838 -- .../slsDetectorFunctionList.h | 292 - .../slsDetectorServer/slsDetectorServer.c | 138 - .../slsDetectorServer_defs.h | 31 - .../slsDetectorServer_funcs.c | 5928 ---------- .../slsDetectorServer_funcs.h | 101 - .../slsDetector_stopServer.c | 46 - .../slsDetectorServer/sls_detector_defs.h | 1 - .../slsDetectorServer/sls_detector_funcs.h | 1 - .../receiverInterface.cpp | 217 - .../slsReceiverInterface/receiverInterface.h | 154 - slsDetectorSoftware/threadFiles/CondVar.cpp | 17 - slsDetectorSoftware/threadFiles/CondVar.h | 23 - slsDetectorSoftware/threadFiles/Global.h | 6 - slsDetectorSoftware/threadFiles/Makefile | 21 - slsDetectorSoftware/threadFiles/Multi.cpp | 197 - slsDetectorSoftware/threadFiles/Multi.h | 35 - slsDetectorSoftware/threadFiles/Mutex.cpp | 26 - slsDetectorSoftware/threadFiles/Mutex.h | 27 - slsDetectorSoftware/threadFiles/Single.cpp | 37 - slsDetectorSoftware/threadFiles/Single.h | 24 - slsDetectorSoftware/threadFiles/Task.h | 221 - .../threadFiles/ThreadPool.cpp | 191 - slsDetectorSoftware/threadFiles/ThreadPool.h | 51 - .../threadFiles/bin/examplethreadpool_test | Bin 237980 -> 0 bytes .../threadFiles/threadpool_test.cpp | 61 - slsDetectorSoftware/updateGitVersion.sh | 28 - .../usersFunctions/angleFunction.h | 26 - .../usersFunctions/usersFunctions.cpp | 347 - .../usersFunctions/usersFunctions.h | 49 - slsReceiverSoftware/.gitignore | 8 - slsReceiverSoftware/CMakeLists.txt | 100 - slsReceiverSoftware/Makefile | 126 - slsReceiverSoftware/gitInfo.txt | 9 - slsReceiverSoftware/include/BinaryFile.h | 120 - .../include/BinaryFileStatic.h | 222 - slsReceiverSoftware/include/DataProcessor.h | 400 - slsReceiverSoftware/include/DataStreamer.h | 211 - slsReceiverSoftware/include/Fifo.h | 111 - slsReceiverSoftware/include/File.h | 217 - slsReceiverSoftware/include/GeneralData.h | 675 -- slsReceiverSoftware/include/HDF5File.h | 199 - slsReceiverSoftware/include/HDF5FileStatic.h | 992 -- slsReceiverSoftware/include/Listener.h | 321 - slsReceiverSoftware/include/MySocketTCP.h | 67 - slsReceiverSoftware/include/ThreadObject.h | 109 - .../include/UDPBaseImplementation.h | 859 -- slsReceiverSoftware/include/UDPInterface.h | 801 -- .../include/UDPStandardImplementation.h | 282 - slsReceiverSoftware/include/ZmqSocket.h | 592 - slsReceiverSoftware/include/ansi.h | 66 - slsReceiverSoftware/include/circularFifo.h | 156 - slsReceiverSoftware/include/genericSocket.h | 835 -- slsReceiverSoftware/include/gitInfoReceiver.h | 6 - .../include/gitInfoReceiverTmp.h | 6 - slsReceiverSoftware/include/libzmq.a | Bin 2401050 -> 0 bytes slsReceiverSoftware/include/logger.h | 231 - .../include/rapidjson/allocators.h | 271 - .../include/rapidjson/document.h | 2575 ----- .../include/rapidjson/encodedstream.h | 299 - .../include/rapidjson/encodings.h | 716 -- .../include/rapidjson/error/en.h | 74 - .../include/rapidjson/error/error.h | 155 - .../include/rapidjson/filereadstream.h | 99 - .../include/rapidjson/filewritestream.h | 104 - slsReceiverSoftware/include/rapidjson/fwd.h | 151 - .../include/rapidjson/internal/biginteger.h | 290 - .../include/rapidjson/internal/diyfp.h | 258 - .../include/rapidjson/internal/dtoa.h | 245 - .../include/rapidjson/internal/ieee754.h | 78 - .../include/rapidjson/internal/itoa.h | 304 - .../include/rapidjson/internal/meta.h | 181 - .../include/rapidjson/internal/pow10.h | 55 - .../include/rapidjson/internal/regex.h | 701 -- .../include/rapidjson/internal/stack.h | 230 - .../include/rapidjson/internal/strfunc.h | 55 - .../include/rapidjson/internal/strtod.h | 269 - .../include/rapidjson/internal/swap.h | 46 - .../include/rapidjson/istreamwrapper.h | 115 - .../include/rapidjson/memorybuffer.h | 70 - .../include/rapidjson/memorystream.h | 71 - .../include/rapidjson/msinttypes/inttypes.h | 316 - .../include/rapidjson/msinttypes/stdint.h | 300 - .../include/rapidjson/ostreamwrapper.h | 81 - .../include/rapidjson/pointer.h | 1358 --- .../include/rapidjson/prettywriter.h | 255 - .../include/rapidjson/rapidjson.h | 615 -- .../include/rapidjson/reader.h | 1879 ---- .../include/rapidjson/schema.h | 2006 ---- .../include/rapidjson/stream.h | 179 - .../include/rapidjson/stringbuffer.h | 117 - .../include/rapidjson/writer.h | 610 -- slsReceiverSoftware/include/receiver_defs.h | 50 - slsReceiverSoftware/include/slsReceiver.h | 103 - .../include/slsReceiverTCPIPInterface.h | 373 - .../include/slsReceiverUsers.h | 88 - .../include/sls_receiver_defs.h | 323 - .../include/sls_receiver_exceptions.h | 42 - .../include/sls_receiver_funcs.h | 80 - slsReceiverSoftware/include/utilities.h | 15 - slsReceiverSoftware/include/versionAPI.h | 1 - slsReceiverSoftware/include/zmq.h | 417 - slsReceiverSoftware/slsReceiverUsers.doxy | 86 - slsReceiverSoftware/src/.cproject | 51 - slsReceiverSoftware/src/.project | 28 - slsReceiverSoftware/src/BinaryFile.cpp | 138 - slsReceiverSoftware/src/DataProcessor.cpp | 598 - slsReceiverSoftware/src/DataStreamer.cpp | 287 - slsReceiverSoftware/src/Fifo.cpp | 137 - slsReceiverSoftware/src/File.cpp | 80 - slsReceiverSoftware/src/HDF5File.cpp | 332 - slsReceiverSoftware/src/Listener.cpp | 668 -- slsReceiverSoftware/src/MySocketTCP.cpp | 46 - slsReceiverSoftware/src/ThreadObject.cpp | 106 - .../src/UDPBaseImplementation.cpp | 825 -- slsReceiverSoftware/src/UDPInterface.cpp | 30 - .../src/UDPStandardImplementation.cpp | 822 -- slsReceiverSoftware/src/main.cpp | 159 - slsReceiverSoftware/src/slsReceiver.cpp | 143 - .../src/slsReceiverTCPIPInterface.cpp | 2983 ----- slsReceiverSoftware/src/slsReceiverUsers.cpp | 47 - slsReceiverSoftware/src/utilities.cpp | 80 - slsReceiverSoftware/updateAPIVersion.sh | 7 - slsReceiverSoftware/updateGitVersion.sh | 28 - 1449 files changed, 208525 deletions(-) delete mode 100644 CMakeLists.txt delete mode 100755 Makefile delete mode 100755 Makefile.include delete mode 100644 README.md delete mode 100644 RELEASE.txt delete mode 100644 cleansharedmemory.sh delete mode 100644 cmake/FindCBF.cmake delete mode 100644 cmake/FindQwt.cmake delete mode 100644 cmake/FindROOT.cmake delete mode 100755 cmk.sh delete mode 100644 commitVersions.sh delete mode 100755 configure rename {manual/docs => docs}/html/angularCalibrationHowTo/WARNINGS (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/angularCalibrationHowTo.css (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/angularCalibrationHowTo.html (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/images.aux (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/images.log (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/images.pl (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/images.tex (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img1.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img10.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img11.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img12.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img13.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img14.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img15.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img16.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img17.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img18.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img2.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img3.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img4.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img5.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img6.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img7.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img8.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/img9.png (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/index.html (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/internals.pl (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/labels.pl (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/node1.html (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/node2.html (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/node3.html (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/node4.html (100%) rename {manual/docs => docs}/html/angularCalibrationHowTo/node5.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/WARNINGS (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/energyCalibrationHowTo.css (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/energyCalibrationHowTo.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/images.aux (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/images.log (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/images.pl (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/images.tex (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img1.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img10.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img11.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img12.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img13.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img14.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img15.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img16.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img17.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img18.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img19.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img2.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img20.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img21.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img22.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img23.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img24.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img25.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img26.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img27.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img28.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img29.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img3.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img30.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img31.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img32.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img33.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img34.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img35.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img36.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img37.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img38.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img39.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img4.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img40.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img5.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img6.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img7.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img8.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/img9.png (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/index.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/internals.pl (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/labels.pl (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/node1.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/node2.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/node3.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/node4.html (100%) rename {manual/docs => docs}/html/energyCalibrationHowTo/node5.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/acquisition.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/actions.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/advanced.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/bc_s.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/bdwn.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/closed.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/config.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ctb.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/data.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/doxygen.css (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/doxygen.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/dynsections.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2blank.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2cl.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2doc.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2folderclosed.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2folderopen.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2lastnode.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2link.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2mlastnode.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2mnode.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2mo.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2node.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2ns.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2plastnode.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2pnode.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2splitbar.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/ftv2vertline.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/index.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/jquery.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/nav_f.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/nav_g.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/nav_h.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/network.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/open.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/output.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/pages.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/receiver.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_61.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_61.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_63.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_63.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_64.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_64.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_69.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_69.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_6e.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_6e.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_6f.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_6f.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_72.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_72.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_74.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/all_74.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/close.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/mag_sel.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/nomatches.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_61.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_61.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_63.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_63.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_64.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_64.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_69.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_69.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_6e.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_6e.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_6f.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_6f.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_72.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_72.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_74.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/pages_74.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/search.css (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/search.js (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/search_l.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/search_m.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/search/search_r.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/settings.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/sync_off.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/sync_on.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/tab_a.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/tab_b.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/tab_h.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/tab_s.png (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/tabs.css (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/test.html (100%) rename {manual/docs => docs}/html/slsDetectorClientDocs/timing.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/WARNINGS (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/images.aux (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/images.log (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/images.pl (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/images.tex (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/img1.png (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/img2.png (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/index.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/labels.pl (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/node1.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/node2.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/node3.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/node4.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/node5.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/node6.html (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/slsDetectorClientHowTo.css (100%) rename {manual/docs => docs}/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/WARNINGS (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/index.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/internals.pl (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/labels.pl (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node1.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node10.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node11.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node12.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node13.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node14.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node15.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node16.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node17.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node2.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node3.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node4.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node5.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node6.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node7.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node8.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/node9.html (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.css (100%) rename {manual/docs => docs}/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.html (100%) rename {manual/docs => docs}/html/slsDetectorInstall/WARNINGS (100%) rename {manual/docs => docs}/html/slsDetectorInstall/index.html (100%) rename {manual/docs => docs}/html/slsDetectorInstall/labels.pl (100%) rename {manual/docs => docs}/html/slsDetectorInstall/slsDetectorInstall.css (100%) rename {manual/docs => docs}/html/slsDetectorInstall/slsDetectorInstall.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/annotated.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/bc_s.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/bdwn.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/classes.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/classslsDetectorUsers-members.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/classslsDetectorUsers.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/classslsReceiverUsers-members.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/classslsReceiverUsers.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/closed.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/dir_0188e84ef4beaf9eafc4e93c2b604ff4.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/dir_2a81099005c87b10dbd3ab3fe073d08e.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/dir_2fe67bc3f7560f250851af45f127d239.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/dir_cda5313c19a4ccff8ceebb4444cecd0a.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/doxygen.css (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/doxygen.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/dynsections.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/files.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2blank.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2cl.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2doc.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2folderclosed.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2folderopen.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2lastnode.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2link.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2mlastnode.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2mnode.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2mo.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2node.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2ns.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2plastnode.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2pnode.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2splitbar.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/ftv2vertline.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/functions.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/functions_func.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/functions_vars.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/globals.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/globals_defs.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/globals_func.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/globals_vars.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/index.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/jquery.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/mainClient_8cpp.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/mainClient_8cpp_source.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/mainReceiver_8cpp.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/mainReceiver_8cpp_source.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/nav_f.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/nav_g.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/nav_h.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/open.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_61.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_61.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_64.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_64.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_65.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_65.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_66.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_66.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_67.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_67.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_69.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_69.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_6b.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_6b.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_6d.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_6d.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_70.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_70.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_72.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_72.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_73.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_73.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_7e.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/all_7e.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/classes_73.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/classes_73.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/close.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/defines_70.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/defines_70.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/files_6d.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/files_6d.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/files_73.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/files_73.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_61.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_61.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_64.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_64.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_65.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_65.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_66.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_66.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_67.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_67.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_69.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_69.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_6d.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_6d.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_70.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_70.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_72.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_72.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_73.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_73.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_7e.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/functions_7e.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/mag_sel.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/nomatches.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/search.css (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/search.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/search_l.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/search_m.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/search_r.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/variables_6b.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/variables_6b.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/variables_72.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/search/variables_72.js (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/slsDetectorUsers_8h.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/slsDetectorUsers_8h_source.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/slsReceiverUsers_8h.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/slsReceiverUsers_8h_source.html (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/sync_off.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/sync_on.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/tab_a.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/tab_b.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/tab_h.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/tab_s.png (100%) rename {manual/docs => docs}/html/slsDetectorUsersDocs/tabs.css (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/WARNINGS (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/footnode.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/images.aux (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/images.log (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/images.out (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/images.pl (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/images.tex (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img1.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img10.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img100.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img101.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img102.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img103.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img104.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img105.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img106.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img107.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img108.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img109.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img11.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img110.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img111.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img112.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img113.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img114.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img115.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img116.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img117.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img118.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img119.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img12.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img120.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img121.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img122.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img123.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img124.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img125.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img126.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img127.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img128.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img129.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img13.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img130.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img131.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img132.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img133.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img134.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img135.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img136.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img137.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img138.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img139.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img14.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img140.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img141.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img142.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img143.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img144.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img145.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img146.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img147.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img148.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img149.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img15.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img150.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img151.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img152.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img153.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img154.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img155.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img156.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img157.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img158.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img159.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img16.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img160.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img161.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img162.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img163.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img164.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img165.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img166.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img167.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img168.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img169.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img17.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img170.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img171.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img172.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img173.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img174.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img175.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img176.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img177.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img178.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img179.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img18.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img180.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img181.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img182.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img183.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img184.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img185.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img186.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img187.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img188.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img189.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img19.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img190.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img191.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img192.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img193.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img194.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img195.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img196.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img197.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img198.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img199.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img2.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img20.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img200.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img201.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img202.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img203.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img204.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img205.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img206.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img207.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img208.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img209.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img21.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img210.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img211.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img212.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img213.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img214.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img215.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img216.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img217.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img218.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img219.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img22.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img220.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img221.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img222.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img223.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img224.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img225.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img226.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img23.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img24.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img25.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img26.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img27.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img28.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img29.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img3.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img30.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img31.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img32.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img33.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img34.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img35.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img36.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img37.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img38.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img39.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img4.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img40.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img41.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img42.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img43.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img44.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img45.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img46.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img47.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img48.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img49.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img5.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img50.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img51.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img52.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img53.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img54.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img55.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img56.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img57.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img58.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img59.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img6.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img60.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img61.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img62.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img63.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img64.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img65.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img66.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img67.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img68.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img69.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img7.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img70.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img71.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img72.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img73.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img74.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img75.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img76.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img77.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img78.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img79.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img8.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img80.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img81.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img82.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img83.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img84.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img85.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img86.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img87.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img88.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img89.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img9.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img90.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img91.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img92.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img93.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img94.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img95.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img96.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img97.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img98.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/img99.png (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/index.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/internals.pl (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/labels.pl (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node1.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node10.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node11.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node12.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node13.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node14.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node15.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node16.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node17.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node18.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node19.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node2.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node20.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node21.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node22.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node23.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node24.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node25.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node26.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node27.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node28.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node29.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node3.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node30.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node31.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node32.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node33.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node34.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node35.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node36.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node37.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node38.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node39.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node4.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node40.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node41.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node42.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node43.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node44.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node45.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node46.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node47.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node48.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node49.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node5.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node50.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node51.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node52.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node53.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node54.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node55.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node56.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node57.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node58.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node59.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node6.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node60.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node61.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node62.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node63.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node64.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node65.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node66.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node7.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node8.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/node9.html (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/slsDetectors-FAQ.css (100%) rename {manual/docs => docs}/html/slsDetectors-FAQ/slsDetectors-FAQ.html (100%) rename {manual/docs => docs}/pdf/angularCalibrationHowTo.pdf (100%) rename {manual/docs => docs}/pdf/energyCalibrationHowTo.pdf (100%) rename {manual/docs => docs}/pdf/slsDetectorClientDocs.pdf (100%) rename {manual/docs => docs}/pdf/slsDetectorClientHowTo.pdf (100%) rename {manual/docs => docs}/pdf/slsDetectorGuiHowTo.pdf (100%) rename {manual/docs => docs}/pdf/slsDetectorInstall.pdf (100%) rename {manual/docs => docs}/pdf/slsDetectorUsersDocs.pdf (100%) rename {manual/docs => docs}/pdf/slsDetectors-FAQ.pdf (100%) delete mode 100644 evalVersionVariables.sh delete mode 100755 examples/ang.off delete mode 100644 examples/bad.chans delete mode 100644 examples/config_gen_script/beb_31_25.config_gen delete mode 100755 examples/config_gen_script/config_gen delete mode 100644 examples/config_gen_script/eiger_2m_1gb.config_gen delete mode 100644 examples/eiger_10Gb.config delete mode 100644 examples/eiger_1Gb.config delete mode 100644 examples/gotthard.config delete mode 100644 examples/gotthard_setup.det delete mode 100644 examples/jungfrau.config delete mode 100644 examples/jungfrau_two.config delete mode 100644 examples/mythen.config delete mode 100644 examples/receiver.config delete mode 100644 examples/scripts/.parab delete mode 100755 examples/scripts/HeaderBeforeAfter.awk delete mode 100755 examples/scripts/ScanScript.awk delete mode 100755 examples/scripts/ScriptBeforeAfter.awk delete mode 100755 examples/scripts/StartStopScript.awk delete mode 100755 examples/scripts/slsReceiverScript delete mode 100755 examples/scripts/xterms delete mode 100644 examples/two_gotthard.config delete mode 100644 examples/two_no_receiver.config delete mode 100755 genVersionHeader.sh delete mode 100644 recipe/build.sh delete mode 100644 recipe/copy_gui.sh delete mode 100644 recipe/copy_lib.sh delete mode 100644 recipe/meta.yaml delete mode 120000 serverBin/eigerDetectorServer_virtualMaster delete mode 120000 serverBin/eigerDetectorServer_virtualSlave delete mode 120000 serverBin/eigerDetectorServerv4.0.1.22.1 delete mode 120000 serverBin/gotthardDetectorServer_virtual delete mode 120000 serverBin/gotthardDetectorServerv4.0.1.4 delete mode 120000 serverBin/jungfrauDetectorServer_virtual delete mode 120000 serverBin/jungfrauDetectorServerv4.0.1.0 delete mode 120000 serverBin/mythenDetectorServerv2.0.3 delete mode 100644 settingsdir/eiger/highgain/calibration.snbeb045 delete mode 100644 settingsdir/eiger/highgain/highgain.cal delete mode 100644 settingsdir/eiger/highgain/highgain.trim delete mode 100644 settingsdir/eiger/highgain/settings.snbeb045 delete mode 100644 settingsdir/eiger/lowgain/calibration.snbeb045 delete mode 100644 settingsdir/eiger/lowgain/lowgain.cal delete mode 100644 settingsdir/eiger/lowgain/lowgain.trim delete mode 100644 settingsdir/eiger/lowgain/settings.snbeb045 delete mode 100644 settingsdir/eiger/standard/4500eV/noise.sn031 delete mode 100644 settingsdir/eiger/standard/4500eV/noise.sn032 delete mode 100644 settingsdir/eiger/standard/5400eV/noise.sn031 delete mode 100644 settingsdir/eiger/standard/5400eV/noise.sn032 delete mode 100644 settingsdir/eiger/standard/6400eV/noise.sn031 delete mode 100644 settingsdir/eiger/standard/6400eV/noise.sn032 delete mode 100644 settingsdir/eiger/standard/calibration.sn031 delete mode 100644 settingsdir/eiger/standard/calibration.sn032 delete mode 100644 settingsdir/eiger/standard/eigernoise.sn049 delete mode 100644 settingsdir/eiger/standard/noise.sn031 delete mode 100644 settingsdir/eiger/standard/noise.sn032 delete mode 100644 settingsdir/eiger/standard/standard.cal delete mode 100644 settingsdir/eiger/standard/standard.trim delete mode 100644 settingsdir/eiger/veryhighgain/calibration.sn031 delete mode 100644 settingsdir/eiger/veryhighgain/calibration.sn032 delete mode 100644 settingsdir/eiger/veryhighgain/noise.sn031 delete mode 100644 settingsdir/eiger/veryhighgain/noise.sn032 delete mode 100644 settingsdir/eiger/veryhighgain/veryhighgain.cal delete mode 100644 settingsdir/eiger/veryhighgain/veryhighgain.trim delete mode 100644 settingsdir/eiger/verylowgain/calibration.sn031 delete mode 100644 settingsdir/eiger/verylowgain/calibration.sn032 delete mode 100644 settingsdir/eiger/verylowgain/noise.sn031 delete mode 100644 settingsdir/eiger/verylowgain/noise.sn032 delete mode 100644 settingsdir/eiger/verylowgain/verylowgain.cal delete mode 100644 settingsdir/eiger/verylowgain/verylowgain.trim delete mode 100755 settingsdir/mythen/fast/calibration.snxxx delete mode 100755 settingsdir/mythen/fast/fast.cal delete mode 100755 settingsdir/mythen/fast/fast.trim delete mode 100644 settingsdir/mythen/fast/noise.snxxx delete mode 100755 settingsdir/mythen/highgain/calibration.snxxx delete mode 100755 settingsdir/mythen/highgain/highgain.cal delete mode 100755 settingsdir/mythen/highgain/highgain.trim delete mode 100644 settingsdir/mythen/highgain/noise.snxxx delete mode 100755 settingsdir/mythen/standard/calibration.snxxx delete mode 100644 settingsdir/mythen/standard/noise.snxxx delete mode 100755 settingsdir/mythen/standard/standard.cal delete mode 100644 settingsdir/mythen/standard/standard.trim delete mode 100644 slsDetectorCalibration/.gitignore delete mode 100755 slsDetectorCalibration/MovingStat.h delete mode 100755 slsDetectorCalibration/RunningStat.h delete mode 100644 slsDetectorCalibration/analogDetector.h delete mode 100644 slsDetectorCalibration/commonModeSubtraction.h delete mode 100644 slsDetectorCalibration/dataStructures/Mythen3_01_jctbData.h delete mode 100644 slsDetectorCalibration/dataStructures/Mythen3_02_jctbData.h delete mode 100644 slsDetectorCalibration/dataStructures/adcSar2_jctbData.h delete mode 100644 slsDetectorCalibration/dataStructures/chiptestBoardData.h delete mode 100644 slsDetectorCalibration/dataStructures/eigerHalfModuleData.h delete mode 100644 slsDetectorCalibration/dataStructures/gotthardDoubleModuleDataNew.h delete mode 100644 slsDetectorCalibration/dataStructures/gotthardModuleData.h delete mode 100644 slsDetectorCalibration/dataStructures/gotthardModuleDataNew.h delete mode 100644 slsDetectorCalibration/dataStructures/gotthardShortModuleData.h delete mode 100644 slsDetectorCalibration/dataStructures/jungfrau02Data.h delete mode 100644 slsDetectorCalibration/dataStructures/jungfrau10ModuleData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench02Ctb10GbData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench02CtbData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench02ModuleData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03Ctb10GbData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03Ctb10GbT1Data.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03CtbData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03T1CtbData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03T1ReceiverData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03T1ReceiverDataNew.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03T1ZmqData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03T1ZmqDataNew.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03TCtb10GbData.h delete mode 100644 slsDetectorCalibration/dataStructures/moench03TCtbData.h delete mode 100644 slsDetectorCalibration/doxy.config delete mode 100644 slsDetectorCalibration/energyCalibration.cpp delete mode 100644 slsDetectorCalibration/energyCalibration.h delete mode 100644 slsDetectorCalibration/gotthardDoubleModuleCommonModeSubtractionNew.h delete mode 100644 slsDetectorCalibration/gotthardExecutables/Makefile.onTheFly delete mode 100644 slsDetectorCalibration/gotthardExecutables/gotthard25umZmqAnalysis.C delete mode 100644 slsDetectorCalibration/interpolatingDetector.h delete mode 100755 slsDetectorCalibration/interpolations/.__afs3A48 delete mode 100644 slsDetectorCalibration/interpolations/eta2InterpolationBase.h delete mode 100644 slsDetectorCalibration/interpolations/eta3InterpolationBase.h delete mode 100644 slsDetectorCalibration/interpolations/etaInterpolationAdaptiveBins.h delete mode 100644 slsDetectorCalibration/interpolations/etaInterpolationBase.h delete mode 100644 slsDetectorCalibration/interpolations/etaInterpolationGlobal.h delete mode 100644 slsDetectorCalibration/interpolations/etaInterpolationPosXY.h delete mode 100644 slsDetectorCalibration/interpolations/etaInterpolationRandomBins.h delete mode 100644 slsDetectorCalibration/interpolations/etaVEL/EVELAlg.C delete mode 100644 slsDetectorCalibration/interpolations/etaVEL/EtaVEL.cpp delete mode 100644 slsDetectorCalibration/interpolations/etaVEL/EtaVEL.h delete mode 100644 slsDetectorCalibration/interpolations/etaVEL/EtaVELTr.py delete mode 100644 slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.cpp delete mode 100644 slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.h delete mode 100644 slsDetectorCalibration/interpolations/linearInterpolation.h delete mode 100644 slsDetectorCalibration/interpolations/noInterpolation.h delete mode 100644 slsDetectorCalibration/interpolations/slsInterpolation.h delete mode 100644 slsDetectorCalibration/moench03CommonMode.h delete mode 100644 slsDetectorCalibration/moenchCommonMode.h delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.cluster_finder delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.moench delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.moench_eta delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.moench_zmq delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.phoenix delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.reoder_image delete mode 100644 slsDetectorCalibration/moenchExecutables/Makefile.tiff_to_th2f delete mode 100644 slsDetectorCalibration/moenchExecutables/moench03ClusterFinder.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moench03ClusterFinderPhoenix.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moench03MakeEta.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moench03NoInterpolation.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moench03ReorderImage.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moenchZmqAnalog.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moenchZmqClusterFinder.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/moenchZmqInterpolating.cpp delete mode 100644 slsDetectorCalibration/moenchExecutables/tiff_to_th2f.cpp delete mode 100644 slsDetectorCalibration/multiThreadedAnalogDetector.h delete mode 100644 slsDetectorCalibration/pedestalSubtraction.h delete mode 100644 slsDetectorCalibration/singlePhotonDetector.h delete mode 100644 slsDetectorCalibration/single_photon_hit.h delete mode 100644 slsDetectorCalibration/single_photon_hit_double.h delete mode 100644 slsDetectorCalibration/single_photon_hit_old.h delete mode 100644 slsDetectorCalibration/slsDetectorCalibration.doxy delete mode 100644 slsDetectorCalibration/slsDetectorData.h delete mode 100644 slsDetectorCalibration/slsReceiverData.h delete mode 100644 slsDetectorCalibration/tiffIO.cpp delete mode 100644 slsDetectorCalibration/tiffIO.h delete mode 100644 slsDetectorGui/.gitignore delete mode 100644 slsDetectorGui/CMakeLists.txt delete mode 100644 slsDetectorGui/Makefile delete mode 100644 slsDetectorGui/client/Makefile delete mode 100644 slsDetectorGui/client/qClient.cpp delete mode 100644 slsDetectorGui/client/qClient.h delete mode 100644 slsDetectorGui/doxy.config delete mode 100644 slsDetectorGui/forms/form_action.ui delete mode 100644 slsDetectorGui/forms/form_detectormain.ui delete mode 100644 slsDetectorGui/forms/form_scan.ui delete mode 100644 slsDetectorGui/forms/form_tab_advanced.ui delete mode 100644 slsDetectorGui/forms/form_tab_dataoutput.ui delete mode 100644 slsDetectorGui/forms/form_tab_debugging.ui delete mode 100644 slsDetectorGui/forms/form_tab_measurement.ui delete mode 100644 slsDetectorGui/forms/form_tab_messages.ui delete mode 100644 slsDetectorGui/forms/form_tab_plot.ui delete mode 100644 slsDetectorGui/forms/form_tab_settings.ui delete mode 100644 slsDetectorGui/gitInfo.txt delete mode 100644 slsDetectorGui/images/add.png delete mode 100644 slsDetectorGui/images/browse.png delete mode 100644 slsDetectorGui/images/calculate.png delete mode 100644 slsDetectorGui/images/close.png delete mode 100644 slsDetectorGui/images/download.png delete mode 100644 slsDetectorGui/images/erase.png delete mode 100644 slsDetectorGui/images/leftArrow.png delete mode 100644 slsDetectorGui/images/mountain.png delete mode 100644 slsDetectorGui/images/new.png delete mode 100644 slsDetectorGui/images/refresh.png delete mode 100644 slsDetectorGui/images/refresher.png delete mode 100644 slsDetectorGui/images/remove.png delete mode 100644 slsDetectorGui/images/rightArrow.png delete mode 100644 slsDetectorGui/images/save.png delete mode 100644 slsDetectorGui/images/saveAll.png delete mode 100644 slsDetectorGui/images/setup.png delete mode 100644 slsDetectorGui/images/start.png delete mode 100644 slsDetectorGui/images/stop.png delete mode 100644 slsDetectorGui/images/upload.png delete mode 100644 slsDetectorGui/include/gitInfoGui.h delete mode 100644 slsDetectorGui/include/gitInfoGuiTmp.h delete mode 100644 slsDetectorGui/include/icons.qrc delete mode 100644 slsDetectorGui/include/qActionsWidget.h delete mode 100644 slsDetectorGui/include/qCloneWidget.h delete mode 100644 slsDetectorGui/include/qDebugStream.h delete mode 100644 slsDetectorGui/include/qDefs.h delete mode 100644 slsDetectorGui/include/qDetectorMain.h delete mode 100644 slsDetectorGui/include/qDrawPlot.h delete mode 100644 slsDetectorGui/include/qScanWidget.h delete mode 100644 slsDetectorGui/include/qServer.h delete mode 100644 slsDetectorGui/include/qTabActions.h delete mode 100644 slsDetectorGui/include/qTabAdvanced.h delete mode 100644 slsDetectorGui/include/qTabDataOutput.h delete mode 100644 slsDetectorGui/include/qTabDebugging.h delete mode 100644 slsDetectorGui/include/qTabDeveloper.h delete mode 100644 slsDetectorGui/include/qTabMeasurement.h delete mode 100644 slsDetectorGui/include/qTabMessages.h delete mode 100644 slsDetectorGui/include/qTabPlot.h delete mode 100644 slsDetectorGui/include/qTabSettings.h delete mode 100644 slsDetectorGui/slsDetectorGui.pro delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQt1DZoomer.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQt2DHist.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlotLayout.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQt2DZoomer.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQtNumberEntry.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/include/SlsQtValidators.h delete mode 100644 slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cxx delete mode 100644 slsDetectorGui/slsDetectorPlotting/src/SlsQt1DZoomer.cxx delete mode 100644 slsDetectorGui/slsDetectorPlotting/src/SlsQt2DHist.cxx delete mode 100644 slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlot.cxx delete mode 100644 slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx delete mode 100644 slsDetectorGui/slsDetectorPlotting/src/SlsQtNumberEntry.cxx delete mode 100644 slsDetectorGui/src/qActionsWidget.cpp delete mode 100644 slsDetectorGui/src/qCloneWidget.cpp delete mode 100644 slsDetectorGui/src/qDetectorMain.cpp delete mode 100644 slsDetectorGui/src/qDrawPlot.cpp delete mode 100644 slsDetectorGui/src/qScanWidget.cpp delete mode 100644 slsDetectorGui/src/qServer.cpp delete mode 100644 slsDetectorGui/src/qTabActions.cpp delete mode 100644 slsDetectorGui/src/qTabAdvanced.cpp delete mode 100644 slsDetectorGui/src/qTabDataOutput.cpp delete mode 100644 slsDetectorGui/src/qTabDebugging.cpp delete mode 100644 slsDetectorGui/src/qTabDeveloper.cpp delete mode 100644 slsDetectorGui/src/qTabMeasurement.cpp delete mode 100644 slsDetectorGui/src/qTabMessages.cpp delete mode 100644 slsDetectorGui/src/qTabPlot.cpp delete mode 100644 slsDetectorGui/src/qTabSettings.cpp delete mode 100755 slsDetectorGui/updateGitVersion.sh delete mode 100644 slsDetectorSoftware/.gitignore delete mode 100644 slsDetectorSoftware/CMakeLists.txt delete mode 100644 slsDetectorSoftware/Makefile delete mode 100644 slsDetectorSoftware/Makefile.Standalone delete mode 100644 slsDetectorSoftware/Makefile.x04sa delete mode 100644 slsDetectorSoftware/README delete mode 100755 slsDetectorSoftware/commonFiles/communication_funcs.c delete mode 100755 slsDetectorSoftware/commonFiles/communication_funcs.h delete mode 100644 slsDetectorSoftware/commonFiles/error_defs.h delete mode 100755 slsDetectorSoftware/commonFiles/sls_detector_defs.h delete mode 100644 slsDetectorSoftware/commonFiles/sls_detector_funcs.h delete mode 100644 slsDetectorSoftware/commonFiles/versionAPI.h delete mode 100644 slsDetectorSoftware/doxy.config delete mode 100644 slsDetectorSoftware/eigerDetectorServer/9mhvserial_bf.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/Beb.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/Beb.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/Feb.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/Feb.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/FebControl.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/FebControl.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/FebInterface.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/FebInterface.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/HardwareIO.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/HardwareIO.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/HardwareMMappingDefs.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/LocalLinkInterface.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/LocalLinkInterface.h delete mode 100755 slsDetectorSoftware/eigerDetectorServer/Makefile delete mode 100644 slsDetectorSoftware/eigerDetectorServer/Makefile.virtual delete mode 120000 slsDetectorSoftware/eigerDetectorServer/ansi.h delete mode 100755 slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster delete mode 100755 slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave delete mode 100755 slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.0.1.22.1 delete mode 100755 slsDetectorSoftware/eigerDetectorServer/bin/hv9m_blackfin_serverv3.0.0.1 delete mode 120000 slsDetectorSoftware/eigerDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/eigerDetectorServer/communication_funcs.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/gitInfoEigerTmp.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/renameServer.sh delete mode 100644 slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c delete mode 120000 slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.h delete mode 120000 slsDetectorSoftware/eigerDetectorServer/slsDetectorServer.c delete mode 100644 slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h delete mode 120000 slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.c delete mode 120000 slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.h delete mode 120000 slsDetectorSoftware/eigerDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/eigerDetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/eigerDetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/eigerDetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/eigerDetectorServer/updateAPIVersion.sh delete mode 100755 slsDetectorSoftware/eigerDetectorServer/updateGitVersion.sh delete mode 120000 slsDetectorSoftware/eigerDetectorServer/versionAPI.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/xfs_types.h delete mode 100644 slsDetectorSoftware/eigerDetectorServer/xparameters.h delete mode 100644 slsDetectorSoftware/f90Interface/externPostProcessing.cpp delete mode 100644 slsDetectorSoftware/f90Interface/externPostProcessing.h delete mode 100644 slsDetectorSoftware/f90Interface/sls_detector_analysis_f.f90 delete mode 100644 slsDetectorSoftware/gitInfo.txt delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/.target-makefrag delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/AD9257.h delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/Makefile delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/Makefile.propix delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/Makefile.virtual delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/ansi.h delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/commonServerFunctions.h delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/communication_funcs.h delete mode 100644 slsDetectorSoftware/gotthardDetectorServer/config.txt delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.h delete mode 100644 slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h delete mode 100644 slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthardTmp.h delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServer_virtual delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv4.0.1.4 delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.h delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/registers_g.h delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/server.c delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/server_defs.h delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/server_funcs.c delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/server_funcs.h delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/stop_server.c delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/updateAPIVersion.sh delete mode 100755 slsDetectorSoftware/gotthardDetectorServer/updateGitVersion.sh delete mode 120000 slsDetectorSoftware/gotthardDetectorServer/versionAPI.h delete mode 120000 slsDetectorSoftware/include/detectorData.h delete mode 120000 slsDetectorSoftware/include/slsDetectorUsers.h delete mode 120000 slsDetectorSoftware/include/slsReceiverUsers.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/AD9257.h delete mode 100644 slsDetectorSoftware/jctbDetectorServer/Makefile delete mode 120000 slsDetectorSoftware/jctbDetectorServer/ansi.h delete mode 100644 slsDetectorSoftware/jctbDetectorServer/bf_init.sh delete mode 100644 slsDetectorSoftware/jctbDetectorServer/blackfin.c delete mode 100644 slsDetectorSoftware/jctbDetectorServer/blackfin.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/commonServerFunctions.h delete mode 120000 slsDetectorSoftware/jctbDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/jctbDetectorServer/communication_funcs.h delete mode 100644 slsDetectorSoftware/jctbDetectorServer/convert_pof_to_raw.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/firmware_funcs.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/get_server.sh delete mode 100644 slsDetectorSoftware/jctbDetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h delete mode 100644 slsDetectorSoftware/jctbDetectorServer/gitInfoMoenchTmp.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/jctbDetectorServer_developer delete mode 100755 slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/mcb_funcs.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/program_fpga.sh delete mode 100644 slsDetectorSoftware/jctbDetectorServer/registers_m.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/server.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/server_defs.h delete mode 100644 slsDetectorSoftware/jctbDetectorServer/server_funcs.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/server_funcs.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/sharedmemory.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/sharedmemory.h delete mode 100644 slsDetectorSoftware/jctbDetectorServer/slow_adc.c delete mode 100644 slsDetectorSoftware/jctbDetectorServer/slow_adc.h delete mode 120000 slsDetectorSoftware/jctbDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/jctbDetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/jctbDetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/jctbDetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/jctbDetectorServer/stop_server.c delete mode 100755 slsDetectorSoftware/jctbDetectorServer/updateGitVersion.sh delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/AD9257.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/Makefile delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/ansi.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServer_virtual delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv4.0.1.0 delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/blackfin.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/commonServerFunctions.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.h delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrauTmp.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/programfpga.h delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer.c delete mode 100644 slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.c delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/updateAPIVersion.sh delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/updateGitVersion.sh delete mode 120000 slsDetectorSoftware/jungfrauDetectorServer/versionAPI.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/.target-makefrag delete mode 100755 slsDetectorSoftware/moenchDetectorServer/Makefile delete mode 100755 slsDetectorSoftware/moenchDetectorServer/Makefile.virtual delete mode 120000 slsDetectorSoftware/moenchDetectorServer/ansi.h delete mode 120000 slsDetectorSoftware/moenchDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/moenchDetectorServer/communication_funcs.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/firmware_funcs.h delete mode 100644 slsDetectorSoftware/moenchDetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h delete mode 100644 slsDetectorSoftware/moenchDetectorServer/gitInfoMoenchTmp.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/mcb_funcs.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/mcb_funcs.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/moenchVirtualServer delete mode 100755 slsDetectorSoftware/moenchDetectorServer/registers_m.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/server.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/server_defs.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/server_funcs.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/server_funcs.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/sharedmemory.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/sharedmemory.h delete mode 120000 slsDetectorSoftware/moenchDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/moenchDetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/moenchDetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/moenchDetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/stop_server.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/trimming_funcs.c delete mode 100755 slsDetectorSoftware/moenchDetectorServer/trimming_funcs.h delete mode 100755 slsDetectorSoftware/moenchDetectorServer/updateGitVersion.sh delete mode 100644 slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp delete mode 100644 slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h delete mode 100644 slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h delete mode 100644 slsDetectorSoftware/multiSlsDetector/multiSlsDetectorCommand.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/AD9257.h delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/Makefile delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/Makefile.virtual delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/RegisterDefs.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/ansi.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/blackfin.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/commonServerFunctions.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/communication_funcs.h delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/gitInfoMythen3.h delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/gitInfoMythen3Tmp.h delete mode 100755 slsDetectorSoftware/mythen3DetectorServer/mythen3Server delete mode 100755 slsDetectorSoftware/mythen3DetectorServer/mythen3Server.gdb delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/programfpga.h delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.c delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer.c delete mode 100644 slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_defs.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.c delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/mythen3DetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/mythen3DetectorServer/updateGitVersion.sh delete mode 100755 slsDetectorSoftware/mythenDetectorServer/.target-makefrag delete mode 100755 slsDetectorSoftware/mythenDetectorServer/Makefile delete mode 100644 slsDetectorSoftware/mythenDetectorServer/Makefile.dum delete mode 100644 slsDetectorSoftware/mythenDetectorServer/Makefile.picasso delete mode 100755 slsDetectorSoftware/mythenDetectorServer/Makefile.virtual delete mode 120000 slsDetectorSoftware/mythenDetectorServer/ansi.h delete mode 120000 slsDetectorSoftware/mythenDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/mythenDetectorServer/communication_funcs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/firmware_funcs.h delete mode 100644 slsDetectorSoftware/mythenDetectorServer/gitInfo.txt delete mode 100644 slsDetectorSoftware/mythenDetectorServer/gitInfoMythen.h delete mode 100644 slsDetectorSoftware/mythenDetectorServer/gitInfoMythenTmp.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/mcb_funcs.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/mcb_funcs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/mythenDetectorServer delete mode 100755 slsDetectorSoftware/mythenDetectorServer/mythenDetectorServerv2.0.3 delete mode 100755 slsDetectorSoftware/mythenDetectorServer/mythenVirtualServer delete mode 100755 slsDetectorSoftware/mythenDetectorServer/picasso_defs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/registers.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/server.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/server_defs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/server_funcs.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/server_funcs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/sharedmemory.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/sharedmemory.h delete mode 120000 slsDetectorSoftware/mythenDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/mythenDetectorServer/sls_detector_funcs.h delete mode 120000 slsDetectorSoftware/mythenDetectorServer/sls_receiver_defs.h delete mode 120000 slsDetectorSoftware/mythenDetectorServer/sls_receiver_funcs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/stop_server.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/trimming_funcs.c delete mode 100755 slsDetectorSoftware/mythenDetectorServer/trimming_funcs.h delete mode 100755 slsDetectorSoftware/mythenDetectorServer/updateGitVersion.sh delete mode 100755 slsDetectorSoftware/patternGenerator/generate.sh delete mode 100755 slsDetectorSoftware/patternGenerator/generator.c delete mode 100755 slsDetectorSoftware/patternGenerator/test.p delete mode 100644 slsDetectorSoftware/sharedMemory/SharedMemory.cpp delete mode 100644 slsDetectorSoftware/sharedMemory/SharedMemory.h delete mode 100644 slsDetectorSoftware/slsADCReader/Makefile delete mode 100755 slsDetectorSoftware/slsADCReader/slsADCReader delete mode 100644 slsDetectorSoftware/slsADCReader/slsADCReader.cpp delete mode 100644 slsDetectorSoftware/slsDetector/gitInfoLib.h delete mode 100644 slsDetectorSoftware/slsDetector/gitInfoLibTmp.h delete mode 100755 slsDetectorSoftware/slsDetector/remove_shm.sh delete mode 100644 slsDetectorSoftware/slsDetector/slsDetector.cpp delete mode 100644 slsDetectorSoftware/slsDetector/slsDetector.h delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorActions.cpp delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorActions.h delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorBase.h delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorCommand.h delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorUsers.cpp delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorUsers.h delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorUtils.cpp delete mode 100644 slsDetectorSoftware/slsDetector/slsDetectorUtils.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/AngularConversion_Standalone.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/AngularConversion_Standalone.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/FileIO_Standalone.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/FileIO_Standalone.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/Makefile delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/Makefile.arch delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/TSlsDetectorDict.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/TSlsDetectorDict.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angCalLogClass.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angleConversionConstant.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angularCalibration.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angularCalibration.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angularConversion.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angularConversion.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angularConversionStatic.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/angularConversionStatic.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/badChannelCorrections.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/detectorData.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/annotated.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/classenergyCalibration-members.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/classenergyCalibration.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/classenergyCalibrationFunctions-members.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/classenergyCalibrationFunctions.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/classes.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/doxygen.css delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/doxygen.png delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/energyCalibration_8h-source.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/energyCalibration_8h.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/energyCalibration_8h_source.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/files.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/functions.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/functions_func.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/functions_vars.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/globals.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/globals_vars.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/index.html delete mode 100755 slsDetectorSoftware/slsDetectorAnalysis/docs/html/installdox delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/namespaces.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/namespacestd.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_61.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_62.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_63.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_65.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_66.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_67.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_6b.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_6c.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_6d.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_6e.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_70.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_71.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_73.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/all_7e.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/classes_65.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/close.png delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/files_65.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_63.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_65.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_66.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_67.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_6b.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_6c.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_6d.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_71.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_73.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/functions_7e.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/nomatches.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/search.css delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/search.js delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/search.png delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_61.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_62.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_63.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_65.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_66.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_6e.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_70.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/search/variables_73.html delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/tab_b.gif delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/tab_l.gif delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/tab_r.gif delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/html/tabs.css delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/FreeSans.ttf delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/Makefile delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/annotated.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/classenergyCalibration.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/classenergyCalibrationFunctions.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/doxygen.sty delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/energyCalibration_8h.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/files.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/index.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/namespaces.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/namespacestd.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/docs/latex/refman.tex delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/doxy.config delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/enCalLogClass.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/energyCalibration.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/energyCalibrationMacro.C delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/energyConversion.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/energyConversion.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/fileIO.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/fileIO.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/fileIOStatic.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/movingStat.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessing.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessing.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessingFileIO_Standalone.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessingFileIO_Standalone.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessingFuncs.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessingFuncs.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessing_Standalone.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/postProcessing_Standalone.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/runningStat.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/singlePhotonFilter.cpp delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/singlePhotonFilter.h delete mode 100644 slsDetectorSoftware/slsDetectorAnalysis/single_photon_hit.h delete mode 100644 slsDetectorSoftware/slsDetectorClient/CMakeLists.txt delete mode 100644 slsDetectorSoftware/slsDetectorClient/Makefile delete mode 100644 slsDetectorSoftware/slsDetectorClient/Makefile.x04sa delete mode 100644 slsDetectorSoftware/slsDetectorClient/sls_detector_client.cpp delete mode 100755 slsDetectorSoftware/slsDetectorServer/AD9257.h delete mode 100644 slsDetectorSoftware/slsDetectorServer/Makefile delete mode 100755 slsDetectorSoftware/slsDetectorServer/blackfin.h delete mode 100755 slsDetectorSoftware/slsDetectorServer/commonServerFunctions.h delete mode 120000 slsDetectorSoftware/slsDetectorServer/communication_funcs.c delete mode 120000 slsDetectorSoftware/slsDetectorServer/communication_funcs.h delete mode 100755 slsDetectorSoftware/slsDetectorServer/programfpga.h delete mode 100644 slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.c delete mode 100644 slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h delete mode 100755 slsDetectorSoftware/slsDetectorServer/slsDetectorServer.c delete mode 100644 slsDetectorSoftware/slsDetectorServer/slsDetectorServer_defs.h delete mode 100755 slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c delete mode 100755 slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h delete mode 100755 slsDetectorSoftware/slsDetectorServer/slsDetector_stopServer.c delete mode 120000 slsDetectorSoftware/slsDetectorServer/sls_detector_defs.h delete mode 120000 slsDetectorSoftware/slsDetectorServer/sls_detector_funcs.h delete mode 100644 slsDetectorSoftware/slsReceiverInterface/receiverInterface.cpp delete mode 100644 slsDetectorSoftware/slsReceiverInterface/receiverInterface.h delete mode 100644 slsDetectorSoftware/threadFiles/CondVar.cpp delete mode 100644 slsDetectorSoftware/threadFiles/CondVar.h delete mode 100644 slsDetectorSoftware/threadFiles/Global.h delete mode 100644 slsDetectorSoftware/threadFiles/Makefile delete mode 100644 slsDetectorSoftware/threadFiles/Multi.cpp delete mode 100644 slsDetectorSoftware/threadFiles/Multi.h delete mode 100644 slsDetectorSoftware/threadFiles/Mutex.cpp delete mode 100644 slsDetectorSoftware/threadFiles/Mutex.h delete mode 100644 slsDetectorSoftware/threadFiles/Single.cpp delete mode 100644 slsDetectorSoftware/threadFiles/Single.h delete mode 100644 slsDetectorSoftware/threadFiles/Task.h delete mode 100644 slsDetectorSoftware/threadFiles/ThreadPool.cpp delete mode 100644 slsDetectorSoftware/threadFiles/ThreadPool.h delete mode 100755 slsDetectorSoftware/threadFiles/bin/examplethreadpool_test delete mode 100644 slsDetectorSoftware/threadFiles/threadpool_test.cpp delete mode 100755 slsDetectorSoftware/updateGitVersion.sh delete mode 100644 slsDetectorSoftware/usersFunctions/angleFunction.h delete mode 100644 slsDetectorSoftware/usersFunctions/usersFunctions.cpp delete mode 100644 slsDetectorSoftware/usersFunctions/usersFunctions.h delete mode 100644 slsReceiverSoftware/.gitignore delete mode 100644 slsReceiverSoftware/CMakeLists.txt delete mode 100644 slsReceiverSoftware/Makefile delete mode 100644 slsReceiverSoftware/gitInfo.txt delete mode 100644 slsReceiverSoftware/include/BinaryFile.h delete mode 100644 slsReceiverSoftware/include/BinaryFileStatic.h delete mode 100644 slsReceiverSoftware/include/DataProcessor.h delete mode 100644 slsReceiverSoftware/include/DataStreamer.h delete mode 100644 slsReceiverSoftware/include/Fifo.h delete mode 100644 slsReceiverSoftware/include/File.h delete mode 100644 slsReceiverSoftware/include/GeneralData.h delete mode 100644 slsReceiverSoftware/include/HDF5File.h delete mode 100644 slsReceiverSoftware/include/HDF5FileStatic.h delete mode 100644 slsReceiverSoftware/include/Listener.h delete mode 100644 slsReceiverSoftware/include/MySocketTCP.h delete mode 100644 slsReceiverSoftware/include/ThreadObject.h delete mode 100644 slsReceiverSoftware/include/UDPBaseImplementation.h delete mode 100644 slsReceiverSoftware/include/UDPInterface.h delete mode 100644 slsReceiverSoftware/include/UDPStandardImplementation.h delete mode 100644 slsReceiverSoftware/include/ZmqSocket.h delete mode 100644 slsReceiverSoftware/include/ansi.h delete mode 100644 slsReceiverSoftware/include/circularFifo.h delete mode 100644 slsReceiverSoftware/include/genericSocket.h delete mode 100644 slsReceiverSoftware/include/gitInfoReceiver.h delete mode 100644 slsReceiverSoftware/include/gitInfoReceiverTmp.h delete mode 100644 slsReceiverSoftware/include/libzmq.a delete mode 100644 slsReceiverSoftware/include/logger.h delete mode 100644 slsReceiverSoftware/include/rapidjson/allocators.h delete mode 100644 slsReceiverSoftware/include/rapidjson/document.h delete mode 100644 slsReceiverSoftware/include/rapidjson/encodedstream.h delete mode 100644 slsReceiverSoftware/include/rapidjson/encodings.h delete mode 100644 slsReceiverSoftware/include/rapidjson/error/en.h delete mode 100644 slsReceiverSoftware/include/rapidjson/error/error.h delete mode 100644 slsReceiverSoftware/include/rapidjson/filereadstream.h delete mode 100644 slsReceiverSoftware/include/rapidjson/filewritestream.h delete mode 100644 slsReceiverSoftware/include/rapidjson/fwd.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/biginteger.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/diyfp.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/dtoa.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/ieee754.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/itoa.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/meta.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/pow10.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/regex.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/stack.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/strfunc.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/strtod.h delete mode 100644 slsReceiverSoftware/include/rapidjson/internal/swap.h delete mode 100644 slsReceiverSoftware/include/rapidjson/istreamwrapper.h delete mode 100644 slsReceiverSoftware/include/rapidjson/memorybuffer.h delete mode 100644 slsReceiverSoftware/include/rapidjson/memorystream.h delete mode 100644 slsReceiverSoftware/include/rapidjson/msinttypes/inttypes.h delete mode 100644 slsReceiverSoftware/include/rapidjson/msinttypes/stdint.h delete mode 100644 slsReceiverSoftware/include/rapidjson/ostreamwrapper.h delete mode 100644 slsReceiverSoftware/include/rapidjson/pointer.h delete mode 100644 slsReceiverSoftware/include/rapidjson/prettywriter.h delete mode 100644 slsReceiverSoftware/include/rapidjson/rapidjson.h delete mode 100644 slsReceiverSoftware/include/rapidjson/reader.h delete mode 100644 slsReceiverSoftware/include/rapidjson/schema.h delete mode 100644 slsReceiverSoftware/include/rapidjson/stream.h delete mode 100644 slsReceiverSoftware/include/rapidjson/stringbuffer.h delete mode 100644 slsReceiverSoftware/include/rapidjson/writer.h delete mode 100755 slsReceiverSoftware/include/receiver_defs.h delete mode 100644 slsReceiverSoftware/include/slsReceiver.h delete mode 100644 slsReceiverSoftware/include/slsReceiverTCPIPInterface.h delete mode 100644 slsReceiverSoftware/include/slsReceiverUsers.h delete mode 100755 slsReceiverSoftware/include/sls_receiver_defs.h delete mode 100644 slsReceiverSoftware/include/sls_receiver_exceptions.h delete mode 100644 slsReceiverSoftware/include/sls_receiver_funcs.h delete mode 100644 slsReceiverSoftware/include/utilities.h delete mode 120000 slsReceiverSoftware/include/versionAPI.h delete mode 100644 slsReceiverSoftware/include/zmq.h delete mode 100644 slsReceiverSoftware/slsReceiverUsers.doxy delete mode 100644 slsReceiverSoftware/src/.cproject delete mode 100644 slsReceiverSoftware/src/.project delete mode 100644 slsReceiverSoftware/src/BinaryFile.cpp delete mode 100644 slsReceiverSoftware/src/DataProcessor.cpp delete mode 100644 slsReceiverSoftware/src/DataStreamer.cpp delete mode 100644 slsReceiverSoftware/src/Fifo.cpp delete mode 100644 slsReceiverSoftware/src/File.cpp delete mode 100644 slsReceiverSoftware/src/HDF5File.cpp delete mode 100644 slsReceiverSoftware/src/Listener.cpp delete mode 100644 slsReceiverSoftware/src/MySocketTCP.cpp delete mode 100644 slsReceiverSoftware/src/ThreadObject.cpp delete mode 100644 slsReceiverSoftware/src/UDPBaseImplementation.cpp delete mode 100644 slsReceiverSoftware/src/UDPInterface.cpp delete mode 100644 slsReceiverSoftware/src/UDPStandardImplementation.cpp delete mode 100644 slsReceiverSoftware/src/main.cpp delete mode 100644 slsReceiverSoftware/src/slsReceiver.cpp delete mode 100644 slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp delete mode 100644 slsReceiverSoftware/src/slsReceiverUsers.cpp delete mode 100644 slsReceiverSoftware/src/utilities.cpp delete mode 100755 slsReceiverSoftware/updateAPIVersion.sh delete mode 100755 slsReceiverSoftware/updateGitVersion.sh diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 68b2b010b..000000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,76 +0,0 @@ -cmake_minimum_required(VERSION 2.8) -set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) -set (CALIBRATE OFF) - -# Check if project is being used directly or via add_subdirectory -set(SLS_MASTER_PROJECT OFF) -if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(SLS_MASTER_PROJECT ON) -endif() - -option (SLS_USE_HDF5 "HDF5 File format" OFF) -option (SLS_USE_TEXTCLIENT "Text Client" OFF) -option (SLS_USE_RECEIVER "Receiver" OFF) -option (SLS_USE_GUI "GUI" OFF) - - -#Flags to always be used -# -Wno-unused-parameter should eventually be removes -# -Wno-overloaded-virtual TODO! remove warnings in refactor -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-overloaded-virtual -Wno-unused-parameter -std=c++98") - -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") - # clang does not support -Wno-misleading-indentation - # add any special clang flags -elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") - if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 6.0) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-misleading-indentation") - endif () -endif() - - -find_package(Qt4) -find_package(Qwt 6) -find_package(CBF) -find_package(Doxygen) -# find_package(PNG REQUIRED) - -if (SLS_USE_HDF5) - find_package(HDF5 1.10 COMPONENTS CXX) -endif (SLS_USE_HDF5) - -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -set(CMAKE_INSTALL_RPATH "$ORIGIN") -set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) - - -if (SLS_USE_TEXTCLIENT) - add_subdirectory(slsDetectorSoftware) -endif (SLS_USE_TEXTCLIENT) - -if (SLS_USE_RECEIVER) - add_subdirectory(slsReceiverSoftware) - add_subdirectory(manual/manual-api) -endif (SLS_USE_RECEIVER) - - -if (SLS_USE_GUI) - if (QT4_FOUND AND QWT_FOUND) - add_subdirectory(slsDetectorGui) - endif() -endif (SLS_USE_GUI) - -if (SLS_MASTER_PROJECT) - # Set targets export name (otherwise set by upstream project) - set(TARGETS_EXPORT_NAME "slsdetector-targets") -endif (SLS_MASTER_PROJECT) - -if (CALIBRATE) - if (DEFINED ENV{ROOTSYS}) - find_package(ROOT) - if (ROOT_FOUND) - add_subdirectory(calibrationWizards) - endif() - endif() -endif(CALIBRATE) diff --git a/Makefile b/Makefile deleted file mode 100755 index 8d4849b75..000000000 --- a/Makefile +++ /dev/null @@ -1,235 +0,0 @@ -# do not change below this line# - -# Include common definitions -include Makefile.include - -INSTALLROOT ?= $(PWD) -BINDIR ?= $(INSTALLROOT)/bin -DOCDIR ?= $(INSTALLROOT)/manual/docs -LIBDIR ?= $(INSTALLROOT)/bin -INCDIR ?= $(INSTALLROOT)/include -DETAILDOC ?= $(INSTALLROOT)/docs - -WD = $(shell pwd) -LIBRARYDIR = $(WD)/slsDetectorSoftware -LIBRARYRXRDIR = $(WD)/slsReceiverSoftware -CLIENTDIR = $(LIBRARYDIR)/slsDetectorClient -GUIDIR = $(WD)/slsDetectorGui -RECEIVERDIR = $(LIBRARYRXRDIR) -CALWIZDIR = $(WD)/calibrationWizards -MANDIR = $(WD)/manual -CALIBDIR = $(WD)/slsDetectorCalibration -MANAPIDIR = $(MANDIR)/manual-api - -TABSPACE := "\t" - - -INCLUDES=-I. -I$(LIBRARYDIR)/commonFiles -I$(LIBRARYDIR)/slsDetector -I$(LIBRARYDIR)/usersFunctions -I$(LIBRARYDIR)/multiSlsDetector -I$(LIBRARYDIR)/slsDetectorUtils -I$(LIBRARYDIR)/slsDetectorCommand -I$(LIBRARYDIR)/slsDetectorAnalysis -I$(LIBRARYDIR)/slsReceiverInterface -I$(LIBRARYRXRDIR)/include -I$(LIBRARYDIR)/threadFiles -I$(LIBRARYDIR)/sharedMemory -I$(ASM) - -INCLUDESRXR += -I. -I$(LIBRARYRXRDIR)/include -I$(CALIBDIR) -I$(ASM) -#LIBFLAGRXR += - -$(info ) -$(info #######################################) -$(info # In slsDetectorsPackage Makefile #) -$(info #######################################) -$(info ) - - -.PHONY: all nonstatic static lib libreceiver textclient receiver gui stextclient sreceiver - -#all: lib textclient receiver gui -all: textclient receiver gui - -nonstatic: lib libreceiver textclient receiver gui - -static: lib libreceiver stextclient sreceiver gui - - -lib: - cd $(LIBRARYDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(LIBDIR)' LIBRARYDIR='$(LIBRARYDIR)' LIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)' - -libreceiver: - cd $(LIBRARYRXRDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(LIBDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)' - - -stextclient: slsDetectorClient_static - -slsDetectorClient: textclient - -slsDetectorClient_static: #lib - cd $(CLIENTDIR) && $(MAKE) static_clients FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBRARYDIR='$(LIBRARYDIR)' LIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)' - @echo "" - @echo "#######################################" - @echo "# Back in slsDetectorPackage Makefile #" - @echo "#######################################" - @echo "" - -textclient: #lib - cd $(CLIENTDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBRARYDIR='$(LIBRARYDIR)' LIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)' - @echo "" - @echo "#######################################" - @echo "# Back in slsDetectorPackage Makefile #" - @echo "#######################################" - @echo "" - -slsReceiver: receiver - -slsReceiver_static: receiver - -receiver: #libreceiver -# cd $(RECEIVERDIR) && $(MAKE) receiver FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)' - cd $(RECEIVERDIR) && $(MAKE) FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)' - cd $(MANAPIDIR) && $(MAKE) slsMultiReceiver - @echo "" - @echo "#######################################" - @echo "# Back in slsDetectorPackage Makefile #" - @echo "#######################################" - @echo "" - -sreceiver: #libreceiver - cd $(RECEIVERDIR) && $(MAKE) static_receiver FLAGS='$(FLAGS)' DESTDIR='$(BINDIR)' LIBS='$(LDFLAGRXR)' INCLUDES='$(INCLUDESRXR)' LIBDIR='$(LIBDIR)' - @echo "" - @echo "#######################################" - @echo "# Back in slsDetectorPackage Makefile #" - @echo "#######################################" - @echo "" - -slsDetectorGUI: #lib - cd $(GUIDIR) && $(MAKE) DESTDIR='$(BINDIR)' LIBRARYDIR='$(LIBRARYDIR)' INCLUDES='$(INCLUDES)' LDFLAGDET='$(LDFLAGDETONLY)' LIBDIR='$(LIBDIR)' - @echo "" - @echo "#######################################" - @echo "# Back in slsDetectorPackage Makefile #" - @echo "#######################################" - @echo "" - -calWiz: - cd $(CALWIZDIR) && $(MAKE) DESTDIR=$(BINDIR) #FLAGS=$(FLAGS) LDFLAGDET=$(LDFLAGDET) INCLUDES=$(INCLUDES) - - - -gui: slsDetectorGUI - - -doc: - $(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR)) - cd manual && make all DESTDIR=$(DOCDIR) - -htmldoc: - make doc - $(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR)) - cd manual && make html DESTDIR=$(DOCDIR) - -detaildoc: createdocs docspdf docshtml removedocs - -createdocs: $(LIBRARYDIR)/doxy.config - doxygen $(LIBRARYDIR)/doxy.config - -docspdf: - cd slsDetectorPackageDocs/latex && make - $(shell test -d $(DETAILDOC) || mkdir -p $(DETAILDOC)) - $(shell test -d $(DETAILDOC)/pdf || mkdir -p $(DETAILDOC)/pdf) - mv slsDetectorPackageDocs/latex/refman.pdf $(DETAILDOC)/pdf/slsDetectorPackageDocs.pdf - -docshtml: - $(shell test -d $(DETAILDOC) || mkdir -p $(DETAILDOC)) - $(shell test -d $(DETAILDOC)/html || mkdir -p $(DETAILDOC)/html) - $(shell test -d $(DETAILDOC)/html/slsDetectorPackageDocs && rm -r $(DETAILDOC)/html/slsDetectorPackageDocs) - mv slsDetectorPackageDocs/html $(DETAILDOC)/html/slsDetectorPackageDocs - -removedocs: - rm -rf slsDetectorPackageDocs; - - -clean: - cd $(BINDIR) && rm -rf sls_detector_* slsDetectorGui slsReceiver angularCalibrationWizard energyCalibrationWizard - cd $(LIBDIR) && rm -rf libSlsDetector.so libSlsDetector.a libSlsReceiver.so libSlsReceiver.a - cd $(LIBRARYDIR) && $(MAKE) clean - cd $(LIBRARYRXRDIR) && $(MAKE) clean - cd $(CLIENTDIR) && $(MAKE) clean - cd $(GUIDIR) && $(MAKE) clean - cd $(CALWIZDIR) && $(MAKE) clean - cd manual && $(MAKE) clean - cd $(DOCDIR) && rm -rf * - rm -rf slsDetectorPackageDocs; - rm -rf $(DETAILDOC) - rm -rf $(MANAPIDIR)/slsMultiReceiver - - -#install_lib: -# cd $(LIBRARYDIR) && $(MAKE) install DESTDIR=$(LIBDIR) INCLUDES=$(INCLUDES) -# cd $(LIBRARYDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR) - -mythen_virtual: - cd $(LIBRARYDIR) && $(MAKE) mythenVirtualServer DESTDIR=$(BINDIR) - - -gotthard_virtual: - cd $(LIBRARYDIR) && $(MAKE) gotthardVirtualServer DESTDIR=$(BINDIR) - - -install_client: textclient slsReceiver - -install_gui: gui - -confinstall: - make conf;\ - make install - -install_lib: - make lib;\ - make libreceiver; \ - make textclient; \ - make slsReceiver; \ - make doc; \ - make htmldoc; \ - cd $(LIBRARYDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR); \ - cd $(LIBRARYRXRDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR); - -install: - make install_lib; \ - make gui; \ - make calWiz; \ - cd $(LIBRARYDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR);\ - cd $(LIBRARYRXRDIR) && $(MAKE) install_inc DESTDIR=$(INCDIR); - -conf: - set -e; \ - . ./configure; \ - @echo "INSTALLROOT is $(INSTALLROOT)" - @echo "BINDIR is $(BINDIR)" - @echo "LIBDIR is $(LIBDIR)" - @echo "INCDIR is $(INCDIR)" - @echo "DOCDIR is $(DOCDIR)" - - -help: - @echo "Targets:" - @echo "make all compile library, text clients, data reciever" - @echo "make lib compile library" - @echo "make libreceiver compile receiver library" - @echo "make textclient compile the slsDetectorClient dynamically linking the libraries" - @echo "make stextclient compile slsDetectorClient statically linking the libraries" - @echo "make receiver compile the slsReciever dynamically linking the libraries" - @echo "make sreceiver compile the slsReciever statically linking the libraries" - @echo "make gui compile slsDetectorGUI - requires a working Qt4 and Qwt installation" - @echo "make calWiz compile the calibration wizards - requires a working Root installation" - @echo "make doc compile pdf documentation" - @echo "make htmldoc compile html (and pdf) documentation" - @echo "make install_lib installs the libraries, the text clients, the documentation and the includes for the API" - @echo "make install installs all software, including the gui, the cal wizards and the includes for the API" - @echo "make confinstall installs all software, including the gui, the cal wizards and the includes for the API, prompting for the install paths" - @echo "make clean remove object files and executables" - @echo "make help lists possible targets" - @echo "" - @echo "" - @echo "Makefile variables" - @echo "DEBUG=1,2 set debug level to 1 (VERBOSE) or 2 (VERYVERBOSE)" - @echo "" - @echo "" - @echo "Variables - to change them run :" - @echo "INSTALLROOT=: installation root di r, default $PWD" - @echo "BINDIR=: binary installation dir below INSTALLROOT, default bin" - @echo "LIBDIR=: library installation dir below INSTALLROOT, default lib" - @echo "INCDIR=: header installation dir below INSTALLROOT, default include" - @echo "DOCDIR=: documentation installation dir below INSTALLROOT, default doc" diff --git a/Makefile.include b/Makefile.include deleted file mode 100755 index 71dba3160..000000000 --- a/Makefile.include +++ /dev/null @@ -1,58 +0,0 @@ -############################################################## -# Generic -############################################################## - -CC = g++ -CXX = $(CC) -ASM=$(shell echo "/lib/modules/`uname -r`/build/include") -LDFLAGDETONLY = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -LDFLAGDET = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector -L/usr/lib64/ -pthread -LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L/usr/lib64/ -pthread -FLAGS= -Wall -pthread #-DEIGER_DEBUG2 -# -DVERBOSE - -# Setting up the verbose flags -ifeq ($(DEBUG),1) - FLAGS = -Wall -DVERBOSE -endif -ifeq ($(DEBUG),2) - FLAGS = -Wall -DVERYVERBOSE -endif - -############################################################## -# HDF5 specific. Set this to yes, if you want to compile -# HDF5 code: in this case, you need HDF5 libraries -############################################################## - -HDF5 = no -HDF5_DIR = /opt/hdf5v1.10.0 - -ifeq ($(HDF5),yes) - LDFLAGRXR = -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsReceiver -L$(HDF5_DIR)/lib -Wl,-rpath=$(HDF5_DIR)/lib -lhdf5 -lhdf5_cpp -lsz -lz -DHDF5C -L/usr/lib64/ -pthread - INCLUDESRXR = -I$(HDF5_DIR)/include -endif - - -############################################################## -# ROOTSLS specific. Set this to yes, if you want to compile -# ROOTSLS code: in this case, you need also root libraries -############################################################## - -ROOTSLS = no - -ROOTFLAGS = $(shell root-config --cflags --glibs) -DMYROOT1 #-DALLFILE_DEBUG #-DMYROOT1 - -ifeq ($(ROOTSLS),yes) - LDFLAGRXR = -L$(LIBDIR) -lSlsReceiver $(ROOTFLAGS) -DROOTSLS -endif - - -define colorecho - @tput setaf 6 - @echo $1 - @tput sgr0 -endef - - - - diff --git a/README.md b/README.md deleted file mode 100644 index e142ff84b..000000000 --- a/README.md +++ /dev/null @@ -1,91 +0,0 @@ -### Documentation -Detailed documentation can be found on the [official site.](https://www.psi.ch/detectors/users-support) - -### Binaries -Documentation to obtain the binaries via the conda package is available for [lib](https://github.com/slsdetectorgroup/sls_detector_lib) and [gui](https://github.com/slsdetectorgroup/sls_detector_gui) - -### Source code -One can also obtain the source code from this repository and compile while realizing the setup dependencies as required. -``` -git clone https://github.com/slsdetectorgroup/slsDetectorPackage.git - -``` -#### Setup dependencies -* Gui Client
-Requirements: Qt 4.8 and Qwt 6.0 -``` - export QTDIR=/usr/local/Trolltech/ - export QWTDIR=/usr/local/qwt-6.0.1/ -``` -If either of them does not exist, the GUI client will not be built. - -* Advanced user Calibration wizards
-Requirements: ROOT -``` - export ROOTSYS=/usr/local/root-5.34 -``` - -#### Compilation - -Compiling can be done in two ways. - -**1. Compile using script cmk.sh**
- -After compiling, the libraries and executables will be found in `slsDetectorPackage/build/bin` directory
- -Usage: [-c] [-b] [-h] [-d HDF5 directory] [-j]
- * -[no option]: only make
- * -c: Clean
- * -b: Builds/Rebuilds CMake files normal mode
- * -h: Builds/Rebuilds Cmake files with HDF5 package
- * -d: HDF5 Custom Directory
- * -t: Build/Rebuilds only text client
- * -r: Build/Rebuilds only receiver
- * -g: Build/Rebuilds only gui
- * -j: Number of threads to compile through
- * -e: Debug mode - -Basic Option: -./cmk.sh -b - -For only make: -./cmk.sh - -For make clean;make: -./cmk.sh -c - -For using hdf5 without custom dir /blabla: -./cmk.sh -h -d /blabla - -For rebuilding cmake without hdf5 -./cmk.sh -b - -For using multiple cores to compile faster: -./cmk.sh -j9
- - -For rebuilding only certain sections
-./cmk.sh -tg #only text client and gui
-./cmk.sh -r #only receiver
- - -**2. Compile without script**
-Use cmake to create out-of-source builds, by creating a build folder parallel to source directory. -``` - $ cd .. - $ mkdir slsDetectorPackage-build - $ cd slsDetectorPackage-build - $ cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_HDF5=OFF - $ make -``` - -Use the following as an example to compile statically and using specific hdf5 folder -``` - $ HDF5_ROOT=/opt/hdf5v1.10.0 cmake ../slsDetectorPackage -DCMAKE_BUILD_TYPE=Debug -DSLS_USE_HDF5=ON - ``` -After compiling, the libraries and executables will be found at `bin` directory -``` - $ ls bin/ - gui_client libSlsDetector.a libSlsDetector.so libSlsReceiver.a libSlsReceiver.so - sls_detector_acquire sls_detector_get slsDetectorGui sls_detector_help sls_detector_put slsReceiver slsMultiReceiver -``` diff --git a/RELEASE.txt b/RELEASE.txt deleted file mode 100644 index 74e9ca8c6..000000000 --- a/RELEASE.txt +++ /dev/null @@ -1,205 +0,0 @@ -SLS Detector Package 4.0.1 released on 08.02.2018 (Bug Fix Release) -=================================================================== - - -This document describes the differences between 4.0.1 and 4.0.0 releases. - - CONTENTS - -------- - 1. Topics Concerning - 2. Resolved Issues - 3. Known Issues - 4. Firmware Requirements - 5. Download, Documentation & Support - - - -1. Topics Concerning -==================== - - - Jungfrau server (new firmware mapped) - - Eiger server (measuredPeriod, reg) - - Gotthard server(ADC channel shift, ROI, 25um slave packets) - - Receiver (padding, releasing resources segfault, gappixels) - - Users class (detectorSize, ROI, versions, status) - - API (config error, ROI) - - Compile (Options prefix, static libraries, Makefile for API) - - Gui (multi module) - - - -2. Resolved Issues -================== - - Detector Server - --------------- - - 1. (Jungfrau): Latest Jungfrau firmware release mapped. - - 2. (Eiger): Measured subperiod initially wrapped around 4.29s. Now, upto 42.9s. - - Advanced command "reg" was writing only to right FPGA. - - 3. (Gotthard 25/50um): Since Gotthard only sends packet numbers, one had to - remember to take even number of images in ROI mode, if they wanted to - switch back to non ROI mode. - This is fixed now, but temporary fix involves sending an image during - configuration, which will not be captured by the receiver. Hence, it takes - longer to configure. Permanent fix will require a firmware update. - - The detector output is shifted by 1 for every 32 channels. This is fixed now. - - - Receiver - -------- - - 1. Receiver padding was enabled only if deactivated padding was also enabled. - Receiver padding enable and receiver deactivated padding enable are independent now. - - 2. Starting and stopping receiver without listening resulted in seg faults. - - 3. Gappixels in receiver bug fix. - - - Client - ------ - - 1. (Users class): DetectorSize modified to set/get ROI if ROI is only 1 in number. - - Allowed setting/getting ROI at single detector level via API. - (ROI for Gotthard only). Added them to the users class as setROI and getROI. - - Retrieving versions at module level is possible now. - - Added "stopped" as status in getRunStatus list. - - 2. (API): Incorrect mac address in config file will set error flag in API and not just - print the error. - - ROI possible at module level. - - - Compile - ------- - - 1. CMake options now have a prefix 'SLS_'. - - 2. Static libraries removed. - - 2. slsDetectorPackage/manual/manual-api/Makefile modified to use libraries - from slsDetectorPackage/bin as the main Makefile copies the libraries there. - No effect when using CMakeFiles. - - - Gui - --- - - 1. Adding multiple detectors in x and y direction incremented number of detectors - in y direction incorrectly. Effect seen only in GUI (segfault) if - detsizechan has multi detectors in both direction. Fixed. - - - -3. Known Issues -=============== - - Detector Specific - ----------------- - - 1. (Gotthard 25 um): Slave misses or captures an extra frame. Occurs irregularly. - - 2. (Gotthard 25/50um): Using ROI (2 chips, 256 channels) missses last pixel - of that ADC. - - - -4. Firmware Requirements -======================== - - Gotthard - ======== - Minimum compatible version : 11.01.2013 - Latest compatible version : 08.02.2018 (50um and 25um Master) - 09.02.2018 (25 um Slave) - Eiger - ===== - Minimum compatible version : 22 - Latest compatible version : 22 - - Jungfrau - ======== - Minimum compatible version : 26.02.2018 - Latest compatible version : 06.12.2018 - - - Detector Upgrade - ================ - Gotthard Cannot be upgraded remotely. Requires programming via USB blaster - Eiger Can be upgraded remotely via bit files - Jungfrau Can be upgraded remotely using sls_detector_put programfpga - - Instructions available at - https://www.psi.ch/detectors/installation-instructions - under Detector Upgrade -> [Detector Type] -> Firmware. - - - Please refer to the link below for more details on the firmware versions. - https://www.psi.ch/detectors/firmware. - - - -5. Download, Documentation & Support -==================================== - - Download - -------- - - The Source Code (Default C++ API): - https://github.com/slsdetectorgroup/slsDetectorPackage - - The Conda Lib Package: - https://github.com/slsdetectorgroup/sls_detector_lib - - The Conda GUI Package: - https://github.com/slsdetectorgroup/sls_detector_gui - - The Python Interface (including the package): - https://github.com/slsdetectorgroup/sls_detector - - - Documentation - ------------- - - Manual (HTML & PDF): - https://www.psi.ch/detectors/documentation - slsDetectorPackage/manual/docs/ - - Command Line Documentation: - manual/docs/html/slsDetectorClientDocs/index.html - manual/docs/pdf/slsDetectorClientDocs.pdf - - C++ API Documentation: - manual/docs/html/slsDetectorUsersDocs/index.html - manual/docs/pdf/slsDetectorUsersDocs.pdf - - C++ API Example: - manual/manual-api/mainClient.cpp - manual/manual-api/mainReceiver.cpp - - Python API Documentation: - https://slsdetectorgroup.github.io/sls_detector/ - - Further Documentation: - https://www.psi.ch/detectors/users-support - - - Support - ------- - - General Software related: - dhanya.thattil@psi.ch - anna.bergamaschi@psi.ch - - Python related: - erik.frojdh@psi.ch - diff --git a/cleansharedmemory.sh b/cleansharedmemory.sh deleted file mode 100644 index ab6ad287b..000000000 --- a/cleansharedmemory.sh +++ /dev/null @@ -1 +0,0 @@ -rm /dev/shm/slsDetectorPackage*; diff --git a/cmake/FindCBF.cmake b/cmake/FindCBF.cmake deleted file mode 100644 index df358ab79..000000000 --- a/cmake/FindCBF.cmake +++ /dev/null @@ -1,11 +0,0 @@ -FIND_PATH (CBF_INCLUDE_DIR - ${CBF_DIR}/include - ${CBF_DIR}/include/cbflib -) -FIND_LIBRARY (CBF_LIBRARY - NAMES cbf - HINTS ${CBF_DIR}/lib -) -INCLUDE ( FindPackageHandleStandardArgs ) -FIND_PACKAGE_HANDLE_STANDARD_ARGS (CBF DEFAULT_MSG CBF_LIBRARY CBF_INCLUDE_DIR ) - diff --git a/cmake/FindQwt.cmake b/cmake/FindQwt.cmake deleted file mode 100644 index f1e833e27..000000000 --- a/cmake/FindQwt.cmake +++ /dev/null @@ -1,118 +0,0 @@ -# Qt Widgets for Technical Applications -# available at http://www.http://qwt.sourceforge.net/ -# -# The module defines the following variables: -# QWT_FOUND - the system has Qwt -# QWT_INCLUDE_DIR - where to find qwt_plot.h -# QWT_INCLUDE_DIRS - qwt includes -# QWT_LIBRARY - where to find the Qwt library -# QWT_LIBRARIES - aditional libraries -# QWT_MAJOR_VERSION - major version -# QWT_MINOR_VERSION - minor version -# QWT_PATCH_VERSION - patch version -# QWT_VERSION_STRING - version (ex. 5.2.1) -# QWT_ROOT_DIR - root dir (ex. /usr/local) - -#============================================================================= -# Copyright 2010-2013, Julien Schueller -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -# The views and conclusions contained in the software and documentation are those -# of the authors and should not be interpreted as representing official policies, -# either expressed or implied, of the FreeBSD Project. -#============================================================================= - - -find_path ( QWT_INCLUDE_DIR - NAMES qwt_plot.h - HINTS $ENV{QWTDIR} $ENV{QWTDIR}/src ${QT_INCLUDE_DIR} - PATH_SUFFIXES qwt qwt-qt3 qwt-qt4 qwt-qt5 -) - -set ( QWT_INCLUDE_DIRS ${QWT_INCLUDE_DIR} ) - -# version -set ( _VERSION_FILE ${QWT_INCLUDE_DIR}/qwt_global.h ) -if ( EXISTS ${_VERSION_FILE} ) - file ( STRINGS ${_VERSION_FILE} _VERSION_LINE REGEX "define[ ]+QWT_VERSION_STR" ) - if ( _VERSION_LINE ) - string ( REGEX REPLACE ".*define[ ]+QWT_VERSION_STR[ ]+\"(.*)\".*" "\\1" QWT_VERSION_STRING "${_VERSION_LINE}" ) - string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" QWT_MAJOR_VERSION "${QWT_VERSION_STRING}" ) - string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" QWT_MINOR_VERSION "${QWT_VERSION_STRING}" ) - string ( REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\3" QWT_PATCH_VERSION "${QWT_VERSION_STRING}" ) - endif () -endif () - - -# check version -set ( _QWT_VERSION_MATCH TRUE ) -if ( Qwt_FIND_VERSION AND QWT_VERSION_STRING ) - if ( Qwt_FIND_VERSION_EXACT ) - if ( NOT Qwt_FIND_VERSION VERSION_EQUAL QWT_VERSION_STRING ) - set ( _QWT_VERSION_MATCH FALSE ) - endif () - else () - if ( QWT_VERSION_STRING VERSION_LESS Qwt_FIND_VERSION ) - set ( _QWT_VERSION_MATCH FALSE ) - endif () - endif () -endif () - - -find_library ( QWT_LIBRARY - NAMES qwt qwt-qt3 qwt-qt4 qwt-qt5 - HINTS $ENV{QWTDIR}/lib ${QT_LIBRARY_DIR} -) - -set ( QWT_LIBRARIES ${QWT_LIBRARY} ) - - -# try to guess root dir from include dir -if ( QWT_INCLUDE_DIR ) - string ( REGEX REPLACE "(.*)/include.*" "\\1" QWT_ROOT_DIR ${QWT_INCLUDE_DIR} ) -# try to guess root dir from library dir -elseif ( QWT_LIBRARY ) - string ( REGEX REPLACE "(.*)/lib[/|32|64].*" "\\1" QWT_ROOT_DIR ${QWT_LIBRARY} ) -endif () - - -# handle the QUIETLY and REQUIRED arguments -include ( FindPackageHandleStandardArgs ) -if ( CMAKE_VERSION LESS 2.8.3 ) - find_package_handle_standard_args( Qwt DEFAULT_MSG QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH ) -else () - find_package_handle_standard_args( Qwt REQUIRED_VARS QWT_LIBRARY QWT_INCLUDE_DIR _QWT_VERSION_MATCH VERSION_VAR QWT_VERSION_STRING ) -endif () - - -mark_as_advanced ( - QWT_LIBRARY - QWT_LIBRARIES - QWT_INCLUDE_DIR - QWT_INCLUDE_DIRS - QWT_MAJOR_VERSION - QWT_MINOR_VERSION - QWT_PATCH_VERSION - QWT_VERSION_STRING - QWT_ROOT_DIR -) diff --git a/cmake/FindROOT.cmake b/cmake/FindROOT.cmake deleted file mode 100644 index 80662ab0e..000000000 --- a/cmake/FindROOT.cmake +++ /dev/null @@ -1,167 +0,0 @@ -# - Finds ROOT instalation -# This module sets up ROOT information -# It defines: -# ROOT_FOUND If the ROOT is found -# ROOT_INCLUDE_DIR PATH to the include directory -# ROOT_LIBRARIES Most common libraries -# ROOT_GUI_LIBRARIES Most common libraries + GUI -# ROOT_LIBRARY_DIR PATH to the library directory - - -find_program(ROOT_CONFIG_EXECUTABLE root-config - PATHS $ENV{ROOTSYS}/bin) - -if(NOT ROOT_CONFIG_EXECUTABLE) - set(ROOT_FOUND FALSE) -else() - set(ROOT_FOUND TRUE) - - execute_process( - COMMAND ${ROOT_CONFIG_EXECUTABLE} --prefix - OUTPUT_VARIABLE ROOTSYS - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND ${ROOT_CONFIG_EXECUTABLE} --version - OUTPUT_VARIABLE ROOT_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND ${ROOT_CONFIG_EXECUTABLE} --incdir - OUTPUT_VARIABLE ROOT_INCLUDE_DIR - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND ${ROOT_CONFIG_EXECUTABLE} --libs - OUTPUT_VARIABLE ROOT_LIBRARIES - OUTPUT_STRIP_TRAILING_WHITESPACE) - - execute_process( - COMMAND ${ROOT_CONFIG_EXECUTABLE} --glibs - OUTPUT_VARIABLE ROOT_GUI_LIBRARIES - OUTPUT_STRIP_TRAILING_WHITESPACE) - - #set(ROOT_LIBRARIES ${ROOT_LIBRARIES} -lThread -lMinuit -lHtml -lVMC -lEG -lGeom -lTreePlayer -lXMLIO -lProof) - #set(ROOT_LIBRARIES ${ROOT_LIBRARIES} -lProofPlayer -lMLP -lSpectrum -lEve -lRGL -lGed -lXMLParser -lPhysics) - set(ROOT_LIBRARY_DIR ${ROOTSYS}/lib) - - # Make variables changeble to the advanced user - mark_as_advanced(ROOT_CONFIG_EXECUTABLE) - - if(NOT ROOT_FIND_QUIETLY) - message(STATUS "Found ROOT ${ROOT_VERSION} in ${ROOTSYS}") - endif() -endif() - - -include(CMakeParseArguments) -find_program(ROOTCINT_EXECUTABLE rootcint PATHS $ENV{ROOTSYS}/bin) -find_program(GENREFLEX_EXECUTABLE genreflex PATHS $ENV{ROOTSYS}/bin) -find_package(GCCXML) - -#---------------------------------------------------------------------------- -# function ROOT_GENERATE_DICTIONARY( dictionary -# header1 header2 ... -# LINKDEF linkdef1 ... -# OPTIONS opt1...) -function(ROOT_GENERATE_DICTIONARY dictionary) - CMAKE_PARSE_ARGUMENTS(ARG "" "" "LINKDEF;OPTIONS" "" ${ARGN}) - #---Get the list of header files------------------------- - set(headerfiles) - foreach(fp ${ARG_UNPARSED_ARGUMENTS}) - file(GLOB files ${fp}) - if(files) - foreach(f ${files}) - if(NOT f MATCHES LinkDef) - set(headerfiles ${headerfiles} ${f}) - endif() - endforeach() - else() - set(headerfiles ${headerfiles} ${fp}) - endif() - endforeach() - #---Get the list of include directories------------------ - get_directory_property(incdirs INCLUDE_DIRECTORIES) - set(includedirs) - foreach( d ${incdirs}) - set(includedirs ${includedirs} -I${d}) - endforeach() - #---Get LinkDef.h file------------------------------------ - set(linkdefs) - foreach( f ${ARG_LINKDEF}) - if( IS_ABSOLUTE ${f}) - set(linkdefs ${linkdefs} ${f}) - else() - if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/inc/${f}) - set(linkdefs ${linkdefs} ${CMAKE_CURRENT_SOURCE_DIR}/inc/${f}) - else() - set(linkdefs ${linkdefs} ${CMAKE_CURRENT_SOURCE_DIR}/${f}) - endif() - endif() - endforeach() - #---call rootcint------------------------------------------ - add_custom_command(OUTPUT ${dictionary}.cxx ${dictionary}.h - COMMAND ${ROOTCINT_EXECUTABLE} -cint -f ${dictionary}.cxx - -c ${ARG_OPTIONS} ${includedirs} ${headerfiles} ${linkdefs} - DEPENDS ${headerfiles} ${linkdefs}) -endfunction() - -#---------------------------------------------------------------------------- -# function REFLEX_GENERATE_DICTIONARY(dictionary -# header1 header2 ... -# SELECTION selectionfile ... -# OPTIONS opt1...) -function(REFLEX_GENERATE_DICTIONARY dictionary) - CMAKE_PARSE_ARGUMENTS(ARG "" "" "SELECTION;OPTIONS" "" ${ARGN}) - #---Get the list of header files------------------------- - set(headerfiles) - foreach(fp ${ARG_UNPARSED_ARGUMENTS}) - file(GLOB files ${fp}) - if(files) - foreach(f ${files}) - set(headerfiles ${headerfiles} ${f}) - endforeach() - else() - set(headerfiles ${headerfiles} ${fp}) - endif() - endforeach() - #---Get Selection file------------------------------------ - if(IS_ABSOLUTE ${ARG_SELECTION}) - set(selectionfile ${ARG_SELECTION}) - else() - set(selectionfile ${CMAKE_CURRENT_SOURCE_DIR}/${ARG_SELECTION}) - endif() - #---Get the list of include directories------------------ - get_directory_property(incdirs INCLUDE_DIRECTORIES) - set(includedirs) - foreach( d ${incdirs}) - set(includedirs ${includedirs} -I${d}) - endforeach() - #---Get preprocessor definitions-------------------------- - get_directory_property(defs COMPILE_DEFINITIONS) - foreach( d ${defs}) - set(definitions ${definitions} -D${d}) - endforeach() - #---Nanes and others--------------------------------------- - set(gensrcdict ${dictionary}.cpp) - if(MSVC) - set(gccxmlopts "--gccxmlopt=\"--gccxml-compiler cl\"") - else() - #set(gccxmlopts "--gccxmlopt=\'--gccxml-cxxflags -m64 \'") - set(gccxmlopts) - endif() - #set(rootmapname ${dictionary}Dict.rootmap) - #set(rootmapopts --rootmap=${rootmapname} --rootmap-lib=${libprefix}${dictionary}Dict) - #---Check GCCXML and get path----------------------------- - if(GCCXML) - get_filename_component(gccxmlpath ${GCCXML} PATH) - else() - message(WARNING "GCCXML not found. Install and setup your environment to find 'gccxml' executable") - endif() - #---Actual command---------------------------------------- - add_custom_command(OUTPUT ${gensrcdict} ${rootmapname} - COMMAND ${GENREFLEX_EXECUTABLE} ${headerfiles} -o ${gensrcdict} ${gccxmlopts} ${rootmapopts} --select=${selectionfile} - --gccxmlpath=${gccxmlpath} ${ARG_OPTIONS} ${includedirs} ${definitions} - DEPENDS ${headerfiles} ${selectionfile}) -endfunction() - diff --git a/cmk.sh b/cmk.sh deleted file mode 100755 index d73649f99..000000000 --- a/cmk.sh +++ /dev/null @@ -1,204 +0,0 @@ -#!/bin/bash -BUILDDIR="build" -HDF5DIR="/opt/hdf5v1.10.0" -HDF5=0 -COMPILERTHREADS=0 -TEXTCLIENT=0 -RECEIVER=0 -GUI=0 -DEBUG=0 - - -CLEAN=0 -REBUILD=0 -CMAKE_PRE="" -CMAKE_POST="" - -usage() { echo -e " -Usage: $0 [-c] [-b] [-h] [-d ] [-j] - -[no option]: only make - -c: Clean - -b: Builds/Rebuilds CMake files normal mode - -h: Builds/Rebuilds Cmake files with HDF5 package - -d: HDF5 Custom Directory - -t: Build/Rebuilds only text client - -r: Build/Rebuilds only receiver - -g: Build/Rebuilds only gui - -j: Number of threads to compile through - -e: Debug mode - -For only make: -./cmk.sh - -For make clean;make: -./cmk.sh -c - -For using hdf5 without default dir /opt/hdf5v1.10.0: -./cmk.sh -h - -For using hdf5 without custom dir /blabla: -./cmk.sh -h -d /blabla - -For rebuilding cmake without hdf5 (Use this if you had previously run with hdf5 and now you dont want it) -./cmk.sh -b - -For using multiple cores to compile faster: -(all these options work) -./cmk.sh -j9 -./cmk.sh -cj9 #with clean -./cmk.sh -hj9 #with hdf5 -./cmk.sh -j9 -h #with hdf - -For rebuilding only certain sections -./cmk.sh -tg #only text client and gui -./cmk.sh -r #only receiver - - " ; exit 1; } - -while getopts ":bchd:j:trge" opt ; do - case $opt in - b) - echo "Building of CMake files Required" - REBUILD=1 - ;; - c) - echo "Clean Required" - CLEAN=1 - ;; - h) - echo "Building of CMake files with HDF5 option Required" - HDF5=1 - REBUILD=1 - ;; - d) - echo "New HDF5 directory: $OPTARG" - HDF5DIR=$OPTARG - ;; - j) - echo "Number of compiler threads: $OPTARG" - COMPILERTHREADS=$OPTARG - ;; - t) - echo "Compiling Options: Text Client" - TEXTCLIENT=1 - REBUILD=1 - ;; - r) - echo "Compiling Options: Receiver" - RECEIVER=1 - REBUILD=1 - ;; - g) - echo "Compiling Options: GUI" - GUI=1 - REBUILD=1 - ;; - e) - echo "Compiling Options: Debug" - DEBUG=1 - ;; - \?) - echo "Invalid option: -$OPTARG" - usage - exit 1 - ;; - :) - echo "Option -$OPTARG requires an argument." - usage - exit 1 - ;; - esac -done - - - - - - -if [ $TEXTCLIENT -eq 0 ] && [ $RECEIVER -eq 0 ] && [ $GUI -eq 0 ]; then - CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=ON -DSLS_USE_GUI=ON " - echo "Compile Option: TextClient, Receiver and GUI" -else - if [ $TEXTCLIENT -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON " - echo "Compile Option: TextClient" - fi - if [ $RECEIVER -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_RECEIVER=ON " - echo "Compile Option: Receiver" - fi - - if [ $GUI -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_GUI=ON " - echo "Compile Option: GUI" - fi -fi - - - - - -#build dir doesnt exist -if [ ! -d "$BUILDDIR" ] ; then - echo "No Build Directory. Building of Cmake files required" - mkdir $BUILDDIR; - REBUILD=1 -else - #rebuild not requested, but no makefile - if [ $REBUILD -eq 0 ] && [ ! -f "$BUILDDIR/Makefile" ] ; then - echo "No Makefile. Building of Cmake files required" - REBUILD=1 - fi -fi - -#Debug -if [ $DEBUG -eq 1 ]; then - CMAKE_POST+=" -DCMAKE_BUILD_TYPE=Debug " - echo "Debug Option enabled" -fi - - -#hdf5 rebuild -if [ $HDF5 -eq 1 ]; then - CMAKE_PRE+="HDF5_ROOT="$HDF5DIR - CMAKE_POST+=" -DSLS_USE_HDF5=ON " -#normal mode rebuild -else - CMAKE_POST+=" -DSLS_USE_HDF5=OFF " -fi - - -#enter build dir -cd $BUILDDIR; -echo "in "$PWD - - - -#cmake -if [ $REBUILD -eq 1 ]; then - rm -f CMakeCache.txt - BUILDCOMMAND="$CMAKE_PRE cmake $CMAKE_POST .." - echo $BUILDCOMMAND - eval $BUILDCOMMAND -fi - -#make clean -if [ $CLEAN -eq 1 ]; then - make clean; -fi - - -#make -if [ $COMPILERTHREADS -gt 0 ]; then - BUILDCOMMAND="make -j$COMPILERTHREADS" - echo $BUILDCOMMAND - eval $BUILDCOMMAND -else - make -fi - - - - - - diff --git a/commitVersions.sh b/commitVersions.sh deleted file mode 100644 index a3cbc5f44..000000000 --- a/commitVersions.sh +++ /dev/null @@ -1,15 +0,0 @@ -sh updateSvnVersion.sh - -cd slsDetectorGui -git commit -a -m "updating versions" -git push origin developer:developer - -cd ../slsDetectorSoftware -git commit -a -m "updating versions" -git push origin developer:developer - -cd ../slsReceiverSoftware -git commit -a -m "updating versions" -git push origin developer:developer - -cd .. diff --git a/configure b/configure deleted file mode 100755 index a58728f9f..000000000 --- a/configure +++ /dev/null @@ -1,58 +0,0 @@ -##!/bin/bash - -: ${INSTALLROOT=$PWD} -read -p "Installation directory [default:\"$INSTALLROOT\"]:" -e t3 -if [ -z "$t3" ] -then -echo -else - INSTALLROOT=$t3 -fi -echo "INSTALLROOT will be \"$INSTALLROOT\"" -export INSTALLROOT - -: ${BINDIR="bin"} -read -p "Binaries directory [default:\"$BINDIR\"]:" -e t4 -if [ -z "$t4" ] -then - BINDIR=$INSTALLROOT/$BINDIR -else - BINDIR=$INSTALLROOT/$t4 -fi -echo "BINDIR will be \"$BINDIR\"" -export BINDIR - -: ${LIBDIR="bin"} -read -p "Libraries directory [default:\"$LIBDIR\"]:" -e t5 -if [ -z "$t5" ] -then - LIBDIR=$INSTALLROOT/$LIBDIR -else - LIBDIR=$INSTALLROOT/$t5 -fi -echo "LIBDIR will be \"$LIBDIR\"" -export LIBDIR - -: ${INCDIR="include"} -read -p "Includes directory [default:\"$INCDIR\"]:" -e t6 -if [ -z "$t6" ] -then - INCDIR=$INSTALLROOT/$INCDIR -else - INCDIR=$INSTALLROOT/$t6 -fi -echo "INCDIR will be \"$INCDIR\"" -export INCDIR - -: ${DOCDIR="doc"} -read -p "Documentation directory [default:\"$DOCDIR\"]:" -e t7 -if [ -z "$t7" ] -then - DOCDIR=$INSTALLROOT/$DOCDIR -else - DOCDIR=$INSTALLROOT/$t7 -fi -echo "DOCDIR will be \"$DOCDIR\"" -export DOCDIR - - diff --git a/manual/docs/html/angularCalibrationHowTo/WARNINGS b/docs/html/angularCalibrationHowTo/WARNINGS similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/WARNINGS rename to docs/html/angularCalibrationHowTo/WARNINGS diff --git a/manual/docs/html/angularCalibrationHowTo/angularCalibrationHowTo.css b/docs/html/angularCalibrationHowTo/angularCalibrationHowTo.css similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/angularCalibrationHowTo.css rename to docs/html/angularCalibrationHowTo/angularCalibrationHowTo.css diff --git a/manual/docs/html/angularCalibrationHowTo/angularCalibrationHowTo.html b/docs/html/angularCalibrationHowTo/angularCalibrationHowTo.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/angularCalibrationHowTo.html rename to docs/html/angularCalibrationHowTo/angularCalibrationHowTo.html diff --git a/manual/docs/html/angularCalibrationHowTo/images.aux b/docs/html/angularCalibrationHowTo/images.aux similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/images.aux rename to docs/html/angularCalibrationHowTo/images.aux diff --git a/manual/docs/html/angularCalibrationHowTo/images.log b/docs/html/angularCalibrationHowTo/images.log similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/images.log rename to docs/html/angularCalibrationHowTo/images.log diff --git a/manual/docs/html/angularCalibrationHowTo/images.pl b/docs/html/angularCalibrationHowTo/images.pl similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/images.pl rename to docs/html/angularCalibrationHowTo/images.pl diff --git a/manual/docs/html/angularCalibrationHowTo/images.tex b/docs/html/angularCalibrationHowTo/images.tex similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/images.tex rename to docs/html/angularCalibrationHowTo/images.tex diff --git a/manual/docs/html/angularCalibrationHowTo/img1.png b/docs/html/angularCalibrationHowTo/img1.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img1.png rename to docs/html/angularCalibrationHowTo/img1.png diff --git a/manual/docs/html/angularCalibrationHowTo/img10.png b/docs/html/angularCalibrationHowTo/img10.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img10.png rename to docs/html/angularCalibrationHowTo/img10.png diff --git a/manual/docs/html/angularCalibrationHowTo/img11.png b/docs/html/angularCalibrationHowTo/img11.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img11.png rename to docs/html/angularCalibrationHowTo/img11.png diff --git a/manual/docs/html/angularCalibrationHowTo/img12.png b/docs/html/angularCalibrationHowTo/img12.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img12.png rename to docs/html/angularCalibrationHowTo/img12.png diff --git a/manual/docs/html/angularCalibrationHowTo/img13.png b/docs/html/angularCalibrationHowTo/img13.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img13.png rename to docs/html/angularCalibrationHowTo/img13.png diff --git a/manual/docs/html/angularCalibrationHowTo/img14.png b/docs/html/angularCalibrationHowTo/img14.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img14.png rename to docs/html/angularCalibrationHowTo/img14.png diff --git a/manual/docs/html/angularCalibrationHowTo/img15.png b/docs/html/angularCalibrationHowTo/img15.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img15.png rename to docs/html/angularCalibrationHowTo/img15.png diff --git a/manual/docs/html/angularCalibrationHowTo/img16.png b/docs/html/angularCalibrationHowTo/img16.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img16.png rename to docs/html/angularCalibrationHowTo/img16.png diff --git a/manual/docs/html/angularCalibrationHowTo/img17.png b/docs/html/angularCalibrationHowTo/img17.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img17.png rename to docs/html/angularCalibrationHowTo/img17.png diff --git a/manual/docs/html/angularCalibrationHowTo/img18.png b/docs/html/angularCalibrationHowTo/img18.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img18.png rename to docs/html/angularCalibrationHowTo/img18.png diff --git a/manual/docs/html/angularCalibrationHowTo/img2.png b/docs/html/angularCalibrationHowTo/img2.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img2.png rename to docs/html/angularCalibrationHowTo/img2.png diff --git a/manual/docs/html/angularCalibrationHowTo/img3.png b/docs/html/angularCalibrationHowTo/img3.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img3.png rename to docs/html/angularCalibrationHowTo/img3.png diff --git a/manual/docs/html/angularCalibrationHowTo/img4.png b/docs/html/angularCalibrationHowTo/img4.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img4.png rename to docs/html/angularCalibrationHowTo/img4.png diff --git a/manual/docs/html/angularCalibrationHowTo/img5.png b/docs/html/angularCalibrationHowTo/img5.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img5.png rename to docs/html/angularCalibrationHowTo/img5.png diff --git a/manual/docs/html/angularCalibrationHowTo/img6.png b/docs/html/angularCalibrationHowTo/img6.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img6.png rename to docs/html/angularCalibrationHowTo/img6.png diff --git a/manual/docs/html/angularCalibrationHowTo/img7.png b/docs/html/angularCalibrationHowTo/img7.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img7.png rename to docs/html/angularCalibrationHowTo/img7.png diff --git a/manual/docs/html/angularCalibrationHowTo/img8.png b/docs/html/angularCalibrationHowTo/img8.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img8.png rename to docs/html/angularCalibrationHowTo/img8.png diff --git a/manual/docs/html/angularCalibrationHowTo/img9.png b/docs/html/angularCalibrationHowTo/img9.png similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/img9.png rename to docs/html/angularCalibrationHowTo/img9.png diff --git a/manual/docs/html/angularCalibrationHowTo/index.html b/docs/html/angularCalibrationHowTo/index.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/index.html rename to docs/html/angularCalibrationHowTo/index.html diff --git a/manual/docs/html/angularCalibrationHowTo/internals.pl b/docs/html/angularCalibrationHowTo/internals.pl similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/internals.pl rename to docs/html/angularCalibrationHowTo/internals.pl diff --git a/manual/docs/html/angularCalibrationHowTo/labels.pl b/docs/html/angularCalibrationHowTo/labels.pl similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/labels.pl rename to docs/html/angularCalibrationHowTo/labels.pl diff --git a/manual/docs/html/angularCalibrationHowTo/node1.html b/docs/html/angularCalibrationHowTo/node1.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/node1.html rename to docs/html/angularCalibrationHowTo/node1.html diff --git a/manual/docs/html/angularCalibrationHowTo/node2.html b/docs/html/angularCalibrationHowTo/node2.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/node2.html rename to docs/html/angularCalibrationHowTo/node2.html diff --git a/manual/docs/html/angularCalibrationHowTo/node3.html b/docs/html/angularCalibrationHowTo/node3.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/node3.html rename to docs/html/angularCalibrationHowTo/node3.html diff --git a/manual/docs/html/angularCalibrationHowTo/node4.html b/docs/html/angularCalibrationHowTo/node4.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/node4.html rename to docs/html/angularCalibrationHowTo/node4.html diff --git a/manual/docs/html/angularCalibrationHowTo/node5.html b/docs/html/angularCalibrationHowTo/node5.html similarity index 100% rename from manual/docs/html/angularCalibrationHowTo/node5.html rename to docs/html/angularCalibrationHowTo/node5.html diff --git a/manual/docs/html/energyCalibrationHowTo/WARNINGS b/docs/html/energyCalibrationHowTo/WARNINGS similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/WARNINGS rename to docs/html/energyCalibrationHowTo/WARNINGS diff --git a/manual/docs/html/energyCalibrationHowTo/energyCalibrationHowTo.css b/docs/html/energyCalibrationHowTo/energyCalibrationHowTo.css similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/energyCalibrationHowTo.css rename to docs/html/energyCalibrationHowTo/energyCalibrationHowTo.css diff --git a/manual/docs/html/energyCalibrationHowTo/energyCalibrationHowTo.html b/docs/html/energyCalibrationHowTo/energyCalibrationHowTo.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/energyCalibrationHowTo.html rename to docs/html/energyCalibrationHowTo/energyCalibrationHowTo.html diff --git a/manual/docs/html/energyCalibrationHowTo/images.aux b/docs/html/energyCalibrationHowTo/images.aux similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/images.aux rename to docs/html/energyCalibrationHowTo/images.aux diff --git a/manual/docs/html/energyCalibrationHowTo/images.log b/docs/html/energyCalibrationHowTo/images.log similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/images.log rename to docs/html/energyCalibrationHowTo/images.log diff --git a/manual/docs/html/energyCalibrationHowTo/images.pl b/docs/html/energyCalibrationHowTo/images.pl similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/images.pl rename to docs/html/energyCalibrationHowTo/images.pl diff --git a/manual/docs/html/energyCalibrationHowTo/images.tex b/docs/html/energyCalibrationHowTo/images.tex similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/images.tex rename to docs/html/energyCalibrationHowTo/images.tex diff --git a/manual/docs/html/energyCalibrationHowTo/img1.png b/docs/html/energyCalibrationHowTo/img1.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img1.png rename to docs/html/energyCalibrationHowTo/img1.png diff --git a/manual/docs/html/energyCalibrationHowTo/img10.png b/docs/html/energyCalibrationHowTo/img10.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img10.png rename to docs/html/energyCalibrationHowTo/img10.png diff --git a/manual/docs/html/energyCalibrationHowTo/img11.png b/docs/html/energyCalibrationHowTo/img11.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img11.png rename to docs/html/energyCalibrationHowTo/img11.png diff --git a/manual/docs/html/energyCalibrationHowTo/img12.png b/docs/html/energyCalibrationHowTo/img12.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img12.png rename to docs/html/energyCalibrationHowTo/img12.png diff --git a/manual/docs/html/energyCalibrationHowTo/img13.png b/docs/html/energyCalibrationHowTo/img13.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img13.png rename to docs/html/energyCalibrationHowTo/img13.png diff --git a/manual/docs/html/energyCalibrationHowTo/img14.png b/docs/html/energyCalibrationHowTo/img14.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img14.png rename to docs/html/energyCalibrationHowTo/img14.png diff --git a/manual/docs/html/energyCalibrationHowTo/img15.png b/docs/html/energyCalibrationHowTo/img15.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img15.png rename to docs/html/energyCalibrationHowTo/img15.png diff --git a/manual/docs/html/energyCalibrationHowTo/img16.png b/docs/html/energyCalibrationHowTo/img16.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img16.png rename to docs/html/energyCalibrationHowTo/img16.png diff --git a/manual/docs/html/energyCalibrationHowTo/img17.png b/docs/html/energyCalibrationHowTo/img17.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img17.png rename to docs/html/energyCalibrationHowTo/img17.png diff --git a/manual/docs/html/energyCalibrationHowTo/img18.png b/docs/html/energyCalibrationHowTo/img18.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img18.png rename to docs/html/energyCalibrationHowTo/img18.png diff --git a/manual/docs/html/energyCalibrationHowTo/img19.png b/docs/html/energyCalibrationHowTo/img19.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img19.png rename to docs/html/energyCalibrationHowTo/img19.png diff --git a/manual/docs/html/energyCalibrationHowTo/img2.png b/docs/html/energyCalibrationHowTo/img2.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img2.png rename to docs/html/energyCalibrationHowTo/img2.png diff --git a/manual/docs/html/energyCalibrationHowTo/img20.png b/docs/html/energyCalibrationHowTo/img20.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img20.png rename to docs/html/energyCalibrationHowTo/img20.png diff --git a/manual/docs/html/energyCalibrationHowTo/img21.png b/docs/html/energyCalibrationHowTo/img21.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img21.png rename to docs/html/energyCalibrationHowTo/img21.png diff --git a/manual/docs/html/energyCalibrationHowTo/img22.png b/docs/html/energyCalibrationHowTo/img22.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img22.png rename to docs/html/energyCalibrationHowTo/img22.png diff --git a/manual/docs/html/energyCalibrationHowTo/img23.png b/docs/html/energyCalibrationHowTo/img23.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img23.png rename to docs/html/energyCalibrationHowTo/img23.png diff --git a/manual/docs/html/energyCalibrationHowTo/img24.png b/docs/html/energyCalibrationHowTo/img24.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img24.png rename to docs/html/energyCalibrationHowTo/img24.png diff --git a/manual/docs/html/energyCalibrationHowTo/img25.png b/docs/html/energyCalibrationHowTo/img25.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img25.png rename to docs/html/energyCalibrationHowTo/img25.png diff --git a/manual/docs/html/energyCalibrationHowTo/img26.png b/docs/html/energyCalibrationHowTo/img26.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img26.png rename to docs/html/energyCalibrationHowTo/img26.png diff --git a/manual/docs/html/energyCalibrationHowTo/img27.png b/docs/html/energyCalibrationHowTo/img27.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img27.png rename to docs/html/energyCalibrationHowTo/img27.png diff --git a/manual/docs/html/energyCalibrationHowTo/img28.png b/docs/html/energyCalibrationHowTo/img28.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img28.png rename to docs/html/energyCalibrationHowTo/img28.png diff --git a/manual/docs/html/energyCalibrationHowTo/img29.png b/docs/html/energyCalibrationHowTo/img29.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img29.png rename to docs/html/energyCalibrationHowTo/img29.png diff --git a/manual/docs/html/energyCalibrationHowTo/img3.png b/docs/html/energyCalibrationHowTo/img3.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img3.png rename to docs/html/energyCalibrationHowTo/img3.png diff --git a/manual/docs/html/energyCalibrationHowTo/img30.png b/docs/html/energyCalibrationHowTo/img30.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img30.png rename to docs/html/energyCalibrationHowTo/img30.png diff --git a/manual/docs/html/energyCalibrationHowTo/img31.png b/docs/html/energyCalibrationHowTo/img31.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img31.png rename to docs/html/energyCalibrationHowTo/img31.png diff --git a/manual/docs/html/energyCalibrationHowTo/img32.png b/docs/html/energyCalibrationHowTo/img32.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img32.png rename to docs/html/energyCalibrationHowTo/img32.png diff --git a/manual/docs/html/energyCalibrationHowTo/img33.png b/docs/html/energyCalibrationHowTo/img33.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img33.png rename to docs/html/energyCalibrationHowTo/img33.png diff --git a/manual/docs/html/energyCalibrationHowTo/img34.png b/docs/html/energyCalibrationHowTo/img34.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img34.png rename to docs/html/energyCalibrationHowTo/img34.png diff --git a/manual/docs/html/energyCalibrationHowTo/img35.png b/docs/html/energyCalibrationHowTo/img35.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img35.png rename to docs/html/energyCalibrationHowTo/img35.png diff --git a/manual/docs/html/energyCalibrationHowTo/img36.png b/docs/html/energyCalibrationHowTo/img36.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img36.png rename to docs/html/energyCalibrationHowTo/img36.png diff --git a/manual/docs/html/energyCalibrationHowTo/img37.png b/docs/html/energyCalibrationHowTo/img37.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img37.png rename to docs/html/energyCalibrationHowTo/img37.png diff --git a/manual/docs/html/energyCalibrationHowTo/img38.png b/docs/html/energyCalibrationHowTo/img38.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img38.png rename to docs/html/energyCalibrationHowTo/img38.png diff --git a/manual/docs/html/energyCalibrationHowTo/img39.png b/docs/html/energyCalibrationHowTo/img39.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img39.png rename to docs/html/energyCalibrationHowTo/img39.png diff --git a/manual/docs/html/energyCalibrationHowTo/img4.png b/docs/html/energyCalibrationHowTo/img4.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img4.png rename to docs/html/energyCalibrationHowTo/img4.png diff --git a/manual/docs/html/energyCalibrationHowTo/img40.png b/docs/html/energyCalibrationHowTo/img40.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img40.png rename to docs/html/energyCalibrationHowTo/img40.png diff --git a/manual/docs/html/energyCalibrationHowTo/img5.png b/docs/html/energyCalibrationHowTo/img5.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img5.png rename to docs/html/energyCalibrationHowTo/img5.png diff --git a/manual/docs/html/energyCalibrationHowTo/img6.png b/docs/html/energyCalibrationHowTo/img6.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img6.png rename to docs/html/energyCalibrationHowTo/img6.png diff --git a/manual/docs/html/energyCalibrationHowTo/img7.png b/docs/html/energyCalibrationHowTo/img7.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img7.png rename to docs/html/energyCalibrationHowTo/img7.png diff --git a/manual/docs/html/energyCalibrationHowTo/img8.png b/docs/html/energyCalibrationHowTo/img8.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img8.png rename to docs/html/energyCalibrationHowTo/img8.png diff --git a/manual/docs/html/energyCalibrationHowTo/img9.png b/docs/html/energyCalibrationHowTo/img9.png similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/img9.png rename to docs/html/energyCalibrationHowTo/img9.png diff --git a/manual/docs/html/energyCalibrationHowTo/index.html b/docs/html/energyCalibrationHowTo/index.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/index.html rename to docs/html/energyCalibrationHowTo/index.html diff --git a/manual/docs/html/energyCalibrationHowTo/internals.pl b/docs/html/energyCalibrationHowTo/internals.pl similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/internals.pl rename to docs/html/energyCalibrationHowTo/internals.pl diff --git a/manual/docs/html/energyCalibrationHowTo/labels.pl b/docs/html/energyCalibrationHowTo/labels.pl similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/labels.pl rename to docs/html/energyCalibrationHowTo/labels.pl diff --git a/manual/docs/html/energyCalibrationHowTo/node1.html b/docs/html/energyCalibrationHowTo/node1.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/node1.html rename to docs/html/energyCalibrationHowTo/node1.html diff --git a/manual/docs/html/energyCalibrationHowTo/node2.html b/docs/html/energyCalibrationHowTo/node2.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/node2.html rename to docs/html/energyCalibrationHowTo/node2.html diff --git a/manual/docs/html/energyCalibrationHowTo/node3.html b/docs/html/energyCalibrationHowTo/node3.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/node3.html rename to docs/html/energyCalibrationHowTo/node3.html diff --git a/manual/docs/html/energyCalibrationHowTo/node4.html b/docs/html/energyCalibrationHowTo/node4.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/node4.html rename to docs/html/energyCalibrationHowTo/node4.html diff --git a/manual/docs/html/energyCalibrationHowTo/node5.html b/docs/html/energyCalibrationHowTo/node5.html similarity index 100% rename from manual/docs/html/energyCalibrationHowTo/node5.html rename to docs/html/energyCalibrationHowTo/node5.html diff --git a/manual/docs/html/slsDetectorClientDocs/acquisition.html b/docs/html/slsDetectorClientDocs/acquisition.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/acquisition.html rename to docs/html/slsDetectorClientDocs/acquisition.html diff --git a/manual/docs/html/slsDetectorClientDocs/actions.html b/docs/html/slsDetectorClientDocs/actions.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/actions.html rename to docs/html/slsDetectorClientDocs/actions.html diff --git a/manual/docs/html/slsDetectorClientDocs/advanced.html b/docs/html/slsDetectorClientDocs/advanced.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/advanced.html rename to docs/html/slsDetectorClientDocs/advanced.html diff --git a/manual/docs/html/slsDetectorClientDocs/bc_s.png b/docs/html/slsDetectorClientDocs/bc_s.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/bc_s.png rename to docs/html/slsDetectorClientDocs/bc_s.png diff --git a/manual/docs/html/slsDetectorClientDocs/bdwn.png b/docs/html/slsDetectorClientDocs/bdwn.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/bdwn.png rename to docs/html/slsDetectorClientDocs/bdwn.png diff --git a/manual/docs/html/slsDetectorClientDocs/closed.png b/docs/html/slsDetectorClientDocs/closed.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/closed.png rename to docs/html/slsDetectorClientDocs/closed.png diff --git a/manual/docs/html/slsDetectorClientDocs/config.html b/docs/html/slsDetectorClientDocs/config.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/config.html rename to docs/html/slsDetectorClientDocs/config.html diff --git a/manual/docs/html/slsDetectorClientDocs/ctb.html b/docs/html/slsDetectorClientDocs/ctb.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ctb.html rename to docs/html/slsDetectorClientDocs/ctb.html diff --git a/manual/docs/html/slsDetectorClientDocs/data.html b/docs/html/slsDetectorClientDocs/data.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/data.html rename to docs/html/slsDetectorClientDocs/data.html diff --git a/manual/docs/html/slsDetectorClientDocs/doxygen.css b/docs/html/slsDetectorClientDocs/doxygen.css similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/doxygen.css rename to docs/html/slsDetectorClientDocs/doxygen.css diff --git a/manual/docs/html/slsDetectorClientDocs/doxygen.png b/docs/html/slsDetectorClientDocs/doxygen.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/doxygen.png rename to docs/html/slsDetectorClientDocs/doxygen.png diff --git a/manual/docs/html/slsDetectorClientDocs/dynsections.js b/docs/html/slsDetectorClientDocs/dynsections.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/dynsections.js rename to docs/html/slsDetectorClientDocs/dynsections.js diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2blank.png b/docs/html/slsDetectorClientDocs/ftv2blank.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2blank.png rename to docs/html/slsDetectorClientDocs/ftv2blank.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2cl.png b/docs/html/slsDetectorClientDocs/ftv2cl.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2cl.png rename to docs/html/slsDetectorClientDocs/ftv2cl.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2doc.png b/docs/html/slsDetectorClientDocs/ftv2doc.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2doc.png rename to docs/html/slsDetectorClientDocs/ftv2doc.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2folderclosed.png b/docs/html/slsDetectorClientDocs/ftv2folderclosed.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2folderclosed.png rename to docs/html/slsDetectorClientDocs/ftv2folderclosed.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2folderopen.png b/docs/html/slsDetectorClientDocs/ftv2folderopen.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2folderopen.png rename to docs/html/slsDetectorClientDocs/ftv2folderopen.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2lastnode.png b/docs/html/slsDetectorClientDocs/ftv2lastnode.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2lastnode.png rename to docs/html/slsDetectorClientDocs/ftv2lastnode.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2link.png b/docs/html/slsDetectorClientDocs/ftv2link.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2link.png rename to docs/html/slsDetectorClientDocs/ftv2link.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2mlastnode.png b/docs/html/slsDetectorClientDocs/ftv2mlastnode.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2mlastnode.png rename to docs/html/slsDetectorClientDocs/ftv2mlastnode.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2mnode.png b/docs/html/slsDetectorClientDocs/ftv2mnode.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2mnode.png rename to docs/html/slsDetectorClientDocs/ftv2mnode.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2mo.png b/docs/html/slsDetectorClientDocs/ftv2mo.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2mo.png rename to docs/html/slsDetectorClientDocs/ftv2mo.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2node.png b/docs/html/slsDetectorClientDocs/ftv2node.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2node.png rename to docs/html/slsDetectorClientDocs/ftv2node.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2ns.png b/docs/html/slsDetectorClientDocs/ftv2ns.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2ns.png rename to docs/html/slsDetectorClientDocs/ftv2ns.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2plastnode.png b/docs/html/slsDetectorClientDocs/ftv2plastnode.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2plastnode.png rename to docs/html/slsDetectorClientDocs/ftv2plastnode.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2pnode.png b/docs/html/slsDetectorClientDocs/ftv2pnode.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2pnode.png rename to docs/html/slsDetectorClientDocs/ftv2pnode.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2splitbar.png b/docs/html/slsDetectorClientDocs/ftv2splitbar.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2splitbar.png rename to docs/html/slsDetectorClientDocs/ftv2splitbar.png diff --git a/manual/docs/html/slsDetectorClientDocs/ftv2vertline.png b/docs/html/slsDetectorClientDocs/ftv2vertline.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/ftv2vertline.png rename to docs/html/slsDetectorClientDocs/ftv2vertline.png diff --git a/manual/docs/html/slsDetectorClientDocs/index.html b/docs/html/slsDetectorClientDocs/index.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/index.html rename to docs/html/slsDetectorClientDocs/index.html diff --git a/manual/docs/html/slsDetectorClientDocs/jquery.js b/docs/html/slsDetectorClientDocs/jquery.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/jquery.js rename to docs/html/slsDetectorClientDocs/jquery.js diff --git a/manual/docs/html/slsDetectorClientDocs/nav_f.png b/docs/html/slsDetectorClientDocs/nav_f.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/nav_f.png rename to docs/html/slsDetectorClientDocs/nav_f.png diff --git a/manual/docs/html/slsDetectorClientDocs/nav_g.png b/docs/html/slsDetectorClientDocs/nav_g.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/nav_g.png rename to docs/html/slsDetectorClientDocs/nav_g.png diff --git a/manual/docs/html/slsDetectorClientDocs/nav_h.png b/docs/html/slsDetectorClientDocs/nav_h.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/nav_h.png rename to docs/html/slsDetectorClientDocs/nav_h.png diff --git a/manual/docs/html/slsDetectorClientDocs/network.html b/docs/html/slsDetectorClientDocs/network.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/network.html rename to docs/html/slsDetectorClientDocs/network.html diff --git a/manual/docs/html/slsDetectorClientDocs/open.png b/docs/html/slsDetectorClientDocs/open.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/open.png rename to docs/html/slsDetectorClientDocs/open.png diff --git a/manual/docs/html/slsDetectorClientDocs/output.html b/docs/html/slsDetectorClientDocs/output.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/output.html rename to docs/html/slsDetectorClientDocs/output.html diff --git a/manual/docs/html/slsDetectorClientDocs/pages.html b/docs/html/slsDetectorClientDocs/pages.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/pages.html rename to docs/html/slsDetectorClientDocs/pages.html diff --git a/manual/docs/html/slsDetectorClientDocs/receiver.html b/docs/html/slsDetectorClientDocs/receiver.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/receiver.html rename to docs/html/slsDetectorClientDocs/receiver.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_61.html b/docs/html/slsDetectorClientDocs/search/all_61.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_61.html rename to docs/html/slsDetectorClientDocs/search/all_61.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_61.js b/docs/html/slsDetectorClientDocs/search/all_61.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_61.js rename to docs/html/slsDetectorClientDocs/search/all_61.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_63.html b/docs/html/slsDetectorClientDocs/search/all_63.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_63.html rename to docs/html/slsDetectorClientDocs/search/all_63.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_63.js b/docs/html/slsDetectorClientDocs/search/all_63.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_63.js rename to docs/html/slsDetectorClientDocs/search/all_63.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_64.html b/docs/html/slsDetectorClientDocs/search/all_64.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_64.html rename to docs/html/slsDetectorClientDocs/search/all_64.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_64.js b/docs/html/slsDetectorClientDocs/search/all_64.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_64.js rename to docs/html/slsDetectorClientDocs/search/all_64.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_69.html b/docs/html/slsDetectorClientDocs/search/all_69.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_69.html rename to docs/html/slsDetectorClientDocs/search/all_69.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_69.js b/docs/html/slsDetectorClientDocs/search/all_69.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_69.js rename to docs/html/slsDetectorClientDocs/search/all_69.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_6e.html b/docs/html/slsDetectorClientDocs/search/all_6e.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_6e.html rename to docs/html/slsDetectorClientDocs/search/all_6e.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_6e.js b/docs/html/slsDetectorClientDocs/search/all_6e.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_6e.js rename to docs/html/slsDetectorClientDocs/search/all_6e.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_6f.html b/docs/html/slsDetectorClientDocs/search/all_6f.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_6f.html rename to docs/html/slsDetectorClientDocs/search/all_6f.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_6f.js b/docs/html/slsDetectorClientDocs/search/all_6f.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_6f.js rename to docs/html/slsDetectorClientDocs/search/all_6f.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_72.html b/docs/html/slsDetectorClientDocs/search/all_72.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_72.html rename to docs/html/slsDetectorClientDocs/search/all_72.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_72.js b/docs/html/slsDetectorClientDocs/search/all_72.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_72.js rename to docs/html/slsDetectorClientDocs/search/all_72.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_74.html b/docs/html/slsDetectorClientDocs/search/all_74.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_74.html rename to docs/html/slsDetectorClientDocs/search/all_74.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/all_74.js b/docs/html/slsDetectorClientDocs/search/all_74.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/all_74.js rename to docs/html/slsDetectorClientDocs/search/all_74.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/close.png b/docs/html/slsDetectorClientDocs/search/close.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/close.png rename to docs/html/slsDetectorClientDocs/search/close.png diff --git a/manual/docs/html/slsDetectorClientDocs/search/mag_sel.png b/docs/html/slsDetectorClientDocs/search/mag_sel.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/mag_sel.png rename to docs/html/slsDetectorClientDocs/search/mag_sel.png diff --git a/manual/docs/html/slsDetectorClientDocs/search/nomatches.html b/docs/html/slsDetectorClientDocs/search/nomatches.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/nomatches.html rename to docs/html/slsDetectorClientDocs/search/nomatches.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_61.html b/docs/html/slsDetectorClientDocs/search/pages_61.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_61.html rename to docs/html/slsDetectorClientDocs/search/pages_61.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_61.js b/docs/html/slsDetectorClientDocs/search/pages_61.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_61.js rename to docs/html/slsDetectorClientDocs/search/pages_61.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_63.html b/docs/html/slsDetectorClientDocs/search/pages_63.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_63.html rename to docs/html/slsDetectorClientDocs/search/pages_63.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_63.js b/docs/html/slsDetectorClientDocs/search/pages_63.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_63.js rename to docs/html/slsDetectorClientDocs/search/pages_63.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_64.html b/docs/html/slsDetectorClientDocs/search/pages_64.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_64.html rename to docs/html/slsDetectorClientDocs/search/pages_64.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_64.js b/docs/html/slsDetectorClientDocs/search/pages_64.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_64.js rename to docs/html/slsDetectorClientDocs/search/pages_64.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_69.html b/docs/html/slsDetectorClientDocs/search/pages_69.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_69.html rename to docs/html/slsDetectorClientDocs/search/pages_69.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_69.js b/docs/html/slsDetectorClientDocs/search/pages_69.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_69.js rename to docs/html/slsDetectorClientDocs/search/pages_69.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_6e.html b/docs/html/slsDetectorClientDocs/search/pages_6e.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_6e.html rename to docs/html/slsDetectorClientDocs/search/pages_6e.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_6e.js b/docs/html/slsDetectorClientDocs/search/pages_6e.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_6e.js rename to docs/html/slsDetectorClientDocs/search/pages_6e.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_6f.html b/docs/html/slsDetectorClientDocs/search/pages_6f.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_6f.html rename to docs/html/slsDetectorClientDocs/search/pages_6f.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_6f.js b/docs/html/slsDetectorClientDocs/search/pages_6f.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_6f.js rename to docs/html/slsDetectorClientDocs/search/pages_6f.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_72.html b/docs/html/slsDetectorClientDocs/search/pages_72.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_72.html rename to docs/html/slsDetectorClientDocs/search/pages_72.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_72.js b/docs/html/slsDetectorClientDocs/search/pages_72.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_72.js rename to docs/html/slsDetectorClientDocs/search/pages_72.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_74.html b/docs/html/slsDetectorClientDocs/search/pages_74.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_74.html rename to docs/html/slsDetectorClientDocs/search/pages_74.html diff --git a/manual/docs/html/slsDetectorClientDocs/search/pages_74.js b/docs/html/slsDetectorClientDocs/search/pages_74.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/pages_74.js rename to docs/html/slsDetectorClientDocs/search/pages_74.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/search.css b/docs/html/slsDetectorClientDocs/search/search.css similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/search.css rename to docs/html/slsDetectorClientDocs/search/search.css diff --git a/manual/docs/html/slsDetectorClientDocs/search/search.js b/docs/html/slsDetectorClientDocs/search/search.js similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/search.js rename to docs/html/slsDetectorClientDocs/search/search.js diff --git a/manual/docs/html/slsDetectorClientDocs/search/search_l.png b/docs/html/slsDetectorClientDocs/search/search_l.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/search_l.png rename to docs/html/slsDetectorClientDocs/search/search_l.png diff --git a/manual/docs/html/slsDetectorClientDocs/search/search_m.png b/docs/html/slsDetectorClientDocs/search/search_m.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/search_m.png rename to docs/html/slsDetectorClientDocs/search/search_m.png diff --git a/manual/docs/html/slsDetectorClientDocs/search/search_r.png b/docs/html/slsDetectorClientDocs/search/search_r.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/search/search_r.png rename to docs/html/slsDetectorClientDocs/search/search_r.png diff --git a/manual/docs/html/slsDetectorClientDocs/settings.html b/docs/html/slsDetectorClientDocs/settings.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/settings.html rename to docs/html/slsDetectorClientDocs/settings.html diff --git a/manual/docs/html/slsDetectorClientDocs/sync_off.png b/docs/html/slsDetectorClientDocs/sync_off.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/sync_off.png rename to docs/html/slsDetectorClientDocs/sync_off.png diff --git a/manual/docs/html/slsDetectorClientDocs/sync_on.png b/docs/html/slsDetectorClientDocs/sync_on.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/sync_on.png rename to docs/html/slsDetectorClientDocs/sync_on.png diff --git a/manual/docs/html/slsDetectorClientDocs/tab_a.png b/docs/html/slsDetectorClientDocs/tab_a.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/tab_a.png rename to docs/html/slsDetectorClientDocs/tab_a.png diff --git a/manual/docs/html/slsDetectorClientDocs/tab_b.png b/docs/html/slsDetectorClientDocs/tab_b.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/tab_b.png rename to docs/html/slsDetectorClientDocs/tab_b.png diff --git a/manual/docs/html/slsDetectorClientDocs/tab_h.png b/docs/html/slsDetectorClientDocs/tab_h.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/tab_h.png rename to docs/html/slsDetectorClientDocs/tab_h.png diff --git a/manual/docs/html/slsDetectorClientDocs/tab_s.png b/docs/html/slsDetectorClientDocs/tab_s.png similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/tab_s.png rename to docs/html/slsDetectorClientDocs/tab_s.png diff --git a/manual/docs/html/slsDetectorClientDocs/tabs.css b/docs/html/slsDetectorClientDocs/tabs.css similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/tabs.css rename to docs/html/slsDetectorClientDocs/tabs.css diff --git a/manual/docs/html/slsDetectorClientDocs/test.html b/docs/html/slsDetectorClientDocs/test.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/test.html rename to docs/html/slsDetectorClientDocs/test.html diff --git a/manual/docs/html/slsDetectorClientDocs/timing.html b/docs/html/slsDetectorClientDocs/timing.html similarity index 100% rename from manual/docs/html/slsDetectorClientDocs/timing.html rename to docs/html/slsDetectorClientDocs/timing.html diff --git a/manual/docs/html/slsDetectorClientHowTo/WARNINGS b/docs/html/slsDetectorClientHowTo/WARNINGS similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/WARNINGS rename to docs/html/slsDetectorClientHowTo/WARNINGS diff --git a/manual/docs/html/slsDetectorClientHowTo/images.aux b/docs/html/slsDetectorClientHowTo/images.aux similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/images.aux rename to docs/html/slsDetectorClientHowTo/images.aux diff --git a/manual/docs/html/slsDetectorClientHowTo/images.log b/docs/html/slsDetectorClientHowTo/images.log similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/images.log rename to docs/html/slsDetectorClientHowTo/images.log diff --git a/manual/docs/html/slsDetectorClientHowTo/images.pl b/docs/html/slsDetectorClientHowTo/images.pl similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/images.pl rename to docs/html/slsDetectorClientHowTo/images.pl diff --git a/manual/docs/html/slsDetectorClientHowTo/images.tex b/docs/html/slsDetectorClientHowTo/images.tex similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/images.tex rename to docs/html/slsDetectorClientHowTo/images.tex diff --git a/manual/docs/html/slsDetectorClientHowTo/img1.png b/docs/html/slsDetectorClientHowTo/img1.png similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/img1.png rename to docs/html/slsDetectorClientHowTo/img1.png diff --git a/manual/docs/html/slsDetectorClientHowTo/img2.png b/docs/html/slsDetectorClientHowTo/img2.png similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/img2.png rename to docs/html/slsDetectorClientHowTo/img2.png diff --git a/manual/docs/html/slsDetectorClientHowTo/index.html b/docs/html/slsDetectorClientHowTo/index.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/index.html rename to docs/html/slsDetectorClientHowTo/index.html diff --git a/manual/docs/html/slsDetectorClientHowTo/labels.pl b/docs/html/slsDetectorClientHowTo/labels.pl similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/labels.pl rename to docs/html/slsDetectorClientHowTo/labels.pl diff --git a/manual/docs/html/slsDetectorClientHowTo/node1.html b/docs/html/slsDetectorClientHowTo/node1.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/node1.html rename to docs/html/slsDetectorClientHowTo/node1.html diff --git a/manual/docs/html/slsDetectorClientHowTo/node2.html b/docs/html/slsDetectorClientHowTo/node2.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/node2.html rename to docs/html/slsDetectorClientHowTo/node2.html diff --git a/manual/docs/html/slsDetectorClientHowTo/node3.html b/docs/html/slsDetectorClientHowTo/node3.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/node3.html rename to docs/html/slsDetectorClientHowTo/node3.html diff --git a/manual/docs/html/slsDetectorClientHowTo/node4.html b/docs/html/slsDetectorClientHowTo/node4.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/node4.html rename to docs/html/slsDetectorClientHowTo/node4.html diff --git a/manual/docs/html/slsDetectorClientHowTo/node5.html b/docs/html/slsDetectorClientHowTo/node5.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/node5.html rename to docs/html/slsDetectorClientHowTo/node5.html diff --git a/manual/docs/html/slsDetectorClientHowTo/node6.html b/docs/html/slsDetectorClientHowTo/node6.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/node6.html rename to docs/html/slsDetectorClientHowTo/node6.html diff --git a/manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.css b/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.css similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.css rename to docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.css diff --git a/manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html b/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html similarity index 100% rename from manual/docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html rename to docs/html/slsDetectorClientHowTo/slsDetectorClientHowTo.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/WARNINGS b/docs/html/slsDetectorGuiHowTo/WARNINGS similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/WARNINGS rename to docs/html/slsDetectorGuiHowTo/WARNINGS diff --git a/manual/docs/html/slsDetectorGuiHowTo/index.html b/docs/html/slsDetectorGuiHowTo/index.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/index.html rename to docs/html/slsDetectorGuiHowTo/index.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/internals.pl b/docs/html/slsDetectorGuiHowTo/internals.pl similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/internals.pl rename to docs/html/slsDetectorGuiHowTo/internals.pl diff --git a/manual/docs/html/slsDetectorGuiHowTo/labels.pl b/docs/html/slsDetectorGuiHowTo/labels.pl similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/labels.pl rename to docs/html/slsDetectorGuiHowTo/labels.pl diff --git a/manual/docs/html/slsDetectorGuiHowTo/node1.html b/docs/html/slsDetectorGuiHowTo/node1.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node1.html rename to docs/html/slsDetectorGuiHowTo/node1.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node10.html b/docs/html/slsDetectorGuiHowTo/node10.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node10.html rename to docs/html/slsDetectorGuiHowTo/node10.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node11.html b/docs/html/slsDetectorGuiHowTo/node11.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node11.html rename to docs/html/slsDetectorGuiHowTo/node11.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node12.html b/docs/html/slsDetectorGuiHowTo/node12.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node12.html rename to docs/html/slsDetectorGuiHowTo/node12.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node13.html b/docs/html/slsDetectorGuiHowTo/node13.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node13.html rename to docs/html/slsDetectorGuiHowTo/node13.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node14.html b/docs/html/slsDetectorGuiHowTo/node14.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node14.html rename to docs/html/slsDetectorGuiHowTo/node14.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node15.html b/docs/html/slsDetectorGuiHowTo/node15.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node15.html rename to docs/html/slsDetectorGuiHowTo/node15.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node16.html b/docs/html/slsDetectorGuiHowTo/node16.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node16.html rename to docs/html/slsDetectorGuiHowTo/node16.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node17.html b/docs/html/slsDetectorGuiHowTo/node17.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node17.html rename to docs/html/slsDetectorGuiHowTo/node17.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node2.html b/docs/html/slsDetectorGuiHowTo/node2.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node2.html rename to docs/html/slsDetectorGuiHowTo/node2.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node3.html b/docs/html/slsDetectorGuiHowTo/node3.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node3.html rename to docs/html/slsDetectorGuiHowTo/node3.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node4.html b/docs/html/slsDetectorGuiHowTo/node4.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node4.html rename to docs/html/slsDetectorGuiHowTo/node4.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node5.html b/docs/html/slsDetectorGuiHowTo/node5.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node5.html rename to docs/html/slsDetectorGuiHowTo/node5.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node6.html b/docs/html/slsDetectorGuiHowTo/node6.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node6.html rename to docs/html/slsDetectorGuiHowTo/node6.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node7.html b/docs/html/slsDetectorGuiHowTo/node7.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node7.html rename to docs/html/slsDetectorGuiHowTo/node7.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node8.html b/docs/html/slsDetectorGuiHowTo/node8.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node8.html rename to docs/html/slsDetectorGuiHowTo/node8.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/node9.html b/docs/html/slsDetectorGuiHowTo/node9.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/node9.html rename to docs/html/slsDetectorGuiHowTo/node9.html diff --git a/manual/docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.css b/docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.css similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.css rename to docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.css diff --git a/manual/docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.html b/docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.html similarity index 100% rename from manual/docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.html rename to docs/html/slsDetectorGuiHowTo/slsDetectorGuiHowTo.html diff --git a/manual/docs/html/slsDetectorInstall/WARNINGS b/docs/html/slsDetectorInstall/WARNINGS similarity index 100% rename from manual/docs/html/slsDetectorInstall/WARNINGS rename to docs/html/slsDetectorInstall/WARNINGS diff --git a/manual/docs/html/slsDetectorInstall/index.html b/docs/html/slsDetectorInstall/index.html similarity index 100% rename from manual/docs/html/slsDetectorInstall/index.html rename to docs/html/slsDetectorInstall/index.html diff --git a/manual/docs/html/slsDetectorInstall/labels.pl b/docs/html/slsDetectorInstall/labels.pl similarity index 100% rename from manual/docs/html/slsDetectorInstall/labels.pl rename to docs/html/slsDetectorInstall/labels.pl diff --git a/manual/docs/html/slsDetectorInstall/slsDetectorInstall.css b/docs/html/slsDetectorInstall/slsDetectorInstall.css similarity index 100% rename from manual/docs/html/slsDetectorInstall/slsDetectorInstall.css rename to docs/html/slsDetectorInstall/slsDetectorInstall.css diff --git a/manual/docs/html/slsDetectorInstall/slsDetectorInstall.html b/docs/html/slsDetectorInstall/slsDetectorInstall.html similarity index 100% rename from manual/docs/html/slsDetectorInstall/slsDetectorInstall.html rename to docs/html/slsDetectorInstall/slsDetectorInstall.html diff --git a/manual/docs/html/slsDetectorUsersDocs/annotated.html b/docs/html/slsDetectorUsersDocs/annotated.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/annotated.html rename to docs/html/slsDetectorUsersDocs/annotated.html diff --git a/manual/docs/html/slsDetectorUsersDocs/bc_s.png b/docs/html/slsDetectorUsersDocs/bc_s.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/bc_s.png rename to docs/html/slsDetectorUsersDocs/bc_s.png diff --git a/manual/docs/html/slsDetectorUsersDocs/bdwn.png b/docs/html/slsDetectorUsersDocs/bdwn.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/bdwn.png rename to docs/html/slsDetectorUsersDocs/bdwn.png diff --git a/manual/docs/html/slsDetectorUsersDocs/classes.html b/docs/html/slsDetectorUsersDocs/classes.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/classes.html rename to docs/html/slsDetectorUsersDocs/classes.html diff --git a/manual/docs/html/slsDetectorUsersDocs/classslsDetectorUsers-members.html b/docs/html/slsDetectorUsersDocs/classslsDetectorUsers-members.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/classslsDetectorUsers-members.html rename to docs/html/slsDetectorUsersDocs/classslsDetectorUsers-members.html diff --git a/manual/docs/html/slsDetectorUsersDocs/classslsDetectorUsers.html b/docs/html/slsDetectorUsersDocs/classslsDetectorUsers.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/classslsDetectorUsers.html rename to docs/html/slsDetectorUsersDocs/classslsDetectorUsers.html diff --git a/manual/docs/html/slsDetectorUsersDocs/classslsReceiverUsers-members.html b/docs/html/slsDetectorUsersDocs/classslsReceiverUsers-members.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/classslsReceiverUsers-members.html rename to docs/html/slsDetectorUsersDocs/classslsReceiverUsers-members.html diff --git a/manual/docs/html/slsDetectorUsersDocs/classslsReceiverUsers.html b/docs/html/slsDetectorUsersDocs/classslsReceiverUsers.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/classslsReceiverUsers.html rename to docs/html/slsDetectorUsersDocs/classslsReceiverUsers.html diff --git a/manual/docs/html/slsDetectorUsersDocs/closed.png b/docs/html/slsDetectorUsersDocs/closed.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/closed.png rename to docs/html/slsDetectorUsersDocs/closed.png diff --git a/manual/docs/html/slsDetectorUsersDocs/dir_0188e84ef4beaf9eafc4e93c2b604ff4.html b/docs/html/slsDetectorUsersDocs/dir_0188e84ef4beaf9eafc4e93c2b604ff4.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/dir_0188e84ef4beaf9eafc4e93c2b604ff4.html rename to docs/html/slsDetectorUsersDocs/dir_0188e84ef4beaf9eafc4e93c2b604ff4.html diff --git a/manual/docs/html/slsDetectorUsersDocs/dir_2a81099005c87b10dbd3ab3fe073d08e.html b/docs/html/slsDetectorUsersDocs/dir_2a81099005c87b10dbd3ab3fe073d08e.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/dir_2a81099005c87b10dbd3ab3fe073d08e.html rename to docs/html/slsDetectorUsersDocs/dir_2a81099005c87b10dbd3ab3fe073d08e.html diff --git a/manual/docs/html/slsDetectorUsersDocs/dir_2fe67bc3f7560f250851af45f127d239.html b/docs/html/slsDetectorUsersDocs/dir_2fe67bc3f7560f250851af45f127d239.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/dir_2fe67bc3f7560f250851af45f127d239.html rename to docs/html/slsDetectorUsersDocs/dir_2fe67bc3f7560f250851af45f127d239.html diff --git a/manual/docs/html/slsDetectorUsersDocs/dir_cda5313c19a4ccff8ceebb4444cecd0a.html b/docs/html/slsDetectorUsersDocs/dir_cda5313c19a4ccff8ceebb4444cecd0a.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/dir_cda5313c19a4ccff8ceebb4444cecd0a.html rename to docs/html/slsDetectorUsersDocs/dir_cda5313c19a4ccff8ceebb4444cecd0a.html diff --git a/manual/docs/html/slsDetectorUsersDocs/doxygen.css b/docs/html/slsDetectorUsersDocs/doxygen.css similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/doxygen.css rename to docs/html/slsDetectorUsersDocs/doxygen.css diff --git a/manual/docs/html/slsDetectorUsersDocs/doxygen.png b/docs/html/slsDetectorUsersDocs/doxygen.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/doxygen.png rename to docs/html/slsDetectorUsersDocs/doxygen.png diff --git a/manual/docs/html/slsDetectorUsersDocs/dynsections.js b/docs/html/slsDetectorUsersDocs/dynsections.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/dynsections.js rename to docs/html/slsDetectorUsersDocs/dynsections.js diff --git a/manual/docs/html/slsDetectorUsersDocs/files.html b/docs/html/slsDetectorUsersDocs/files.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/files.html rename to docs/html/slsDetectorUsersDocs/files.html diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2blank.png b/docs/html/slsDetectorUsersDocs/ftv2blank.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2blank.png rename to docs/html/slsDetectorUsersDocs/ftv2blank.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2cl.png b/docs/html/slsDetectorUsersDocs/ftv2cl.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2cl.png rename to docs/html/slsDetectorUsersDocs/ftv2cl.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2doc.png b/docs/html/slsDetectorUsersDocs/ftv2doc.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2doc.png rename to docs/html/slsDetectorUsersDocs/ftv2doc.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2folderclosed.png b/docs/html/slsDetectorUsersDocs/ftv2folderclosed.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2folderclosed.png rename to docs/html/slsDetectorUsersDocs/ftv2folderclosed.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2folderopen.png b/docs/html/slsDetectorUsersDocs/ftv2folderopen.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2folderopen.png rename to docs/html/slsDetectorUsersDocs/ftv2folderopen.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2lastnode.png b/docs/html/slsDetectorUsersDocs/ftv2lastnode.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2lastnode.png rename to docs/html/slsDetectorUsersDocs/ftv2lastnode.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2link.png b/docs/html/slsDetectorUsersDocs/ftv2link.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2link.png rename to docs/html/slsDetectorUsersDocs/ftv2link.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2mlastnode.png b/docs/html/slsDetectorUsersDocs/ftv2mlastnode.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2mlastnode.png rename to docs/html/slsDetectorUsersDocs/ftv2mlastnode.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2mnode.png b/docs/html/slsDetectorUsersDocs/ftv2mnode.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2mnode.png rename to docs/html/slsDetectorUsersDocs/ftv2mnode.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2mo.png b/docs/html/slsDetectorUsersDocs/ftv2mo.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2mo.png rename to docs/html/slsDetectorUsersDocs/ftv2mo.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2node.png b/docs/html/slsDetectorUsersDocs/ftv2node.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2node.png rename to docs/html/slsDetectorUsersDocs/ftv2node.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2ns.png b/docs/html/slsDetectorUsersDocs/ftv2ns.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2ns.png rename to docs/html/slsDetectorUsersDocs/ftv2ns.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2plastnode.png b/docs/html/slsDetectorUsersDocs/ftv2plastnode.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2plastnode.png rename to docs/html/slsDetectorUsersDocs/ftv2plastnode.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2pnode.png b/docs/html/slsDetectorUsersDocs/ftv2pnode.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2pnode.png rename to docs/html/slsDetectorUsersDocs/ftv2pnode.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2splitbar.png b/docs/html/slsDetectorUsersDocs/ftv2splitbar.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2splitbar.png rename to docs/html/slsDetectorUsersDocs/ftv2splitbar.png diff --git a/manual/docs/html/slsDetectorUsersDocs/ftv2vertline.png b/docs/html/slsDetectorUsersDocs/ftv2vertline.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/ftv2vertline.png rename to docs/html/slsDetectorUsersDocs/ftv2vertline.png diff --git a/manual/docs/html/slsDetectorUsersDocs/functions.html b/docs/html/slsDetectorUsersDocs/functions.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/functions.html rename to docs/html/slsDetectorUsersDocs/functions.html diff --git a/manual/docs/html/slsDetectorUsersDocs/functions_func.html b/docs/html/slsDetectorUsersDocs/functions_func.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/functions_func.html rename to docs/html/slsDetectorUsersDocs/functions_func.html diff --git a/manual/docs/html/slsDetectorUsersDocs/functions_vars.html b/docs/html/slsDetectorUsersDocs/functions_vars.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/functions_vars.html rename to docs/html/slsDetectorUsersDocs/functions_vars.html diff --git a/manual/docs/html/slsDetectorUsersDocs/globals.html b/docs/html/slsDetectorUsersDocs/globals.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/globals.html rename to docs/html/slsDetectorUsersDocs/globals.html diff --git a/manual/docs/html/slsDetectorUsersDocs/globals_defs.html b/docs/html/slsDetectorUsersDocs/globals_defs.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/globals_defs.html rename to docs/html/slsDetectorUsersDocs/globals_defs.html diff --git a/manual/docs/html/slsDetectorUsersDocs/globals_func.html b/docs/html/slsDetectorUsersDocs/globals_func.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/globals_func.html rename to docs/html/slsDetectorUsersDocs/globals_func.html diff --git a/manual/docs/html/slsDetectorUsersDocs/globals_vars.html b/docs/html/slsDetectorUsersDocs/globals_vars.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/globals_vars.html rename to docs/html/slsDetectorUsersDocs/globals_vars.html diff --git a/manual/docs/html/slsDetectorUsersDocs/index.html b/docs/html/slsDetectorUsersDocs/index.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/index.html rename to docs/html/slsDetectorUsersDocs/index.html diff --git a/manual/docs/html/slsDetectorUsersDocs/jquery.js b/docs/html/slsDetectorUsersDocs/jquery.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/jquery.js rename to docs/html/slsDetectorUsersDocs/jquery.js diff --git a/manual/docs/html/slsDetectorUsersDocs/mainClient_8cpp.html b/docs/html/slsDetectorUsersDocs/mainClient_8cpp.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/mainClient_8cpp.html rename to docs/html/slsDetectorUsersDocs/mainClient_8cpp.html diff --git a/manual/docs/html/slsDetectorUsersDocs/mainClient_8cpp_source.html b/docs/html/slsDetectorUsersDocs/mainClient_8cpp_source.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/mainClient_8cpp_source.html rename to docs/html/slsDetectorUsersDocs/mainClient_8cpp_source.html diff --git a/manual/docs/html/slsDetectorUsersDocs/mainReceiver_8cpp.html b/docs/html/slsDetectorUsersDocs/mainReceiver_8cpp.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/mainReceiver_8cpp.html rename to docs/html/slsDetectorUsersDocs/mainReceiver_8cpp.html diff --git a/manual/docs/html/slsDetectorUsersDocs/mainReceiver_8cpp_source.html b/docs/html/slsDetectorUsersDocs/mainReceiver_8cpp_source.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/mainReceiver_8cpp_source.html rename to docs/html/slsDetectorUsersDocs/mainReceiver_8cpp_source.html diff --git a/manual/docs/html/slsDetectorUsersDocs/nav_f.png b/docs/html/slsDetectorUsersDocs/nav_f.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/nav_f.png rename to docs/html/slsDetectorUsersDocs/nav_f.png diff --git a/manual/docs/html/slsDetectorUsersDocs/nav_g.png b/docs/html/slsDetectorUsersDocs/nav_g.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/nav_g.png rename to docs/html/slsDetectorUsersDocs/nav_g.png diff --git a/manual/docs/html/slsDetectorUsersDocs/nav_h.png b/docs/html/slsDetectorUsersDocs/nav_h.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/nav_h.png rename to docs/html/slsDetectorUsersDocs/nav_h.png diff --git a/manual/docs/html/slsDetectorUsersDocs/open.png b/docs/html/slsDetectorUsersDocs/open.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/open.png rename to docs/html/slsDetectorUsersDocs/open.png diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_61.html b/docs/html/slsDetectorUsersDocs/search/all_61.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_61.html rename to docs/html/slsDetectorUsersDocs/search/all_61.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_61.js b/docs/html/slsDetectorUsersDocs/search/all_61.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_61.js rename to docs/html/slsDetectorUsersDocs/search/all_61.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_64.html b/docs/html/slsDetectorUsersDocs/search/all_64.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_64.html rename to docs/html/slsDetectorUsersDocs/search/all_64.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_64.js b/docs/html/slsDetectorUsersDocs/search/all_64.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_64.js rename to docs/html/slsDetectorUsersDocs/search/all_64.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_65.html b/docs/html/slsDetectorUsersDocs/search/all_65.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_65.html rename to docs/html/slsDetectorUsersDocs/search/all_65.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_65.js b/docs/html/slsDetectorUsersDocs/search/all_65.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_65.js rename to docs/html/slsDetectorUsersDocs/search/all_65.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_66.html b/docs/html/slsDetectorUsersDocs/search/all_66.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_66.html rename to docs/html/slsDetectorUsersDocs/search/all_66.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_66.js b/docs/html/slsDetectorUsersDocs/search/all_66.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_66.js rename to docs/html/slsDetectorUsersDocs/search/all_66.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_67.html b/docs/html/slsDetectorUsersDocs/search/all_67.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_67.html rename to docs/html/slsDetectorUsersDocs/search/all_67.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_67.js b/docs/html/slsDetectorUsersDocs/search/all_67.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_67.js rename to docs/html/slsDetectorUsersDocs/search/all_67.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_69.html b/docs/html/slsDetectorUsersDocs/search/all_69.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_69.html rename to docs/html/slsDetectorUsersDocs/search/all_69.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_69.js b/docs/html/slsDetectorUsersDocs/search/all_69.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_69.js rename to docs/html/slsDetectorUsersDocs/search/all_69.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_6b.html b/docs/html/slsDetectorUsersDocs/search/all_6b.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_6b.html rename to docs/html/slsDetectorUsersDocs/search/all_6b.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_6b.js b/docs/html/slsDetectorUsersDocs/search/all_6b.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_6b.js rename to docs/html/slsDetectorUsersDocs/search/all_6b.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_6d.html b/docs/html/slsDetectorUsersDocs/search/all_6d.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_6d.html rename to docs/html/slsDetectorUsersDocs/search/all_6d.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_6d.js b/docs/html/slsDetectorUsersDocs/search/all_6d.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_6d.js rename to docs/html/slsDetectorUsersDocs/search/all_6d.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_70.html b/docs/html/slsDetectorUsersDocs/search/all_70.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_70.html rename to docs/html/slsDetectorUsersDocs/search/all_70.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_70.js b/docs/html/slsDetectorUsersDocs/search/all_70.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_70.js rename to docs/html/slsDetectorUsersDocs/search/all_70.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_72.html b/docs/html/slsDetectorUsersDocs/search/all_72.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_72.html rename to docs/html/slsDetectorUsersDocs/search/all_72.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_72.js b/docs/html/slsDetectorUsersDocs/search/all_72.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_72.js rename to docs/html/slsDetectorUsersDocs/search/all_72.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_73.html b/docs/html/slsDetectorUsersDocs/search/all_73.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_73.html rename to docs/html/slsDetectorUsersDocs/search/all_73.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_73.js b/docs/html/slsDetectorUsersDocs/search/all_73.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_73.js rename to docs/html/slsDetectorUsersDocs/search/all_73.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_7e.html b/docs/html/slsDetectorUsersDocs/search/all_7e.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_7e.html rename to docs/html/slsDetectorUsersDocs/search/all_7e.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/all_7e.js b/docs/html/slsDetectorUsersDocs/search/all_7e.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/all_7e.js rename to docs/html/slsDetectorUsersDocs/search/all_7e.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/classes_73.html b/docs/html/slsDetectorUsersDocs/search/classes_73.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/classes_73.html rename to docs/html/slsDetectorUsersDocs/search/classes_73.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/classes_73.js b/docs/html/slsDetectorUsersDocs/search/classes_73.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/classes_73.js rename to docs/html/slsDetectorUsersDocs/search/classes_73.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/close.png b/docs/html/slsDetectorUsersDocs/search/close.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/close.png rename to docs/html/slsDetectorUsersDocs/search/close.png diff --git a/manual/docs/html/slsDetectorUsersDocs/search/defines_70.html b/docs/html/slsDetectorUsersDocs/search/defines_70.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/defines_70.html rename to docs/html/slsDetectorUsersDocs/search/defines_70.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/defines_70.js b/docs/html/slsDetectorUsersDocs/search/defines_70.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/defines_70.js rename to docs/html/slsDetectorUsersDocs/search/defines_70.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/files_6d.html b/docs/html/slsDetectorUsersDocs/search/files_6d.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/files_6d.html rename to docs/html/slsDetectorUsersDocs/search/files_6d.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/files_6d.js b/docs/html/slsDetectorUsersDocs/search/files_6d.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/files_6d.js rename to docs/html/slsDetectorUsersDocs/search/files_6d.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/files_73.html b/docs/html/slsDetectorUsersDocs/search/files_73.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/files_73.html rename to docs/html/slsDetectorUsersDocs/search/files_73.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/files_73.js b/docs/html/slsDetectorUsersDocs/search/files_73.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/files_73.js rename to docs/html/slsDetectorUsersDocs/search/files_73.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_61.html b/docs/html/slsDetectorUsersDocs/search/functions_61.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_61.html rename to docs/html/slsDetectorUsersDocs/search/functions_61.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_61.js b/docs/html/slsDetectorUsersDocs/search/functions_61.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_61.js rename to docs/html/slsDetectorUsersDocs/search/functions_61.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_64.html b/docs/html/slsDetectorUsersDocs/search/functions_64.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_64.html rename to docs/html/slsDetectorUsersDocs/search/functions_64.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_64.js b/docs/html/slsDetectorUsersDocs/search/functions_64.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_64.js rename to docs/html/slsDetectorUsersDocs/search/functions_64.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_65.html b/docs/html/slsDetectorUsersDocs/search/functions_65.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_65.html rename to docs/html/slsDetectorUsersDocs/search/functions_65.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_65.js b/docs/html/slsDetectorUsersDocs/search/functions_65.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_65.js rename to docs/html/slsDetectorUsersDocs/search/functions_65.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_66.html b/docs/html/slsDetectorUsersDocs/search/functions_66.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_66.html rename to docs/html/slsDetectorUsersDocs/search/functions_66.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_66.js b/docs/html/slsDetectorUsersDocs/search/functions_66.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_66.js rename to docs/html/slsDetectorUsersDocs/search/functions_66.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_67.html b/docs/html/slsDetectorUsersDocs/search/functions_67.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_67.html rename to docs/html/slsDetectorUsersDocs/search/functions_67.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_67.js b/docs/html/slsDetectorUsersDocs/search/functions_67.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_67.js rename to docs/html/slsDetectorUsersDocs/search/functions_67.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_69.html b/docs/html/slsDetectorUsersDocs/search/functions_69.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_69.html rename to docs/html/slsDetectorUsersDocs/search/functions_69.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_69.js b/docs/html/slsDetectorUsersDocs/search/functions_69.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_69.js rename to docs/html/slsDetectorUsersDocs/search/functions_69.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_6d.html b/docs/html/slsDetectorUsersDocs/search/functions_6d.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_6d.html rename to docs/html/slsDetectorUsersDocs/search/functions_6d.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_6d.js b/docs/html/slsDetectorUsersDocs/search/functions_6d.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_6d.js rename to docs/html/slsDetectorUsersDocs/search/functions_6d.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_70.html b/docs/html/slsDetectorUsersDocs/search/functions_70.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_70.html rename to docs/html/slsDetectorUsersDocs/search/functions_70.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_70.js b/docs/html/slsDetectorUsersDocs/search/functions_70.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_70.js rename to docs/html/slsDetectorUsersDocs/search/functions_70.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_72.html b/docs/html/slsDetectorUsersDocs/search/functions_72.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_72.html rename to docs/html/slsDetectorUsersDocs/search/functions_72.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_72.js b/docs/html/slsDetectorUsersDocs/search/functions_72.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_72.js rename to docs/html/slsDetectorUsersDocs/search/functions_72.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_73.html b/docs/html/slsDetectorUsersDocs/search/functions_73.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_73.html rename to docs/html/slsDetectorUsersDocs/search/functions_73.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_73.js b/docs/html/slsDetectorUsersDocs/search/functions_73.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_73.js rename to docs/html/slsDetectorUsersDocs/search/functions_73.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_7e.html b/docs/html/slsDetectorUsersDocs/search/functions_7e.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_7e.html rename to docs/html/slsDetectorUsersDocs/search/functions_7e.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/functions_7e.js b/docs/html/slsDetectorUsersDocs/search/functions_7e.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/functions_7e.js rename to docs/html/slsDetectorUsersDocs/search/functions_7e.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/mag_sel.png b/docs/html/slsDetectorUsersDocs/search/mag_sel.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/mag_sel.png rename to docs/html/slsDetectorUsersDocs/search/mag_sel.png diff --git a/manual/docs/html/slsDetectorUsersDocs/search/nomatches.html b/docs/html/slsDetectorUsersDocs/search/nomatches.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/nomatches.html rename to docs/html/slsDetectorUsersDocs/search/nomatches.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/search.css b/docs/html/slsDetectorUsersDocs/search/search.css similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/search.css rename to docs/html/slsDetectorUsersDocs/search/search.css diff --git a/manual/docs/html/slsDetectorUsersDocs/search/search.js b/docs/html/slsDetectorUsersDocs/search/search.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/search.js rename to docs/html/slsDetectorUsersDocs/search/search.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/search_l.png b/docs/html/slsDetectorUsersDocs/search/search_l.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/search_l.png rename to docs/html/slsDetectorUsersDocs/search/search_l.png diff --git a/manual/docs/html/slsDetectorUsersDocs/search/search_m.png b/docs/html/slsDetectorUsersDocs/search/search_m.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/search_m.png rename to docs/html/slsDetectorUsersDocs/search/search_m.png diff --git a/manual/docs/html/slsDetectorUsersDocs/search/search_r.png b/docs/html/slsDetectorUsersDocs/search/search_r.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/search_r.png rename to docs/html/slsDetectorUsersDocs/search/search_r.png diff --git a/manual/docs/html/slsDetectorUsersDocs/search/variables_6b.html b/docs/html/slsDetectorUsersDocs/search/variables_6b.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/variables_6b.html rename to docs/html/slsDetectorUsersDocs/search/variables_6b.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/variables_6b.js b/docs/html/slsDetectorUsersDocs/search/variables_6b.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/variables_6b.js rename to docs/html/slsDetectorUsersDocs/search/variables_6b.js diff --git a/manual/docs/html/slsDetectorUsersDocs/search/variables_72.html b/docs/html/slsDetectorUsersDocs/search/variables_72.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/variables_72.html rename to docs/html/slsDetectorUsersDocs/search/variables_72.html diff --git a/manual/docs/html/slsDetectorUsersDocs/search/variables_72.js b/docs/html/slsDetectorUsersDocs/search/variables_72.js similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/search/variables_72.js rename to docs/html/slsDetectorUsersDocs/search/variables_72.js diff --git a/manual/docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h.html b/docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h.html rename to docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h.html diff --git a/manual/docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h_source.html b/docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h_source.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h_source.html rename to docs/html/slsDetectorUsersDocs/slsDetectorUsers_8h_source.html diff --git a/manual/docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h.html b/docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h.html rename to docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h.html diff --git a/manual/docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h_source.html b/docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h_source.html similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h_source.html rename to docs/html/slsDetectorUsersDocs/slsReceiverUsers_8h_source.html diff --git a/manual/docs/html/slsDetectorUsersDocs/sync_off.png b/docs/html/slsDetectorUsersDocs/sync_off.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/sync_off.png rename to docs/html/slsDetectorUsersDocs/sync_off.png diff --git a/manual/docs/html/slsDetectorUsersDocs/sync_on.png b/docs/html/slsDetectorUsersDocs/sync_on.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/sync_on.png rename to docs/html/slsDetectorUsersDocs/sync_on.png diff --git a/manual/docs/html/slsDetectorUsersDocs/tab_a.png b/docs/html/slsDetectorUsersDocs/tab_a.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/tab_a.png rename to docs/html/slsDetectorUsersDocs/tab_a.png diff --git a/manual/docs/html/slsDetectorUsersDocs/tab_b.png b/docs/html/slsDetectorUsersDocs/tab_b.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/tab_b.png rename to docs/html/slsDetectorUsersDocs/tab_b.png diff --git a/manual/docs/html/slsDetectorUsersDocs/tab_h.png b/docs/html/slsDetectorUsersDocs/tab_h.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/tab_h.png rename to docs/html/slsDetectorUsersDocs/tab_h.png diff --git a/manual/docs/html/slsDetectorUsersDocs/tab_s.png b/docs/html/slsDetectorUsersDocs/tab_s.png similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/tab_s.png rename to docs/html/slsDetectorUsersDocs/tab_s.png diff --git a/manual/docs/html/slsDetectorUsersDocs/tabs.css b/docs/html/slsDetectorUsersDocs/tabs.css similarity index 100% rename from manual/docs/html/slsDetectorUsersDocs/tabs.css rename to docs/html/slsDetectorUsersDocs/tabs.css diff --git a/manual/docs/html/slsDetectors-FAQ/WARNINGS b/docs/html/slsDetectors-FAQ/WARNINGS similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/WARNINGS rename to docs/html/slsDetectors-FAQ/WARNINGS diff --git a/manual/docs/html/slsDetectors-FAQ/footnode.html b/docs/html/slsDetectors-FAQ/footnode.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/footnode.html rename to docs/html/slsDetectors-FAQ/footnode.html diff --git a/manual/docs/html/slsDetectors-FAQ/images.aux b/docs/html/slsDetectors-FAQ/images.aux similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/images.aux rename to docs/html/slsDetectors-FAQ/images.aux diff --git a/manual/docs/html/slsDetectors-FAQ/images.log b/docs/html/slsDetectors-FAQ/images.log similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/images.log rename to docs/html/slsDetectors-FAQ/images.log diff --git a/manual/docs/html/slsDetectors-FAQ/images.out b/docs/html/slsDetectors-FAQ/images.out similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/images.out rename to docs/html/slsDetectors-FAQ/images.out diff --git a/manual/docs/html/slsDetectors-FAQ/images.pl b/docs/html/slsDetectors-FAQ/images.pl similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/images.pl rename to docs/html/slsDetectors-FAQ/images.pl diff --git a/manual/docs/html/slsDetectors-FAQ/images.tex b/docs/html/slsDetectors-FAQ/images.tex similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/images.tex rename to docs/html/slsDetectors-FAQ/images.tex diff --git a/manual/docs/html/slsDetectors-FAQ/img1.png b/docs/html/slsDetectors-FAQ/img1.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img1.png rename to docs/html/slsDetectors-FAQ/img1.png diff --git a/manual/docs/html/slsDetectors-FAQ/img10.png b/docs/html/slsDetectors-FAQ/img10.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img10.png rename to docs/html/slsDetectors-FAQ/img10.png diff --git a/manual/docs/html/slsDetectors-FAQ/img100.png b/docs/html/slsDetectors-FAQ/img100.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img100.png rename to docs/html/slsDetectors-FAQ/img100.png diff --git a/manual/docs/html/slsDetectors-FAQ/img101.png b/docs/html/slsDetectors-FAQ/img101.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img101.png rename to docs/html/slsDetectors-FAQ/img101.png diff --git a/manual/docs/html/slsDetectors-FAQ/img102.png b/docs/html/slsDetectors-FAQ/img102.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img102.png rename to docs/html/slsDetectors-FAQ/img102.png diff --git a/manual/docs/html/slsDetectors-FAQ/img103.png b/docs/html/slsDetectors-FAQ/img103.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img103.png rename to docs/html/slsDetectors-FAQ/img103.png diff --git a/manual/docs/html/slsDetectors-FAQ/img104.png b/docs/html/slsDetectors-FAQ/img104.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img104.png rename to docs/html/slsDetectors-FAQ/img104.png diff --git a/manual/docs/html/slsDetectors-FAQ/img105.png b/docs/html/slsDetectors-FAQ/img105.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img105.png rename to docs/html/slsDetectors-FAQ/img105.png diff --git a/manual/docs/html/slsDetectors-FAQ/img106.png b/docs/html/slsDetectors-FAQ/img106.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img106.png rename to docs/html/slsDetectors-FAQ/img106.png diff --git a/manual/docs/html/slsDetectors-FAQ/img107.png b/docs/html/slsDetectors-FAQ/img107.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img107.png rename to docs/html/slsDetectors-FAQ/img107.png diff --git a/manual/docs/html/slsDetectors-FAQ/img108.png b/docs/html/slsDetectors-FAQ/img108.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img108.png rename to docs/html/slsDetectors-FAQ/img108.png diff --git a/manual/docs/html/slsDetectors-FAQ/img109.png b/docs/html/slsDetectors-FAQ/img109.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img109.png rename to docs/html/slsDetectors-FAQ/img109.png diff --git a/manual/docs/html/slsDetectors-FAQ/img11.png b/docs/html/slsDetectors-FAQ/img11.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img11.png rename to docs/html/slsDetectors-FAQ/img11.png diff --git a/manual/docs/html/slsDetectors-FAQ/img110.png b/docs/html/slsDetectors-FAQ/img110.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img110.png rename to docs/html/slsDetectors-FAQ/img110.png diff --git a/manual/docs/html/slsDetectors-FAQ/img111.png b/docs/html/slsDetectors-FAQ/img111.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img111.png rename to docs/html/slsDetectors-FAQ/img111.png diff --git a/manual/docs/html/slsDetectors-FAQ/img112.png b/docs/html/slsDetectors-FAQ/img112.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img112.png rename to docs/html/slsDetectors-FAQ/img112.png diff --git a/manual/docs/html/slsDetectors-FAQ/img113.png b/docs/html/slsDetectors-FAQ/img113.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img113.png rename to docs/html/slsDetectors-FAQ/img113.png diff --git a/manual/docs/html/slsDetectors-FAQ/img114.png b/docs/html/slsDetectors-FAQ/img114.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img114.png rename to docs/html/slsDetectors-FAQ/img114.png diff --git a/manual/docs/html/slsDetectors-FAQ/img115.png b/docs/html/slsDetectors-FAQ/img115.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img115.png rename to docs/html/slsDetectors-FAQ/img115.png diff --git a/manual/docs/html/slsDetectors-FAQ/img116.png b/docs/html/slsDetectors-FAQ/img116.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img116.png rename to docs/html/slsDetectors-FAQ/img116.png diff --git a/manual/docs/html/slsDetectors-FAQ/img117.png b/docs/html/slsDetectors-FAQ/img117.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img117.png rename to docs/html/slsDetectors-FAQ/img117.png diff --git a/manual/docs/html/slsDetectors-FAQ/img118.png b/docs/html/slsDetectors-FAQ/img118.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img118.png rename to docs/html/slsDetectors-FAQ/img118.png diff --git a/manual/docs/html/slsDetectors-FAQ/img119.png b/docs/html/slsDetectors-FAQ/img119.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img119.png rename to docs/html/slsDetectors-FAQ/img119.png diff --git a/manual/docs/html/slsDetectors-FAQ/img12.png b/docs/html/slsDetectors-FAQ/img12.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img12.png rename to docs/html/slsDetectors-FAQ/img12.png diff --git a/manual/docs/html/slsDetectors-FAQ/img120.png b/docs/html/slsDetectors-FAQ/img120.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img120.png rename to docs/html/slsDetectors-FAQ/img120.png diff --git a/manual/docs/html/slsDetectors-FAQ/img121.png b/docs/html/slsDetectors-FAQ/img121.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img121.png rename to docs/html/slsDetectors-FAQ/img121.png diff --git a/manual/docs/html/slsDetectors-FAQ/img122.png b/docs/html/slsDetectors-FAQ/img122.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img122.png rename to docs/html/slsDetectors-FAQ/img122.png diff --git a/manual/docs/html/slsDetectors-FAQ/img123.png b/docs/html/slsDetectors-FAQ/img123.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img123.png rename to docs/html/slsDetectors-FAQ/img123.png diff --git a/manual/docs/html/slsDetectors-FAQ/img124.png b/docs/html/slsDetectors-FAQ/img124.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img124.png rename to docs/html/slsDetectors-FAQ/img124.png diff --git a/manual/docs/html/slsDetectors-FAQ/img125.png b/docs/html/slsDetectors-FAQ/img125.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img125.png rename to docs/html/slsDetectors-FAQ/img125.png diff --git a/manual/docs/html/slsDetectors-FAQ/img126.png b/docs/html/slsDetectors-FAQ/img126.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img126.png rename to docs/html/slsDetectors-FAQ/img126.png diff --git a/manual/docs/html/slsDetectors-FAQ/img127.png b/docs/html/slsDetectors-FAQ/img127.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img127.png rename to docs/html/slsDetectors-FAQ/img127.png diff --git a/manual/docs/html/slsDetectors-FAQ/img128.png b/docs/html/slsDetectors-FAQ/img128.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img128.png rename to docs/html/slsDetectors-FAQ/img128.png diff --git a/manual/docs/html/slsDetectors-FAQ/img129.png b/docs/html/slsDetectors-FAQ/img129.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img129.png rename to docs/html/slsDetectors-FAQ/img129.png diff --git a/manual/docs/html/slsDetectors-FAQ/img13.png b/docs/html/slsDetectors-FAQ/img13.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img13.png rename to docs/html/slsDetectors-FAQ/img13.png diff --git a/manual/docs/html/slsDetectors-FAQ/img130.png b/docs/html/slsDetectors-FAQ/img130.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img130.png rename to docs/html/slsDetectors-FAQ/img130.png diff --git a/manual/docs/html/slsDetectors-FAQ/img131.png b/docs/html/slsDetectors-FAQ/img131.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img131.png rename to docs/html/slsDetectors-FAQ/img131.png diff --git a/manual/docs/html/slsDetectors-FAQ/img132.png b/docs/html/slsDetectors-FAQ/img132.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img132.png rename to docs/html/slsDetectors-FAQ/img132.png diff --git a/manual/docs/html/slsDetectors-FAQ/img133.png b/docs/html/slsDetectors-FAQ/img133.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img133.png rename to docs/html/slsDetectors-FAQ/img133.png diff --git a/manual/docs/html/slsDetectors-FAQ/img134.png b/docs/html/slsDetectors-FAQ/img134.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img134.png rename to docs/html/slsDetectors-FAQ/img134.png diff --git a/manual/docs/html/slsDetectors-FAQ/img135.png b/docs/html/slsDetectors-FAQ/img135.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img135.png rename to docs/html/slsDetectors-FAQ/img135.png diff --git a/manual/docs/html/slsDetectors-FAQ/img136.png b/docs/html/slsDetectors-FAQ/img136.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img136.png rename to docs/html/slsDetectors-FAQ/img136.png diff --git a/manual/docs/html/slsDetectors-FAQ/img137.png b/docs/html/slsDetectors-FAQ/img137.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img137.png rename to docs/html/slsDetectors-FAQ/img137.png diff --git a/manual/docs/html/slsDetectors-FAQ/img138.png b/docs/html/slsDetectors-FAQ/img138.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img138.png rename to docs/html/slsDetectors-FAQ/img138.png diff --git a/manual/docs/html/slsDetectors-FAQ/img139.png b/docs/html/slsDetectors-FAQ/img139.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img139.png rename to docs/html/slsDetectors-FAQ/img139.png diff --git a/manual/docs/html/slsDetectors-FAQ/img14.png b/docs/html/slsDetectors-FAQ/img14.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img14.png rename to docs/html/slsDetectors-FAQ/img14.png diff --git a/manual/docs/html/slsDetectors-FAQ/img140.png b/docs/html/slsDetectors-FAQ/img140.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img140.png rename to docs/html/slsDetectors-FAQ/img140.png diff --git a/manual/docs/html/slsDetectors-FAQ/img141.png b/docs/html/slsDetectors-FAQ/img141.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img141.png rename to docs/html/slsDetectors-FAQ/img141.png diff --git a/manual/docs/html/slsDetectors-FAQ/img142.png b/docs/html/slsDetectors-FAQ/img142.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img142.png rename to docs/html/slsDetectors-FAQ/img142.png diff --git a/manual/docs/html/slsDetectors-FAQ/img143.png b/docs/html/slsDetectors-FAQ/img143.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img143.png rename to docs/html/slsDetectors-FAQ/img143.png diff --git a/manual/docs/html/slsDetectors-FAQ/img144.png b/docs/html/slsDetectors-FAQ/img144.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img144.png rename to docs/html/slsDetectors-FAQ/img144.png diff --git a/manual/docs/html/slsDetectors-FAQ/img145.png b/docs/html/slsDetectors-FAQ/img145.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img145.png rename to docs/html/slsDetectors-FAQ/img145.png diff --git a/manual/docs/html/slsDetectors-FAQ/img146.png b/docs/html/slsDetectors-FAQ/img146.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img146.png rename to docs/html/slsDetectors-FAQ/img146.png diff --git a/manual/docs/html/slsDetectors-FAQ/img147.png b/docs/html/slsDetectors-FAQ/img147.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img147.png rename to docs/html/slsDetectors-FAQ/img147.png diff --git a/manual/docs/html/slsDetectors-FAQ/img148.png b/docs/html/slsDetectors-FAQ/img148.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img148.png rename to docs/html/slsDetectors-FAQ/img148.png diff --git a/manual/docs/html/slsDetectors-FAQ/img149.png b/docs/html/slsDetectors-FAQ/img149.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img149.png rename to docs/html/slsDetectors-FAQ/img149.png diff --git a/manual/docs/html/slsDetectors-FAQ/img15.png b/docs/html/slsDetectors-FAQ/img15.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img15.png rename to docs/html/slsDetectors-FAQ/img15.png diff --git a/manual/docs/html/slsDetectors-FAQ/img150.png b/docs/html/slsDetectors-FAQ/img150.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img150.png rename to docs/html/slsDetectors-FAQ/img150.png diff --git a/manual/docs/html/slsDetectors-FAQ/img151.png b/docs/html/slsDetectors-FAQ/img151.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img151.png rename to docs/html/slsDetectors-FAQ/img151.png diff --git a/manual/docs/html/slsDetectors-FAQ/img152.png b/docs/html/slsDetectors-FAQ/img152.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img152.png rename to docs/html/slsDetectors-FAQ/img152.png diff --git a/manual/docs/html/slsDetectors-FAQ/img153.png b/docs/html/slsDetectors-FAQ/img153.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img153.png rename to docs/html/slsDetectors-FAQ/img153.png diff --git a/manual/docs/html/slsDetectors-FAQ/img154.png b/docs/html/slsDetectors-FAQ/img154.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img154.png rename to docs/html/slsDetectors-FAQ/img154.png diff --git a/manual/docs/html/slsDetectors-FAQ/img155.png b/docs/html/slsDetectors-FAQ/img155.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img155.png rename to docs/html/slsDetectors-FAQ/img155.png diff --git a/manual/docs/html/slsDetectors-FAQ/img156.png b/docs/html/slsDetectors-FAQ/img156.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img156.png rename to docs/html/slsDetectors-FAQ/img156.png diff --git a/manual/docs/html/slsDetectors-FAQ/img157.png b/docs/html/slsDetectors-FAQ/img157.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img157.png rename to docs/html/slsDetectors-FAQ/img157.png diff --git a/manual/docs/html/slsDetectors-FAQ/img158.png b/docs/html/slsDetectors-FAQ/img158.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img158.png rename to docs/html/slsDetectors-FAQ/img158.png diff --git a/manual/docs/html/slsDetectors-FAQ/img159.png b/docs/html/slsDetectors-FAQ/img159.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img159.png rename to docs/html/slsDetectors-FAQ/img159.png diff --git a/manual/docs/html/slsDetectors-FAQ/img16.png b/docs/html/slsDetectors-FAQ/img16.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img16.png rename to docs/html/slsDetectors-FAQ/img16.png diff --git a/manual/docs/html/slsDetectors-FAQ/img160.png b/docs/html/slsDetectors-FAQ/img160.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img160.png rename to docs/html/slsDetectors-FAQ/img160.png diff --git a/manual/docs/html/slsDetectors-FAQ/img161.png b/docs/html/slsDetectors-FAQ/img161.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img161.png rename to docs/html/slsDetectors-FAQ/img161.png diff --git a/manual/docs/html/slsDetectors-FAQ/img162.png b/docs/html/slsDetectors-FAQ/img162.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img162.png rename to docs/html/slsDetectors-FAQ/img162.png diff --git a/manual/docs/html/slsDetectors-FAQ/img163.png b/docs/html/slsDetectors-FAQ/img163.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img163.png rename to docs/html/slsDetectors-FAQ/img163.png diff --git a/manual/docs/html/slsDetectors-FAQ/img164.png b/docs/html/slsDetectors-FAQ/img164.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img164.png rename to docs/html/slsDetectors-FAQ/img164.png diff --git a/manual/docs/html/slsDetectors-FAQ/img165.png b/docs/html/slsDetectors-FAQ/img165.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img165.png rename to docs/html/slsDetectors-FAQ/img165.png diff --git a/manual/docs/html/slsDetectors-FAQ/img166.png b/docs/html/slsDetectors-FAQ/img166.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img166.png rename to docs/html/slsDetectors-FAQ/img166.png diff --git a/manual/docs/html/slsDetectors-FAQ/img167.png b/docs/html/slsDetectors-FAQ/img167.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img167.png rename to docs/html/slsDetectors-FAQ/img167.png diff --git a/manual/docs/html/slsDetectors-FAQ/img168.png b/docs/html/slsDetectors-FAQ/img168.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img168.png rename to docs/html/slsDetectors-FAQ/img168.png diff --git a/manual/docs/html/slsDetectors-FAQ/img169.png b/docs/html/slsDetectors-FAQ/img169.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img169.png rename to docs/html/slsDetectors-FAQ/img169.png diff --git a/manual/docs/html/slsDetectors-FAQ/img17.png b/docs/html/slsDetectors-FAQ/img17.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img17.png rename to docs/html/slsDetectors-FAQ/img17.png diff --git a/manual/docs/html/slsDetectors-FAQ/img170.png b/docs/html/slsDetectors-FAQ/img170.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img170.png rename to docs/html/slsDetectors-FAQ/img170.png diff --git a/manual/docs/html/slsDetectors-FAQ/img171.png b/docs/html/slsDetectors-FAQ/img171.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img171.png rename to docs/html/slsDetectors-FAQ/img171.png diff --git a/manual/docs/html/slsDetectors-FAQ/img172.png b/docs/html/slsDetectors-FAQ/img172.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img172.png rename to docs/html/slsDetectors-FAQ/img172.png diff --git a/manual/docs/html/slsDetectors-FAQ/img173.png b/docs/html/slsDetectors-FAQ/img173.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img173.png rename to docs/html/slsDetectors-FAQ/img173.png diff --git a/manual/docs/html/slsDetectors-FAQ/img174.png b/docs/html/slsDetectors-FAQ/img174.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img174.png rename to docs/html/slsDetectors-FAQ/img174.png diff --git a/manual/docs/html/slsDetectors-FAQ/img175.png b/docs/html/slsDetectors-FAQ/img175.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img175.png rename to docs/html/slsDetectors-FAQ/img175.png diff --git a/manual/docs/html/slsDetectors-FAQ/img176.png b/docs/html/slsDetectors-FAQ/img176.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img176.png rename to docs/html/slsDetectors-FAQ/img176.png diff --git a/manual/docs/html/slsDetectors-FAQ/img177.png b/docs/html/slsDetectors-FAQ/img177.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img177.png rename to docs/html/slsDetectors-FAQ/img177.png diff --git a/manual/docs/html/slsDetectors-FAQ/img178.png b/docs/html/slsDetectors-FAQ/img178.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img178.png rename to docs/html/slsDetectors-FAQ/img178.png diff --git a/manual/docs/html/slsDetectors-FAQ/img179.png b/docs/html/slsDetectors-FAQ/img179.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img179.png rename to docs/html/slsDetectors-FAQ/img179.png diff --git a/manual/docs/html/slsDetectors-FAQ/img18.png b/docs/html/slsDetectors-FAQ/img18.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img18.png rename to docs/html/slsDetectors-FAQ/img18.png diff --git a/manual/docs/html/slsDetectors-FAQ/img180.png b/docs/html/slsDetectors-FAQ/img180.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img180.png rename to docs/html/slsDetectors-FAQ/img180.png diff --git a/manual/docs/html/slsDetectors-FAQ/img181.png b/docs/html/slsDetectors-FAQ/img181.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img181.png rename to docs/html/slsDetectors-FAQ/img181.png diff --git a/manual/docs/html/slsDetectors-FAQ/img182.png b/docs/html/slsDetectors-FAQ/img182.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img182.png rename to docs/html/slsDetectors-FAQ/img182.png diff --git a/manual/docs/html/slsDetectors-FAQ/img183.png b/docs/html/slsDetectors-FAQ/img183.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img183.png rename to docs/html/slsDetectors-FAQ/img183.png diff --git a/manual/docs/html/slsDetectors-FAQ/img184.png b/docs/html/slsDetectors-FAQ/img184.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img184.png rename to docs/html/slsDetectors-FAQ/img184.png diff --git a/manual/docs/html/slsDetectors-FAQ/img185.png b/docs/html/slsDetectors-FAQ/img185.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img185.png rename to docs/html/slsDetectors-FAQ/img185.png diff --git a/manual/docs/html/slsDetectors-FAQ/img186.png b/docs/html/slsDetectors-FAQ/img186.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img186.png rename to docs/html/slsDetectors-FAQ/img186.png diff --git a/manual/docs/html/slsDetectors-FAQ/img187.png b/docs/html/slsDetectors-FAQ/img187.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img187.png rename to docs/html/slsDetectors-FAQ/img187.png diff --git a/manual/docs/html/slsDetectors-FAQ/img188.png b/docs/html/slsDetectors-FAQ/img188.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img188.png rename to docs/html/slsDetectors-FAQ/img188.png diff --git a/manual/docs/html/slsDetectors-FAQ/img189.png b/docs/html/slsDetectors-FAQ/img189.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img189.png rename to docs/html/slsDetectors-FAQ/img189.png diff --git a/manual/docs/html/slsDetectors-FAQ/img19.png b/docs/html/slsDetectors-FAQ/img19.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img19.png rename to docs/html/slsDetectors-FAQ/img19.png diff --git a/manual/docs/html/slsDetectors-FAQ/img190.png b/docs/html/slsDetectors-FAQ/img190.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img190.png rename to docs/html/slsDetectors-FAQ/img190.png diff --git a/manual/docs/html/slsDetectors-FAQ/img191.png b/docs/html/slsDetectors-FAQ/img191.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img191.png rename to docs/html/slsDetectors-FAQ/img191.png diff --git a/manual/docs/html/slsDetectors-FAQ/img192.png b/docs/html/slsDetectors-FAQ/img192.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img192.png rename to docs/html/slsDetectors-FAQ/img192.png diff --git a/manual/docs/html/slsDetectors-FAQ/img193.png b/docs/html/slsDetectors-FAQ/img193.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img193.png rename to docs/html/slsDetectors-FAQ/img193.png diff --git a/manual/docs/html/slsDetectors-FAQ/img194.png b/docs/html/slsDetectors-FAQ/img194.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img194.png rename to docs/html/slsDetectors-FAQ/img194.png diff --git a/manual/docs/html/slsDetectors-FAQ/img195.png b/docs/html/slsDetectors-FAQ/img195.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img195.png rename to docs/html/slsDetectors-FAQ/img195.png diff --git a/manual/docs/html/slsDetectors-FAQ/img196.png b/docs/html/slsDetectors-FAQ/img196.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img196.png rename to docs/html/slsDetectors-FAQ/img196.png diff --git a/manual/docs/html/slsDetectors-FAQ/img197.png b/docs/html/slsDetectors-FAQ/img197.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img197.png rename to docs/html/slsDetectors-FAQ/img197.png diff --git a/manual/docs/html/slsDetectors-FAQ/img198.png b/docs/html/slsDetectors-FAQ/img198.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img198.png rename to docs/html/slsDetectors-FAQ/img198.png diff --git a/manual/docs/html/slsDetectors-FAQ/img199.png b/docs/html/slsDetectors-FAQ/img199.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img199.png rename to docs/html/slsDetectors-FAQ/img199.png diff --git a/manual/docs/html/slsDetectors-FAQ/img2.png b/docs/html/slsDetectors-FAQ/img2.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img2.png rename to docs/html/slsDetectors-FAQ/img2.png diff --git a/manual/docs/html/slsDetectors-FAQ/img20.png b/docs/html/slsDetectors-FAQ/img20.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img20.png rename to docs/html/slsDetectors-FAQ/img20.png diff --git a/manual/docs/html/slsDetectors-FAQ/img200.png b/docs/html/slsDetectors-FAQ/img200.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img200.png rename to docs/html/slsDetectors-FAQ/img200.png diff --git a/manual/docs/html/slsDetectors-FAQ/img201.png b/docs/html/slsDetectors-FAQ/img201.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img201.png rename to docs/html/slsDetectors-FAQ/img201.png diff --git a/manual/docs/html/slsDetectors-FAQ/img202.png b/docs/html/slsDetectors-FAQ/img202.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img202.png rename to docs/html/slsDetectors-FAQ/img202.png diff --git a/manual/docs/html/slsDetectors-FAQ/img203.png b/docs/html/slsDetectors-FAQ/img203.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img203.png rename to docs/html/slsDetectors-FAQ/img203.png diff --git a/manual/docs/html/slsDetectors-FAQ/img204.png b/docs/html/slsDetectors-FAQ/img204.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img204.png rename to docs/html/slsDetectors-FAQ/img204.png diff --git a/manual/docs/html/slsDetectors-FAQ/img205.png b/docs/html/slsDetectors-FAQ/img205.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img205.png rename to docs/html/slsDetectors-FAQ/img205.png diff --git a/manual/docs/html/slsDetectors-FAQ/img206.png b/docs/html/slsDetectors-FAQ/img206.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img206.png rename to docs/html/slsDetectors-FAQ/img206.png diff --git a/manual/docs/html/slsDetectors-FAQ/img207.png b/docs/html/slsDetectors-FAQ/img207.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img207.png rename to docs/html/slsDetectors-FAQ/img207.png diff --git a/manual/docs/html/slsDetectors-FAQ/img208.png b/docs/html/slsDetectors-FAQ/img208.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img208.png rename to docs/html/slsDetectors-FAQ/img208.png diff --git a/manual/docs/html/slsDetectors-FAQ/img209.png b/docs/html/slsDetectors-FAQ/img209.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img209.png rename to docs/html/slsDetectors-FAQ/img209.png diff --git a/manual/docs/html/slsDetectors-FAQ/img21.png b/docs/html/slsDetectors-FAQ/img21.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img21.png rename to docs/html/slsDetectors-FAQ/img21.png diff --git a/manual/docs/html/slsDetectors-FAQ/img210.png b/docs/html/slsDetectors-FAQ/img210.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img210.png rename to docs/html/slsDetectors-FAQ/img210.png diff --git a/manual/docs/html/slsDetectors-FAQ/img211.png b/docs/html/slsDetectors-FAQ/img211.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img211.png rename to docs/html/slsDetectors-FAQ/img211.png diff --git a/manual/docs/html/slsDetectors-FAQ/img212.png b/docs/html/slsDetectors-FAQ/img212.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img212.png rename to docs/html/slsDetectors-FAQ/img212.png diff --git a/manual/docs/html/slsDetectors-FAQ/img213.png b/docs/html/slsDetectors-FAQ/img213.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img213.png rename to docs/html/slsDetectors-FAQ/img213.png diff --git a/manual/docs/html/slsDetectors-FAQ/img214.png b/docs/html/slsDetectors-FAQ/img214.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img214.png rename to docs/html/slsDetectors-FAQ/img214.png diff --git a/manual/docs/html/slsDetectors-FAQ/img215.png b/docs/html/slsDetectors-FAQ/img215.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img215.png rename to docs/html/slsDetectors-FAQ/img215.png diff --git a/manual/docs/html/slsDetectors-FAQ/img216.png b/docs/html/slsDetectors-FAQ/img216.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img216.png rename to docs/html/slsDetectors-FAQ/img216.png diff --git a/manual/docs/html/slsDetectors-FAQ/img217.png b/docs/html/slsDetectors-FAQ/img217.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img217.png rename to docs/html/slsDetectors-FAQ/img217.png diff --git a/manual/docs/html/slsDetectors-FAQ/img218.png b/docs/html/slsDetectors-FAQ/img218.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img218.png rename to docs/html/slsDetectors-FAQ/img218.png diff --git a/manual/docs/html/slsDetectors-FAQ/img219.png b/docs/html/slsDetectors-FAQ/img219.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img219.png rename to docs/html/slsDetectors-FAQ/img219.png diff --git a/manual/docs/html/slsDetectors-FAQ/img22.png b/docs/html/slsDetectors-FAQ/img22.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img22.png rename to docs/html/slsDetectors-FAQ/img22.png diff --git a/manual/docs/html/slsDetectors-FAQ/img220.png b/docs/html/slsDetectors-FAQ/img220.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img220.png rename to docs/html/slsDetectors-FAQ/img220.png diff --git a/manual/docs/html/slsDetectors-FAQ/img221.png b/docs/html/slsDetectors-FAQ/img221.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img221.png rename to docs/html/slsDetectors-FAQ/img221.png diff --git a/manual/docs/html/slsDetectors-FAQ/img222.png b/docs/html/slsDetectors-FAQ/img222.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img222.png rename to docs/html/slsDetectors-FAQ/img222.png diff --git a/manual/docs/html/slsDetectors-FAQ/img223.png b/docs/html/slsDetectors-FAQ/img223.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img223.png rename to docs/html/slsDetectors-FAQ/img223.png diff --git a/manual/docs/html/slsDetectors-FAQ/img224.png b/docs/html/slsDetectors-FAQ/img224.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img224.png rename to docs/html/slsDetectors-FAQ/img224.png diff --git a/manual/docs/html/slsDetectors-FAQ/img225.png b/docs/html/slsDetectors-FAQ/img225.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img225.png rename to docs/html/slsDetectors-FAQ/img225.png diff --git a/manual/docs/html/slsDetectors-FAQ/img226.png b/docs/html/slsDetectors-FAQ/img226.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img226.png rename to docs/html/slsDetectors-FAQ/img226.png diff --git a/manual/docs/html/slsDetectors-FAQ/img23.png b/docs/html/slsDetectors-FAQ/img23.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img23.png rename to docs/html/slsDetectors-FAQ/img23.png diff --git a/manual/docs/html/slsDetectors-FAQ/img24.png b/docs/html/slsDetectors-FAQ/img24.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img24.png rename to docs/html/slsDetectors-FAQ/img24.png diff --git a/manual/docs/html/slsDetectors-FAQ/img25.png b/docs/html/slsDetectors-FAQ/img25.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img25.png rename to docs/html/slsDetectors-FAQ/img25.png diff --git a/manual/docs/html/slsDetectors-FAQ/img26.png b/docs/html/slsDetectors-FAQ/img26.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img26.png rename to docs/html/slsDetectors-FAQ/img26.png diff --git a/manual/docs/html/slsDetectors-FAQ/img27.png b/docs/html/slsDetectors-FAQ/img27.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img27.png rename to docs/html/slsDetectors-FAQ/img27.png diff --git a/manual/docs/html/slsDetectors-FAQ/img28.png b/docs/html/slsDetectors-FAQ/img28.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img28.png rename to docs/html/slsDetectors-FAQ/img28.png diff --git a/manual/docs/html/slsDetectors-FAQ/img29.png b/docs/html/slsDetectors-FAQ/img29.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img29.png rename to docs/html/slsDetectors-FAQ/img29.png diff --git a/manual/docs/html/slsDetectors-FAQ/img3.png b/docs/html/slsDetectors-FAQ/img3.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img3.png rename to docs/html/slsDetectors-FAQ/img3.png diff --git a/manual/docs/html/slsDetectors-FAQ/img30.png b/docs/html/slsDetectors-FAQ/img30.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img30.png rename to docs/html/slsDetectors-FAQ/img30.png diff --git a/manual/docs/html/slsDetectors-FAQ/img31.png b/docs/html/slsDetectors-FAQ/img31.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img31.png rename to docs/html/slsDetectors-FAQ/img31.png diff --git a/manual/docs/html/slsDetectors-FAQ/img32.png b/docs/html/slsDetectors-FAQ/img32.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img32.png rename to docs/html/slsDetectors-FAQ/img32.png diff --git a/manual/docs/html/slsDetectors-FAQ/img33.png b/docs/html/slsDetectors-FAQ/img33.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img33.png rename to docs/html/slsDetectors-FAQ/img33.png diff --git a/manual/docs/html/slsDetectors-FAQ/img34.png b/docs/html/slsDetectors-FAQ/img34.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img34.png rename to docs/html/slsDetectors-FAQ/img34.png diff --git a/manual/docs/html/slsDetectors-FAQ/img35.png b/docs/html/slsDetectors-FAQ/img35.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img35.png rename to docs/html/slsDetectors-FAQ/img35.png diff --git a/manual/docs/html/slsDetectors-FAQ/img36.png b/docs/html/slsDetectors-FAQ/img36.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img36.png rename to docs/html/slsDetectors-FAQ/img36.png diff --git a/manual/docs/html/slsDetectors-FAQ/img37.png b/docs/html/slsDetectors-FAQ/img37.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img37.png rename to docs/html/slsDetectors-FAQ/img37.png diff --git a/manual/docs/html/slsDetectors-FAQ/img38.png b/docs/html/slsDetectors-FAQ/img38.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img38.png rename to docs/html/slsDetectors-FAQ/img38.png diff --git a/manual/docs/html/slsDetectors-FAQ/img39.png b/docs/html/slsDetectors-FAQ/img39.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img39.png rename to docs/html/slsDetectors-FAQ/img39.png diff --git a/manual/docs/html/slsDetectors-FAQ/img4.png b/docs/html/slsDetectors-FAQ/img4.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img4.png rename to docs/html/slsDetectors-FAQ/img4.png diff --git a/manual/docs/html/slsDetectors-FAQ/img40.png b/docs/html/slsDetectors-FAQ/img40.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img40.png rename to docs/html/slsDetectors-FAQ/img40.png diff --git a/manual/docs/html/slsDetectors-FAQ/img41.png b/docs/html/slsDetectors-FAQ/img41.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img41.png rename to docs/html/slsDetectors-FAQ/img41.png diff --git a/manual/docs/html/slsDetectors-FAQ/img42.png b/docs/html/slsDetectors-FAQ/img42.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img42.png rename to docs/html/slsDetectors-FAQ/img42.png diff --git a/manual/docs/html/slsDetectors-FAQ/img43.png b/docs/html/slsDetectors-FAQ/img43.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img43.png rename to docs/html/slsDetectors-FAQ/img43.png diff --git a/manual/docs/html/slsDetectors-FAQ/img44.png b/docs/html/slsDetectors-FAQ/img44.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img44.png rename to docs/html/slsDetectors-FAQ/img44.png diff --git a/manual/docs/html/slsDetectors-FAQ/img45.png b/docs/html/slsDetectors-FAQ/img45.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img45.png rename to docs/html/slsDetectors-FAQ/img45.png diff --git a/manual/docs/html/slsDetectors-FAQ/img46.png b/docs/html/slsDetectors-FAQ/img46.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img46.png rename to docs/html/slsDetectors-FAQ/img46.png diff --git a/manual/docs/html/slsDetectors-FAQ/img47.png b/docs/html/slsDetectors-FAQ/img47.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img47.png rename to docs/html/slsDetectors-FAQ/img47.png diff --git a/manual/docs/html/slsDetectors-FAQ/img48.png b/docs/html/slsDetectors-FAQ/img48.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img48.png rename to docs/html/slsDetectors-FAQ/img48.png diff --git a/manual/docs/html/slsDetectors-FAQ/img49.png b/docs/html/slsDetectors-FAQ/img49.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img49.png rename to docs/html/slsDetectors-FAQ/img49.png diff --git a/manual/docs/html/slsDetectors-FAQ/img5.png b/docs/html/slsDetectors-FAQ/img5.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img5.png rename to docs/html/slsDetectors-FAQ/img5.png diff --git a/manual/docs/html/slsDetectors-FAQ/img50.png b/docs/html/slsDetectors-FAQ/img50.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img50.png rename to docs/html/slsDetectors-FAQ/img50.png diff --git a/manual/docs/html/slsDetectors-FAQ/img51.png b/docs/html/slsDetectors-FAQ/img51.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img51.png rename to docs/html/slsDetectors-FAQ/img51.png diff --git a/manual/docs/html/slsDetectors-FAQ/img52.png b/docs/html/slsDetectors-FAQ/img52.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img52.png rename to docs/html/slsDetectors-FAQ/img52.png diff --git a/manual/docs/html/slsDetectors-FAQ/img53.png b/docs/html/slsDetectors-FAQ/img53.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img53.png rename to docs/html/slsDetectors-FAQ/img53.png diff --git a/manual/docs/html/slsDetectors-FAQ/img54.png b/docs/html/slsDetectors-FAQ/img54.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img54.png rename to docs/html/slsDetectors-FAQ/img54.png diff --git a/manual/docs/html/slsDetectors-FAQ/img55.png b/docs/html/slsDetectors-FAQ/img55.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img55.png rename to docs/html/slsDetectors-FAQ/img55.png diff --git a/manual/docs/html/slsDetectors-FAQ/img56.png b/docs/html/slsDetectors-FAQ/img56.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img56.png rename to docs/html/slsDetectors-FAQ/img56.png diff --git a/manual/docs/html/slsDetectors-FAQ/img57.png b/docs/html/slsDetectors-FAQ/img57.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img57.png rename to docs/html/slsDetectors-FAQ/img57.png diff --git a/manual/docs/html/slsDetectors-FAQ/img58.png b/docs/html/slsDetectors-FAQ/img58.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img58.png rename to docs/html/slsDetectors-FAQ/img58.png diff --git a/manual/docs/html/slsDetectors-FAQ/img59.png b/docs/html/slsDetectors-FAQ/img59.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img59.png rename to docs/html/slsDetectors-FAQ/img59.png diff --git a/manual/docs/html/slsDetectors-FAQ/img6.png b/docs/html/slsDetectors-FAQ/img6.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img6.png rename to docs/html/slsDetectors-FAQ/img6.png diff --git a/manual/docs/html/slsDetectors-FAQ/img60.png b/docs/html/slsDetectors-FAQ/img60.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img60.png rename to docs/html/slsDetectors-FAQ/img60.png diff --git a/manual/docs/html/slsDetectors-FAQ/img61.png b/docs/html/slsDetectors-FAQ/img61.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img61.png rename to docs/html/slsDetectors-FAQ/img61.png diff --git a/manual/docs/html/slsDetectors-FAQ/img62.png b/docs/html/slsDetectors-FAQ/img62.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img62.png rename to docs/html/slsDetectors-FAQ/img62.png diff --git a/manual/docs/html/slsDetectors-FAQ/img63.png b/docs/html/slsDetectors-FAQ/img63.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img63.png rename to docs/html/slsDetectors-FAQ/img63.png diff --git a/manual/docs/html/slsDetectors-FAQ/img64.png b/docs/html/slsDetectors-FAQ/img64.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img64.png rename to docs/html/slsDetectors-FAQ/img64.png diff --git a/manual/docs/html/slsDetectors-FAQ/img65.png b/docs/html/slsDetectors-FAQ/img65.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img65.png rename to docs/html/slsDetectors-FAQ/img65.png diff --git a/manual/docs/html/slsDetectors-FAQ/img66.png b/docs/html/slsDetectors-FAQ/img66.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img66.png rename to docs/html/slsDetectors-FAQ/img66.png diff --git a/manual/docs/html/slsDetectors-FAQ/img67.png b/docs/html/slsDetectors-FAQ/img67.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img67.png rename to docs/html/slsDetectors-FAQ/img67.png diff --git a/manual/docs/html/slsDetectors-FAQ/img68.png b/docs/html/slsDetectors-FAQ/img68.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img68.png rename to docs/html/slsDetectors-FAQ/img68.png diff --git a/manual/docs/html/slsDetectors-FAQ/img69.png b/docs/html/slsDetectors-FAQ/img69.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img69.png rename to docs/html/slsDetectors-FAQ/img69.png diff --git a/manual/docs/html/slsDetectors-FAQ/img7.png b/docs/html/slsDetectors-FAQ/img7.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img7.png rename to docs/html/slsDetectors-FAQ/img7.png diff --git a/manual/docs/html/slsDetectors-FAQ/img70.png b/docs/html/slsDetectors-FAQ/img70.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img70.png rename to docs/html/slsDetectors-FAQ/img70.png diff --git a/manual/docs/html/slsDetectors-FAQ/img71.png b/docs/html/slsDetectors-FAQ/img71.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img71.png rename to docs/html/slsDetectors-FAQ/img71.png diff --git a/manual/docs/html/slsDetectors-FAQ/img72.png b/docs/html/slsDetectors-FAQ/img72.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img72.png rename to docs/html/slsDetectors-FAQ/img72.png diff --git a/manual/docs/html/slsDetectors-FAQ/img73.png b/docs/html/slsDetectors-FAQ/img73.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img73.png rename to docs/html/slsDetectors-FAQ/img73.png diff --git a/manual/docs/html/slsDetectors-FAQ/img74.png b/docs/html/slsDetectors-FAQ/img74.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img74.png rename to docs/html/slsDetectors-FAQ/img74.png diff --git a/manual/docs/html/slsDetectors-FAQ/img75.png b/docs/html/slsDetectors-FAQ/img75.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img75.png rename to docs/html/slsDetectors-FAQ/img75.png diff --git a/manual/docs/html/slsDetectors-FAQ/img76.png b/docs/html/slsDetectors-FAQ/img76.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img76.png rename to docs/html/slsDetectors-FAQ/img76.png diff --git a/manual/docs/html/slsDetectors-FAQ/img77.png b/docs/html/slsDetectors-FAQ/img77.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img77.png rename to docs/html/slsDetectors-FAQ/img77.png diff --git a/manual/docs/html/slsDetectors-FAQ/img78.png b/docs/html/slsDetectors-FAQ/img78.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img78.png rename to docs/html/slsDetectors-FAQ/img78.png diff --git a/manual/docs/html/slsDetectors-FAQ/img79.png b/docs/html/slsDetectors-FAQ/img79.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img79.png rename to docs/html/slsDetectors-FAQ/img79.png diff --git a/manual/docs/html/slsDetectors-FAQ/img8.png b/docs/html/slsDetectors-FAQ/img8.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img8.png rename to docs/html/slsDetectors-FAQ/img8.png diff --git a/manual/docs/html/slsDetectors-FAQ/img80.png b/docs/html/slsDetectors-FAQ/img80.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img80.png rename to docs/html/slsDetectors-FAQ/img80.png diff --git a/manual/docs/html/slsDetectors-FAQ/img81.png b/docs/html/slsDetectors-FAQ/img81.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img81.png rename to docs/html/slsDetectors-FAQ/img81.png diff --git a/manual/docs/html/slsDetectors-FAQ/img82.png b/docs/html/slsDetectors-FAQ/img82.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img82.png rename to docs/html/slsDetectors-FAQ/img82.png diff --git a/manual/docs/html/slsDetectors-FAQ/img83.png b/docs/html/slsDetectors-FAQ/img83.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img83.png rename to docs/html/slsDetectors-FAQ/img83.png diff --git a/manual/docs/html/slsDetectors-FAQ/img84.png b/docs/html/slsDetectors-FAQ/img84.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img84.png rename to docs/html/slsDetectors-FAQ/img84.png diff --git a/manual/docs/html/slsDetectors-FAQ/img85.png b/docs/html/slsDetectors-FAQ/img85.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img85.png rename to docs/html/slsDetectors-FAQ/img85.png diff --git a/manual/docs/html/slsDetectors-FAQ/img86.png b/docs/html/slsDetectors-FAQ/img86.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img86.png rename to docs/html/slsDetectors-FAQ/img86.png diff --git a/manual/docs/html/slsDetectors-FAQ/img87.png b/docs/html/slsDetectors-FAQ/img87.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img87.png rename to docs/html/slsDetectors-FAQ/img87.png diff --git a/manual/docs/html/slsDetectors-FAQ/img88.png b/docs/html/slsDetectors-FAQ/img88.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img88.png rename to docs/html/slsDetectors-FAQ/img88.png diff --git a/manual/docs/html/slsDetectors-FAQ/img89.png b/docs/html/slsDetectors-FAQ/img89.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img89.png rename to docs/html/slsDetectors-FAQ/img89.png diff --git a/manual/docs/html/slsDetectors-FAQ/img9.png b/docs/html/slsDetectors-FAQ/img9.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img9.png rename to docs/html/slsDetectors-FAQ/img9.png diff --git a/manual/docs/html/slsDetectors-FAQ/img90.png b/docs/html/slsDetectors-FAQ/img90.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img90.png rename to docs/html/slsDetectors-FAQ/img90.png diff --git a/manual/docs/html/slsDetectors-FAQ/img91.png b/docs/html/slsDetectors-FAQ/img91.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img91.png rename to docs/html/slsDetectors-FAQ/img91.png diff --git a/manual/docs/html/slsDetectors-FAQ/img92.png b/docs/html/slsDetectors-FAQ/img92.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img92.png rename to docs/html/slsDetectors-FAQ/img92.png diff --git a/manual/docs/html/slsDetectors-FAQ/img93.png b/docs/html/slsDetectors-FAQ/img93.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img93.png rename to docs/html/slsDetectors-FAQ/img93.png diff --git a/manual/docs/html/slsDetectors-FAQ/img94.png b/docs/html/slsDetectors-FAQ/img94.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img94.png rename to docs/html/slsDetectors-FAQ/img94.png diff --git a/manual/docs/html/slsDetectors-FAQ/img95.png b/docs/html/slsDetectors-FAQ/img95.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img95.png rename to docs/html/slsDetectors-FAQ/img95.png diff --git a/manual/docs/html/slsDetectors-FAQ/img96.png b/docs/html/slsDetectors-FAQ/img96.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img96.png rename to docs/html/slsDetectors-FAQ/img96.png diff --git a/manual/docs/html/slsDetectors-FAQ/img97.png b/docs/html/slsDetectors-FAQ/img97.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img97.png rename to docs/html/slsDetectors-FAQ/img97.png diff --git a/manual/docs/html/slsDetectors-FAQ/img98.png b/docs/html/slsDetectors-FAQ/img98.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img98.png rename to docs/html/slsDetectors-FAQ/img98.png diff --git a/manual/docs/html/slsDetectors-FAQ/img99.png b/docs/html/slsDetectors-FAQ/img99.png similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/img99.png rename to docs/html/slsDetectors-FAQ/img99.png diff --git a/manual/docs/html/slsDetectors-FAQ/index.html b/docs/html/slsDetectors-FAQ/index.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/index.html rename to docs/html/slsDetectors-FAQ/index.html diff --git a/manual/docs/html/slsDetectors-FAQ/internals.pl b/docs/html/slsDetectors-FAQ/internals.pl similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/internals.pl rename to docs/html/slsDetectors-FAQ/internals.pl diff --git a/manual/docs/html/slsDetectors-FAQ/labels.pl b/docs/html/slsDetectors-FAQ/labels.pl similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/labels.pl rename to docs/html/slsDetectors-FAQ/labels.pl diff --git a/manual/docs/html/slsDetectors-FAQ/node1.html b/docs/html/slsDetectors-FAQ/node1.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node1.html rename to docs/html/slsDetectors-FAQ/node1.html diff --git a/manual/docs/html/slsDetectors-FAQ/node10.html b/docs/html/slsDetectors-FAQ/node10.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node10.html rename to docs/html/slsDetectors-FAQ/node10.html diff --git a/manual/docs/html/slsDetectors-FAQ/node11.html b/docs/html/slsDetectors-FAQ/node11.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node11.html rename to docs/html/slsDetectors-FAQ/node11.html diff --git a/manual/docs/html/slsDetectors-FAQ/node12.html b/docs/html/slsDetectors-FAQ/node12.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node12.html rename to docs/html/slsDetectors-FAQ/node12.html diff --git a/manual/docs/html/slsDetectors-FAQ/node13.html b/docs/html/slsDetectors-FAQ/node13.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node13.html rename to docs/html/slsDetectors-FAQ/node13.html diff --git a/manual/docs/html/slsDetectors-FAQ/node14.html b/docs/html/slsDetectors-FAQ/node14.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node14.html rename to docs/html/slsDetectors-FAQ/node14.html diff --git a/manual/docs/html/slsDetectors-FAQ/node15.html b/docs/html/slsDetectors-FAQ/node15.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node15.html rename to docs/html/slsDetectors-FAQ/node15.html diff --git a/manual/docs/html/slsDetectors-FAQ/node16.html b/docs/html/slsDetectors-FAQ/node16.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node16.html rename to docs/html/slsDetectors-FAQ/node16.html diff --git a/manual/docs/html/slsDetectors-FAQ/node17.html b/docs/html/slsDetectors-FAQ/node17.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node17.html rename to docs/html/slsDetectors-FAQ/node17.html diff --git a/manual/docs/html/slsDetectors-FAQ/node18.html b/docs/html/slsDetectors-FAQ/node18.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node18.html rename to docs/html/slsDetectors-FAQ/node18.html diff --git a/manual/docs/html/slsDetectors-FAQ/node19.html b/docs/html/slsDetectors-FAQ/node19.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node19.html rename to docs/html/slsDetectors-FAQ/node19.html diff --git a/manual/docs/html/slsDetectors-FAQ/node2.html b/docs/html/slsDetectors-FAQ/node2.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node2.html rename to docs/html/slsDetectors-FAQ/node2.html diff --git a/manual/docs/html/slsDetectors-FAQ/node20.html b/docs/html/slsDetectors-FAQ/node20.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node20.html rename to docs/html/slsDetectors-FAQ/node20.html diff --git a/manual/docs/html/slsDetectors-FAQ/node21.html b/docs/html/slsDetectors-FAQ/node21.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node21.html rename to docs/html/slsDetectors-FAQ/node21.html diff --git a/manual/docs/html/slsDetectors-FAQ/node22.html b/docs/html/slsDetectors-FAQ/node22.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node22.html rename to docs/html/slsDetectors-FAQ/node22.html diff --git a/manual/docs/html/slsDetectors-FAQ/node23.html b/docs/html/slsDetectors-FAQ/node23.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node23.html rename to docs/html/slsDetectors-FAQ/node23.html diff --git a/manual/docs/html/slsDetectors-FAQ/node24.html b/docs/html/slsDetectors-FAQ/node24.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node24.html rename to docs/html/slsDetectors-FAQ/node24.html diff --git a/manual/docs/html/slsDetectors-FAQ/node25.html b/docs/html/slsDetectors-FAQ/node25.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node25.html rename to docs/html/slsDetectors-FAQ/node25.html diff --git a/manual/docs/html/slsDetectors-FAQ/node26.html b/docs/html/slsDetectors-FAQ/node26.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node26.html rename to docs/html/slsDetectors-FAQ/node26.html diff --git a/manual/docs/html/slsDetectors-FAQ/node27.html b/docs/html/slsDetectors-FAQ/node27.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node27.html rename to docs/html/slsDetectors-FAQ/node27.html diff --git a/manual/docs/html/slsDetectors-FAQ/node28.html b/docs/html/slsDetectors-FAQ/node28.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node28.html rename to docs/html/slsDetectors-FAQ/node28.html diff --git a/manual/docs/html/slsDetectors-FAQ/node29.html b/docs/html/slsDetectors-FAQ/node29.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node29.html rename to docs/html/slsDetectors-FAQ/node29.html diff --git a/manual/docs/html/slsDetectors-FAQ/node3.html b/docs/html/slsDetectors-FAQ/node3.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node3.html rename to docs/html/slsDetectors-FAQ/node3.html diff --git a/manual/docs/html/slsDetectors-FAQ/node30.html b/docs/html/slsDetectors-FAQ/node30.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node30.html rename to docs/html/slsDetectors-FAQ/node30.html diff --git a/manual/docs/html/slsDetectors-FAQ/node31.html b/docs/html/slsDetectors-FAQ/node31.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node31.html rename to docs/html/slsDetectors-FAQ/node31.html diff --git a/manual/docs/html/slsDetectors-FAQ/node32.html b/docs/html/slsDetectors-FAQ/node32.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node32.html rename to docs/html/slsDetectors-FAQ/node32.html diff --git a/manual/docs/html/slsDetectors-FAQ/node33.html b/docs/html/slsDetectors-FAQ/node33.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node33.html rename to docs/html/slsDetectors-FAQ/node33.html diff --git a/manual/docs/html/slsDetectors-FAQ/node34.html b/docs/html/slsDetectors-FAQ/node34.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node34.html rename to docs/html/slsDetectors-FAQ/node34.html diff --git a/manual/docs/html/slsDetectors-FAQ/node35.html b/docs/html/slsDetectors-FAQ/node35.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node35.html rename to docs/html/slsDetectors-FAQ/node35.html diff --git a/manual/docs/html/slsDetectors-FAQ/node36.html b/docs/html/slsDetectors-FAQ/node36.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node36.html rename to docs/html/slsDetectors-FAQ/node36.html diff --git a/manual/docs/html/slsDetectors-FAQ/node37.html b/docs/html/slsDetectors-FAQ/node37.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node37.html rename to docs/html/slsDetectors-FAQ/node37.html diff --git a/manual/docs/html/slsDetectors-FAQ/node38.html b/docs/html/slsDetectors-FAQ/node38.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node38.html rename to docs/html/slsDetectors-FAQ/node38.html diff --git a/manual/docs/html/slsDetectors-FAQ/node39.html b/docs/html/slsDetectors-FAQ/node39.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node39.html rename to docs/html/slsDetectors-FAQ/node39.html diff --git a/manual/docs/html/slsDetectors-FAQ/node4.html b/docs/html/slsDetectors-FAQ/node4.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node4.html rename to docs/html/slsDetectors-FAQ/node4.html diff --git a/manual/docs/html/slsDetectors-FAQ/node40.html b/docs/html/slsDetectors-FAQ/node40.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node40.html rename to docs/html/slsDetectors-FAQ/node40.html diff --git a/manual/docs/html/slsDetectors-FAQ/node41.html b/docs/html/slsDetectors-FAQ/node41.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node41.html rename to docs/html/slsDetectors-FAQ/node41.html diff --git a/manual/docs/html/slsDetectors-FAQ/node42.html b/docs/html/slsDetectors-FAQ/node42.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node42.html rename to docs/html/slsDetectors-FAQ/node42.html diff --git a/manual/docs/html/slsDetectors-FAQ/node43.html b/docs/html/slsDetectors-FAQ/node43.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node43.html rename to docs/html/slsDetectors-FAQ/node43.html diff --git a/manual/docs/html/slsDetectors-FAQ/node44.html b/docs/html/slsDetectors-FAQ/node44.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node44.html rename to docs/html/slsDetectors-FAQ/node44.html diff --git a/manual/docs/html/slsDetectors-FAQ/node45.html b/docs/html/slsDetectors-FAQ/node45.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node45.html rename to docs/html/slsDetectors-FAQ/node45.html diff --git a/manual/docs/html/slsDetectors-FAQ/node46.html b/docs/html/slsDetectors-FAQ/node46.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node46.html rename to docs/html/slsDetectors-FAQ/node46.html diff --git a/manual/docs/html/slsDetectors-FAQ/node47.html b/docs/html/slsDetectors-FAQ/node47.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node47.html rename to docs/html/slsDetectors-FAQ/node47.html diff --git a/manual/docs/html/slsDetectors-FAQ/node48.html b/docs/html/slsDetectors-FAQ/node48.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node48.html rename to docs/html/slsDetectors-FAQ/node48.html diff --git a/manual/docs/html/slsDetectors-FAQ/node49.html b/docs/html/slsDetectors-FAQ/node49.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node49.html rename to docs/html/slsDetectors-FAQ/node49.html diff --git a/manual/docs/html/slsDetectors-FAQ/node5.html b/docs/html/slsDetectors-FAQ/node5.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node5.html rename to docs/html/slsDetectors-FAQ/node5.html diff --git a/manual/docs/html/slsDetectors-FAQ/node50.html b/docs/html/slsDetectors-FAQ/node50.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node50.html rename to docs/html/slsDetectors-FAQ/node50.html diff --git a/manual/docs/html/slsDetectors-FAQ/node51.html b/docs/html/slsDetectors-FAQ/node51.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node51.html rename to docs/html/slsDetectors-FAQ/node51.html diff --git a/manual/docs/html/slsDetectors-FAQ/node52.html b/docs/html/slsDetectors-FAQ/node52.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node52.html rename to docs/html/slsDetectors-FAQ/node52.html diff --git a/manual/docs/html/slsDetectors-FAQ/node53.html b/docs/html/slsDetectors-FAQ/node53.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node53.html rename to docs/html/slsDetectors-FAQ/node53.html diff --git a/manual/docs/html/slsDetectors-FAQ/node54.html b/docs/html/slsDetectors-FAQ/node54.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node54.html rename to docs/html/slsDetectors-FAQ/node54.html diff --git a/manual/docs/html/slsDetectors-FAQ/node55.html b/docs/html/slsDetectors-FAQ/node55.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node55.html rename to docs/html/slsDetectors-FAQ/node55.html diff --git a/manual/docs/html/slsDetectors-FAQ/node56.html b/docs/html/slsDetectors-FAQ/node56.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node56.html rename to docs/html/slsDetectors-FAQ/node56.html diff --git a/manual/docs/html/slsDetectors-FAQ/node57.html b/docs/html/slsDetectors-FAQ/node57.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node57.html rename to docs/html/slsDetectors-FAQ/node57.html diff --git a/manual/docs/html/slsDetectors-FAQ/node58.html b/docs/html/slsDetectors-FAQ/node58.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node58.html rename to docs/html/slsDetectors-FAQ/node58.html diff --git a/manual/docs/html/slsDetectors-FAQ/node59.html b/docs/html/slsDetectors-FAQ/node59.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node59.html rename to docs/html/slsDetectors-FAQ/node59.html diff --git a/manual/docs/html/slsDetectors-FAQ/node6.html b/docs/html/slsDetectors-FAQ/node6.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node6.html rename to docs/html/slsDetectors-FAQ/node6.html diff --git a/manual/docs/html/slsDetectors-FAQ/node60.html b/docs/html/slsDetectors-FAQ/node60.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node60.html rename to docs/html/slsDetectors-FAQ/node60.html diff --git a/manual/docs/html/slsDetectors-FAQ/node61.html b/docs/html/slsDetectors-FAQ/node61.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node61.html rename to docs/html/slsDetectors-FAQ/node61.html diff --git a/manual/docs/html/slsDetectors-FAQ/node62.html b/docs/html/slsDetectors-FAQ/node62.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node62.html rename to docs/html/slsDetectors-FAQ/node62.html diff --git a/manual/docs/html/slsDetectors-FAQ/node63.html b/docs/html/slsDetectors-FAQ/node63.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node63.html rename to docs/html/slsDetectors-FAQ/node63.html diff --git a/manual/docs/html/slsDetectors-FAQ/node64.html b/docs/html/slsDetectors-FAQ/node64.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node64.html rename to docs/html/slsDetectors-FAQ/node64.html diff --git a/manual/docs/html/slsDetectors-FAQ/node65.html b/docs/html/slsDetectors-FAQ/node65.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node65.html rename to docs/html/slsDetectors-FAQ/node65.html diff --git a/manual/docs/html/slsDetectors-FAQ/node66.html b/docs/html/slsDetectors-FAQ/node66.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node66.html rename to docs/html/slsDetectors-FAQ/node66.html diff --git a/manual/docs/html/slsDetectors-FAQ/node7.html b/docs/html/slsDetectors-FAQ/node7.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node7.html rename to docs/html/slsDetectors-FAQ/node7.html diff --git a/manual/docs/html/slsDetectors-FAQ/node8.html b/docs/html/slsDetectors-FAQ/node8.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node8.html rename to docs/html/slsDetectors-FAQ/node8.html diff --git a/manual/docs/html/slsDetectors-FAQ/node9.html b/docs/html/slsDetectors-FAQ/node9.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/node9.html rename to docs/html/slsDetectors-FAQ/node9.html diff --git a/manual/docs/html/slsDetectors-FAQ/slsDetectors-FAQ.css b/docs/html/slsDetectors-FAQ/slsDetectors-FAQ.css similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/slsDetectors-FAQ.css rename to docs/html/slsDetectors-FAQ/slsDetectors-FAQ.css diff --git a/manual/docs/html/slsDetectors-FAQ/slsDetectors-FAQ.html b/docs/html/slsDetectors-FAQ/slsDetectors-FAQ.html similarity index 100% rename from manual/docs/html/slsDetectors-FAQ/slsDetectors-FAQ.html rename to docs/html/slsDetectors-FAQ/slsDetectors-FAQ.html diff --git a/manual/docs/pdf/angularCalibrationHowTo.pdf b/docs/pdf/angularCalibrationHowTo.pdf similarity index 100% rename from manual/docs/pdf/angularCalibrationHowTo.pdf rename to docs/pdf/angularCalibrationHowTo.pdf diff --git a/manual/docs/pdf/energyCalibrationHowTo.pdf b/docs/pdf/energyCalibrationHowTo.pdf similarity index 100% rename from manual/docs/pdf/energyCalibrationHowTo.pdf rename to docs/pdf/energyCalibrationHowTo.pdf diff --git a/manual/docs/pdf/slsDetectorClientDocs.pdf b/docs/pdf/slsDetectorClientDocs.pdf similarity index 100% rename from manual/docs/pdf/slsDetectorClientDocs.pdf rename to docs/pdf/slsDetectorClientDocs.pdf diff --git a/manual/docs/pdf/slsDetectorClientHowTo.pdf b/docs/pdf/slsDetectorClientHowTo.pdf similarity index 100% rename from manual/docs/pdf/slsDetectorClientHowTo.pdf rename to docs/pdf/slsDetectorClientHowTo.pdf diff --git a/manual/docs/pdf/slsDetectorGuiHowTo.pdf b/docs/pdf/slsDetectorGuiHowTo.pdf similarity index 100% rename from manual/docs/pdf/slsDetectorGuiHowTo.pdf rename to docs/pdf/slsDetectorGuiHowTo.pdf diff --git a/manual/docs/pdf/slsDetectorInstall.pdf b/docs/pdf/slsDetectorInstall.pdf similarity index 100% rename from manual/docs/pdf/slsDetectorInstall.pdf rename to docs/pdf/slsDetectorInstall.pdf diff --git a/manual/docs/pdf/slsDetectorUsersDocs.pdf b/docs/pdf/slsDetectorUsersDocs.pdf similarity index 100% rename from manual/docs/pdf/slsDetectorUsersDocs.pdf rename to docs/pdf/slsDetectorUsersDocs.pdf diff --git a/manual/docs/pdf/slsDetectors-FAQ.pdf b/docs/pdf/slsDetectors-FAQ.pdf similarity index 100% rename from manual/docs/pdf/slsDetectors-FAQ.pdf rename to docs/pdf/slsDetectors-FAQ.pdf diff --git a/evalVersionVariables.sh b/evalVersionVariables.sh deleted file mode 100644 index 5824ca13c..000000000 --- a/evalVersionVariables.sh +++ /dev/null @@ -1,22 +0,0 @@ -GITREPO1='git remote -v' -GITREPO2=" | grep \"fetch\" | cut -d' ' -f1" -BRANCH1='git branch -v' -BRANCH2=" | grep '*' | cut -d' ' -f2" -REPUID1='git log --pretty=format:"%H" -1' -AUTH1_1='git log --pretty=format:"%cn" -1' -AUTH1_2=" | cut -d' ' -f1" -AUTH2_1='git log --pretty=format:"%cn" -1' -AUTH2_2=" | cut -d' ' -f2" -FOLDERREV1='git log --oneline . ' #used for all the individual server folders -FOLDERREV2=" | wc -l" #used for all the individual server folders -REV1='git log --oneline ' -REV2=" | wc -l" - -GITREPO=`eval $GITREPO1 $GITREPO2` -BRANCH=`eval $BRANCH1 $BRANCH2` -REPUID=`eval $REPUID1` -AUTH1=`eval $AUTH1_1 $AUTH1_2` -AUTH2=`eval $AUTH2_1 $AUTH2_2` -REV=`eval $REV1 $REV2` -FOLDERREV=`eval $FOLDERREV1 $FOLDERREV2` - diff --git a/examples/ang.off b/examples/ang.off deleted file mode 100755 index 819a60667..000000000 --- a/examples/ang.off +++ /dev/null @@ -1,24 +0,0 @@ - module 0 center 6.395E+02 +- 0.00E+00 conversion 6.5660E-05 +- 7.10E-09 offset 0.00000 +- 0.00015 - module 1 center 6.395E+02 +- 0.00E+00 conversion 6.5650E-05 +- 7.09E-09 offset 5.00211 +- 0.00015 - module 2 center 6.395E+02 +- 0.00E+00 conversion 6.5625E-05 +- 7.09E-09 offset 10.00733 +- 0.00015 - module 3 center 6.395E+02 +- 0.00E+00 conversion 6.5618E-05 +- 7.09E-09 offset 15.00742 +- 0.00015 - module 4 center 6.395E+02 +- 0.00E+00 conversion 6.5642E-05 +- 7.15E-09 offset 20.00620 +- 0.00015 - module 5 center 6.395E+02 +- 0.00E+00 conversion 6.5612E-05 +- 7.09E-09 offset 25.00281 +- 0.00015 - module 6 center 6.395E+02 +- 0.00E+00 conversion 6.5623E-05 +- 6.93E-09 offset 30.00704 +- 0.00015 - module 7 center 6.395E+02 +- 0.00E+00 conversion 6.5605E-05 +- 7.10E-09 offset 34.99715 +- 0.00015 - module 8 center 6.395E+02 +- 0.00E+00 conversion 6.5643E-05 +- 7.21E-09 offset 39.99533 +- 0.00015 - module 9 center 6.395E+02 +- 0.00E+00 conversion 6.5638E-05 +- 7.09E-09 offset 44.99969 +- 0.00015 - module 10 center 6.395E+02 +- 0.00E+00 conversion 6.5638E-05 +- 6.94E-09 offset 49.99859 +- 0.00015 - module 11 center 6.395E+02 +- 0.00E+00 conversion 6.5644E-05 +- 7.10E-09 offset 54.99499 +- 0.00015 - module 12 center 6.395E+02 +- 0.00E+00 conversion 6.5618E-05 +- 7.09E-09 offset 59.99120 +- 0.00015 - module 13 center 6.395E+02 +- 0.00E+00 conversion 6.5607E-05 +- 7.11E-09 offset 64.98880 +- 0.00015 - module 14 center 6.395E+02 +- 0.00E+00 conversion 6.5609E-05 +- 7.09E-09 offset 69.98205 +- 0.00015 - module 15 center 6.395E+02 +- 0.00E+00 conversion 6.5611E-05 +- 7.09E-09 offset 74.98379 +- 0.00015 - module 16 center 6.395E+02 +- 0.00E+00 conversion 6.5619E-05 +- 4.72E-09 offset 79.98559 +- 0.00015 - module 17 center 6.395E+02 +- 0.00E+00 conversion 6.5604E-05 +- 7.09E-09 offset 84.98376 +- 0.00015 - module 18 center 6.395E+02 +- 0.00E+00 conversion 6.5605E-05 +- 7.09E-09 offset 89.98307 +- 0.00015 - module 19 center 6.395E+02 +- 0.00E+00 conversion 6.5616E-05 +- 7.09E-09 offset 94.98907 +- 0.00015 - module 20 center 6.395E+02 +- 0.00E+00 conversion 6.5634E-05 +- 7.08E-09 offset 99.97965 +- 0.00015 - module 21 center 6.395E+02 +- 0.00E+00 conversion 6.5608E-05 +- 4.16E-09 offset 104.99732 +- 0.00016 - module 22 center 6.395E+02 +- 0.00E+00 conversion 6.5608E-05 +- 7.09E-09 offset 109.98646 +- 0.00015 - module 23 center 6.395E+02 +- 0.00E+00 conversion 6.5649E-05 +- 7.09E-09 offset 114.98765 +- 0.00015 diff --git a/examples/bad.chans b/examples/bad.chans deleted file mode 100644 index 6e7db22a2..000000000 --- a/examples/bad.chans +++ /dev/null @@ -1,5 +0,0 @@ -15 -1528 -5000 -6513 - diff --git a/examples/config_gen_script/beb_31_25.config_gen b/examples/config_gen_script/beb_31_25.config_gen deleted file mode 100644 index eb4216877..000000000 --- a/examples/config_gen_script/beb_31_25.config_gen +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# local variables -dir=/home/l_msdetect/martin/sls_detectors_package/settingsdir/eiger - -# HOSTNAMES is special -# Beside of the hostname line it also defines the amount of (half) modules -# for the body part -# take care for the last space -HOSTNAMES="beb031 beb025 " - -## header contains constant values at the beginning of the file -header=( -detsizechan="2048 512" -) - -## the body part is for each half module -# counters will count automatically -# the number behind ':' indicates the incrementation value - -counters=( -rx_tcpport="1958:1" -rx_udpport="50001:2" -rx_udpport2="50002:2" -) - -# constant values -constants=( -rx_hostname="mpc1975" -lock=0 -settingsdir=$dir -caldir=$dir -) - -# lists contains space separated lists each value for each half module -lists=( -#detectorip="10.1.1.214 10.1.1.213 10.1.1.216 10.1.1.211 10.1.1.215 10.1.1.210 10.1.1.217 10.1.1.212" -) - - -## footer contains constant values for the end of the file -footer=( -outdir=/home/l_msdetect/martin/out -threaded=1 -clkdivider=2 -) - diff --git a/examples/config_gen_script/config_gen b/examples/config_gen_script/config_gen deleted file mode 100755 index 28f813912..000000000 --- a/examples/config_gen_script/config_gen +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -if [ "$1" == "--help" ]; then - echo This tool generates config files. - echo Please edit the variables in the script - echo and run $0 \> output.config. - exit -fi - -if [ "$1" == "" ]; then - echo This script generates config files for slsDetector out of config_gen files - echo Please specify the config_gen file - exit -fi - -. $1 - - -function get_name_value -{ - name=${1%%=*} - value=${1#*=} -} - -function shift_var -{ - shifts=$1 - shift - shift $shifts - value=$1 -} - - -echo hostname ${HOSTNAMES// /+} -for i in "${header[@]}"; do - get_name_value "$i" - echo $name $value -done - -echo - -num=0 -for host in $HOSTNAMES; do - for i in "${counters[@]}"; do - get_name_value "$i" - value2=${value%%:*} - inc=${value#*:} - echo $num:$name $((value2+$((num*$inc)))) - done - - for i in "${lists[@]}"; do - get_name_value "$i" - shift_var $num $value - echo $num:$name $value - done - - for i in "${constants[@]}"; do - get_name_value "$i" - echo $num:$name $value - done - echo - num=$((num+1)) -done - -for i in "${footer[@]}"; do - get_name_value "$i" - echo $name $value -done - -exit - diff --git a/examples/config_gen_script/eiger_2m_1gb.config_gen b/examples/config_gen_script/eiger_2m_1gb.config_gen deleted file mode 100644 index 5a315e23b..000000000 --- a/examples/config_gen_script/eiger_2m_1gb.config_gen +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# local variables -dir=/home/l_msdetect/martin/sls_detectors_package/settingsdir/eiger - -# HOSTNAMES is special -# Beside of the hostname line it also defines the amount of (half) modules -# for the body part -# take care for the last space -HOSTNAMES="beb074 beb071 beb064 beb102 beb087 beb088 beb072 beb073 " - -## header contains constant values at the beginning of the file -header=( -detsizechan="4096 512" -) - -## the body part is for each half module -# counters will count automatically -# the number behind ':' indicates the incrementation value - -counters=( -rx_tcpport="1991:1" -rx_udpport="50011:2" -rx_udpport2="50012:2" -) - -# constant values -constants=( -rx_hostname="10.1.1.100" -rx_udpip="10.1.1.100" -lock=0 -settingsdir=$dir -caldir=$dir -) - -# lists contains space separated lists each value for each half module -lists=( -detectorip="10.1.1.214 10.1.1.213 10.1.1.216 10.1.1.211 10.1.1.215 10.1.1.210 10.1.1.217 10.1.1.212" -) - - -## footer contains constant values for the end of the file -footer=( -outdir=/home/l_msdetect/martin/out -threaded=1 -) - diff --git a/examples/eiger_10Gb.config b/examples/eiger_10Gb.config deleted file mode 100644 index 2635deb3f..000000000 --- a/examples/eiger_10Gb.config +++ /dev/null @@ -1,33 +0,0 @@ -detsizechan 1024 512 -#detetctor geometry, long side of the module first -hostname beb059+beb058+ -#1Gb detector hostname for controls - -0:rx_tcpport 1991 -#tcpport for the first halfmodule -0:rx_udpport 50011 -#udp port first quadrant, first halfmodule -0:rx_udpport2 50012 -#udp port second quadrant, first halfmodule -0:rx_udpip 10.0.30.210 -#udp IP of the receiver over 10Gb -0:detectorip 10.0.30.100 -#first half module 10 Gb IP - -1:rx_tcpport 1992 -#tcpport for the second halfmodule -1:rx_udpport 50013 -#udp port first quadrant, second halfmodule -1:rx_udpport2 50014 -#udp port second quadrant, second halfmodule -1:rx_udpip 10.0.40.210 -#udp IP of the receiver over 10Gb, -#can be the same or different from 0:rx_udpip -1:detectorip 10.0.40.101 -#second half module 10 Gb IP - -rx_hostname x12sa-vcons -#1Gb receiver pc hostname - -outdir /sls/X12SA/data/x12saop/Data10/Eiger0.5M -threaded 1 diff --git a/examples/eiger_1Gb.config b/examples/eiger_1Gb.config deleted file mode 100644 index a36225844..000000000 --- a/examples/eiger_1Gb.config +++ /dev/null @@ -1,24 +0,0 @@ -detsizechan 1024 512 -#detetctor geometry, long side of the module first -hostname beb059+beb058+ -#1Gb detector hostname for controls - -0:rx_tcpport 1991 -#tcpport for the first halfmodule -0:rx_udpport 50011 -#udp port first quadrant, first halfmodule -0:rx_udpport2 50012 -#udp port second quadrant, first halfmodule - -1:rx_tcpport 1992 -#tcpport for the second halfmodule -1:rx_udpport 50013 -#udp port first quadrant, second halfmodule -1:rx_udpport2 50014 -#udp port second quadrant, second halfmodule - -rx_hostname x12sa-vcons -#1Gb receiver pc hostname - -outdir /sls/X12SA/data/x12saop/Data10/Eiger0.5M -threaded 1 diff --git a/examples/gotthard.config b/examples/gotthard.config deleted file mode 100644 index f2c290df0..000000000 --- a/examples/gotthard.config +++ /dev/null @@ -1,27 +0,0 @@ -hostname bchip007 - -#0:port 1952 -#0:stopport 1953 -#0:rx_tcpport 1956 must also have this in receiver config file -0:angdir 1.000000 -0:moveflag 0.000000 -0:extsig:0 off -#0:detectorip 129.129.202.9 -0:detectormac 00:aa:bb:cc:dd:ee -0:rx_udpport 50004 -0:rx_udpip 129.129.202.98 -0:rx_hostname pc6898 -0:outdir /bigRAID/datadir_gotthard/rec_test_data -0:vhighvoltage 120 -master -1 -sync none -outdir /bigRAID/datadir_gotthard/rec_test_data -headerbefore none -headerafter none -headerbeforepar none -headerafterpar none -badchannels none -angconv none -globaloff 0.000000 -binsize 0.001000 - diff --git a/examples/gotthard_setup.det b/examples/gotthard_setup.det deleted file mode 100644 index 518c0ad6c..000000000 --- a/examples/gotthard_setup.det +++ /dev/null @@ -1,32 +0,0 @@ -fname run -index 0 -dr 16 -settings veryhighgain -threshold 0 -exptime 0.000002990 -period 0.000024984 -delay 0.999999968 -gates 1 -frames 300000.000000000 -cycles 1.000000000 -timing auto -fineoff 0.000000 -startscript none -startscriptpar none -stopscript none -stopscriptpar none -scriptbefore none -scriptbeforepar none -scriptafter none -scriptafterpar none -scan0script none -scan0par none -scan0prec 0 -scan0steps 0 -scan1script none -scan1par none -scan1prec 0 -scan1steps 0 -ratecorr 0.000000 -flatfield none -badchannels none diff --git a/examples/jungfrau.config b/examples/jungfrau.config deleted file mode 100644 index b5c8f734e..000000000 --- a/examples/jungfrau.config +++ /dev/null @@ -1,15 +0,0 @@ -hostname bchip038+ - -0:rx_udpport 50004 -0:rx_udpip 10.1.1.100 -0:detectorip 10.1.1.10 -rx_hostname pcmoench01 - -powerchip 1 - -#extsig:0 trigger_in_rising_edge -#timing trigger - -outdir /external_pool/jungfrau_data/softwaretest - - diff --git a/examples/jungfrau_two.config b/examples/jungfrau_two.config deleted file mode 100644 index 16e50e57d..000000000 --- a/examples/jungfrau_two.config +++ /dev/null @@ -1,25 +0,0 @@ -detsizechan 1024 1024 -hostname bchip048+bchip052+ - -0:rx_udpport 50004 -0:rx_udpip 10.1.1.100 -0:rx_udpmac F4:52:14:2F:32:00 -0:detectorip 10.1.1.10 -0:detectormac 00:aa:bb:cc:dd:33 - -1:rx_tcpport 1955 -1:rx_udpport 50005 -1:rx_udpip 10.1.1.100 -1:rx_udpmac F4:52:14:2F:32:00 -1:detectorip 10.1.1.11 -1:detectormac 00:aa:bb:cc:dd:33 - -rx_hostname pcmoench01 - -powerchip 1 -#extsig:0 trigger_in_rising_edge -#timing trigger - -outdir /external_pool/jungfrau_data/softwaretest - - diff --git a/examples/mythen.config b/examples/mythen.config deleted file mode 100644 index 3390c61c8..000000000 --- a/examples/mythen.config +++ /dev/null @@ -1,32 +0,0 @@ -type Mythen+ -0:hostname mcs1x21 -0:port 1952 -0:stopport 1953 -0:settingsdir /afs/psi.ch/user/b/bergamaschi -0:outdir /afs/psi.ch/user/b/bergamaschi -0:angdir 1.000000 -0:moveflag 1.000000 -0:lock 0 -0:caldir /afs/psi.ch/user/b/bergamaschi -0:ffdir /afs/psi.ch/user/b/bergamaschi -0:nmod 1 -0:waitstates 13 -0:setlength 3 -0:clkdivider 6 -0:extsig:0 gate_in_active_high -0:extsig:1 trigger_in_rising_edge -0:extsig:2 off -0:extsig:3 off -master -1 -sync none -outdir /afs/psi.ch/user/b/bergamaschi -ffdir /afs/psi.ch/user/b/bergamaschi -headerbefore none -headerafter none -headerbeforepar none -headerafterpar none -badchannels none -angconv none -globaloff 0.000000 -binsize 0.001000 -threaded 1 diff --git a/examples/receiver.config b/examples/receiver.config deleted file mode 100644 index fa4586e14..000000000 --- a/examples/receiver.config +++ /dev/null @@ -1 +0,0 @@ -dataport 1955 diff --git a/examples/scripts/.parab b/examples/scripts/.parab deleted file mode 100644 index 4aae0c133..000000000 --- a/examples/scripts/.parab +++ /dev/null @@ -1,36 +0,0 @@ -header before -Thu May 31 11:28:55 CEST 2012 -run=-1 -acquisition time = 1.000000 second(s) -mythen gain mode = standard -threshold energy = 6255 eV -bad channel list = /sls/X04SA/data/x04sa/newMythenSoftware/cal/bad_both.chans -angle calibration conversion = /sls/X04SA/data/x04sa/newMythenSoftware/cal/ang_both_20120422_good2.off -beamline offset = 5.088000 deg -fine offset = 0.000000 deg -Flat field corrections = 0.000000 -Dead time corrections tau = 0 ns -X04SA-ES2-TH2:RO.RBV 11.99985 deg -X04SA-OP-MOX2:ROX.RBV 9.17041130 deg -X04SA-OP-MOX1:ROX.RBV 9.17683938 deg -X04SA-DCM:E2 12.4054 keV -X04SA-ID-GAP:READ 5.015 mm -ARIDI-PCT:CURRENT 401 mA -X04SA-ES2-OVEN:TEMP_RBV 1768.00 C -X04SA-ES2-SAM:TR3 0.00000 mm -X04SA-ES2-SAM:TR2 0.00000 mm -X04SA-ES2-SAM:TR1 0.00000 mm -X04SA-ES2-LT1:TR2.RBV 1213.25000 mm -X04SA-ES2-SV1:t2.D 0.090 -X04SA-ES2-SV1:t2.C 1.800 -X04SA-ES2-SH1:t2.D 0.150 -X04SA-ES2-SH1:t2.C 8.300 -X04SA-ES2-FI8:SET "Out" (SEVR:INVALID STAT:UDF) -X04SA-ES2-SC:CH6 46071870 -Thu May 31 11:29:01 CEST 2012 -header after -X04SA-ES2-SC:CH6 46177281 -X04SA-ES2-TH2:RO.RBV 11.99985 deg -X04SA-ID-GAP:READ 5.015 mm -ARIDI-PCT:CURRENT 401 mA -X04SA-ES2-OVEN:TEMP_RBV 1768.00 C diff --git a/examples/scripts/HeaderBeforeAfter.awk b/examples/scripts/HeaderBeforeAfter.awk deleted file mode 100755 index 9b1354471..000000000 --- a/examples/scripts/HeaderBeforeAfter.awk +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/awk -f - -# this is an awk script to start a run -# you first need to run inimodule.awk to initialize -# the pattern, set Vc and set the trimbits -# - -##################################################################### -# revision history # -##################################################################### -# 31.10.2001 first version # -##################################################################### -# # -# Bernd Schmitt # -# # -# bernd.schmitt@psi.ch # -# # -##################################################################### -# # -# modifications: # -# # -# 1.3.2002 BS adapted for use with DCB # -# # -# 25.5.2002 BS adapted to new convert program # -# # -# 29.5.2002 sleep -> usleep for meas. time , TS # -# # -##################################################################### - -BEGIN { - -# initialize variables - NPAR=3 - - PAR[1]="nrun" - PAR[2]="fn" - PAR[3]="par" - -# initialize default values - - - - PARVAL[1] = 100 - PARVAL[2] = "microstrip_july2007" - PARVAL[3]=0 - - - - - - printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC); - -# read command line defined variables - if (ARGC>1) { - printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC); - for (i=1; i<=ARGC; i++) { - printf("%s \n", ARGV[i]); - nsplit=split(ARGV[i],array,"=") - VAR = array[1]; - VAL = array[2]; - - for (j=1; j<=NPAR; j++) { - if ( VAR==PAR[j] ) { - PARVAL[j] = VAL - } - } - } - } - run=PARVAL[1] - fn=PARVAL[2] - par=PARVAL[3] - - -# print command line arguments - for (i=1; i<=NPAR; i++){ - printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] ); - } - printf("\n\n"); - -# generate parameter file - - fnamep=fn".parab" - printf("header before\n")>> fnamep - system("date >>"fnamep) - printf("run=%i \n", run ) >> fnamep - -#print detector parameters to file - if (par==1) { - - command="sls_detector_get exptime| awk -F \" \" '{print $2}'" - command | getline var - printf("acquisition time = %11.6f second(s)\n", var) >> fnamep - - command="sls_detector_get settings| awk -F \" \" '{print $2}'" - command | getline var - printf("settings = %s\n", var) >> fnamep; - - command="sls_detector_get threshold| awk -F \" \" '{print $2}'" - command | getline var - printf("threshold energy = %d eV\n", var) >> fnamep; - - command="sls_detector_get badchannels| awk -F \" \" '{print $2}'" - command | getline var - printf("bad channel list = %s\n",var) >> fnamep; - - - command="sls_detector_get angconv| awk -F \" \" '{print $2}'" - command | getline var - printf("angle calibration conversion = %s\n",var) >> fnamep; - - - command="sls_detector_get globaloff| awk -F \" \" '{print $2}'" - command | getline var - printf("beamline offset = %f deg\n", var) >> fnamep; - - command="sls_detector_get fineoff| awk -F \" \" '{print $2}'" - command | getline var - printf("fine offset = %f deg\n", var) >> fnamep; - - command="sls_detector_get flatfield| awk -F \" \" '{print $2}'" - command | getline var - printf("Flat field corrections = %s\n",var) >> fnamep; - - command="sls_detector_get ratecorr| awk -F \" \" '{print $2}'" - command | getline var - printf("Dead time corrections tau = %d ns\n",var) >> fnamep; - - } - - -#print beamline parameters to file - -#read detector position - system("caget X04SA-ES2-TH2:RO.RBV >>"fnamep) -#read I0 - system("caget X04SA-ES2-SC:CH6>>"fnamep) -} - - - - - diff --git a/examples/scripts/ScanScript.awk b/examples/scripts/ScanScript.awk deleted file mode 100755 index 7617e340c..000000000 --- a/examples/scripts/ScanScript.awk +++ /dev/null @@ -1,87 +0,0 @@ -#! /bin/awk -f - -# this is an awk script to start a run -# you first need to run inimodule.awk to initialize -# the pattern, set Vc and set the trimbits -# - -##################################################################### -# revision history # -##################################################################### -# 31.10.2001 first version # -##################################################################### -# # -# Bernd Schmitt # -# # -# bernd.schmitt@psi.ch # -# # -##################################################################### -# # -# modifications: # -# # -# 1.3.2002 BS adapted for use with DCB # -# # -# 25.5.2002 BS adapted to new convert program # -# # -# 29.5.2002 sleep -> usleep for meas. time , TS # -# # -##################################################################### - -BEGIN { - -# initialize variables - NPAR=4 - - PAR[1]="nrun" - PAR[2]="fn" - PAR[3]="var" - PAR[4]="par" - - -# initialize default values - PARVAL[1] = 100 - PARVAL[2] = "myfname" - PARVAL[3] = 0 - PARVAL[2] = "none" - - - -# read command line defined variables - if (ARGC>1) { - printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC); - for (i=1; i<=ARGC; i++) { - - nsplit=split(ARGV[i],array,"=") - VAR = array[1]; - VAL = array[2]; - - for (j=1; j<=NPAR; j++) { - if ( VAR==PAR[j] ) { - PARVAL[j] = VAL - } - } - } - } - - run=PARVAL[1] - fn=PARVAL[2] - var=PARVAL[3] - par=PARVAL[4] - - - - -# print command line arguments - for (i=1; i<=NPAR; i++){ - printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] ); - } - -#execute you command hereafter e.g. change temperature etc. - - -} - - - - - diff --git a/examples/scripts/ScriptBeforeAfter.awk b/examples/scripts/ScriptBeforeAfter.awk deleted file mode 100755 index 14838e280..000000000 --- a/examples/scripts/ScriptBeforeAfter.awk +++ /dev/null @@ -1,100 +0,0 @@ -#! /bin/awk -f - -# this is an awk script to start a run -# you first need to run inimodule.awk to initialize -# the pattern, set Vc and set the trimbits -# - -##################################################################### -# revision history # -##################################################################### -# 31.10.2001 first version # -##################################################################### -# # -# Bernd Schmitt # -# # -# bernd.schmitt@psi.ch # -# # -##################################################################### -# # -# modifications: # -# # -# 1.3.2002 BS adapted for use with DCB # -# # -# 25.5.2002 BS adapted to new convert program # -# # -# 29.5.2002 sleep -> usleep for meas. time , TS # -# # -##################################################################### - -BEGIN { - -# initialize variables - NPAR=7 - - PAR[1]="nrun" - PAR[2]="fn" - PAR[3]="par" - PAR[4]="sv0" - PAR[5]="sv1" - PAR[6]="p0" - PAR[7]="p1" - -# initialize default values - PARVAL[1] = 100 - PARVAL[2] = "myfname" - PARVAL[3] = 1 - PARVAL[4] = 0 - PARVAL[5] = 0 - PARVAL[6] = "none" - PARVAL[7] = "none" - - - -# read command line defined variables - if (ARGC>1) { - printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC); - for (i=1; i<=ARGC; i++) { - - nsplit=split(ARGV[i],array,"=") - VAR = array[1]; - VAL = array[2]; - - for (j=1; j<=NPAR; j++) { - if ( VAR==PAR[j] ) { - PARVAL[j] = VAL - } - } - } - } - - run=PARVAL[1] - fn=PARVAL[2] - "par"PAR[3]= - sv0=PAR[4] - sv1=PAR[5] - p0=PAR[6] - p1=PAR[7] - - - -# print command line arguments - for (i=1; i<=NPAR; i++){ - printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] ); - } -# printf("\n\n"); - # system("close_shutter_g95") - -# execute your actions hereafter - if (par==1) { - #open shutter - } else { - #close shutter - } - -} - - - - - diff --git a/examples/scripts/StartStopScript.awk b/examples/scripts/StartStopScript.awk deleted file mode 100755 index f8e53917c..000000000 --- a/examples/scripts/StartStopScript.awk +++ /dev/null @@ -1,79 +0,0 @@ -#! /bin/awk -f - -# this is an awk script to start a run -# you first need to run inimodule.awk to initialize -# the pattern, set Vc and set the trimbits -# - -##################################################################### -# revision history # -##################################################################### -# 31.10.2001 first version # -##################################################################### -# # -# Bernd Schmitt # -# # -# bernd.schmitt@psi.ch # -# # -##################################################################### -# # -# modifications: # -# # -# 1.3.2002 BS adapted for use with DCB # -# # -# 25.5.2002 BS adapted to new convert program # -# # -# 29.5.2002 sleep -> usleep for meas. time , TS # -# # -##################################################################### - -BEGIN { - -# initialize variables - NPAR=2 - - PAR[1]="nrun" - PAR[2]="par" - - -# initialize default values - PARVAL[1] = 100 - PARVAL[2] = "none" - - - -# read command line defined variables - if (ARGC>1) { - printf("\n\nnumber of command line arguments: %i (incl. command)\n\n", ARGC); - for (i=1; i<=ARGC; i++) { - - nsplit=split(ARGV[i],array,"=") - VAR = array[1]; - VAL = array[2]; - - for (j=1; j<=NPAR; j++) { - if ( VAR==PAR[j] ) { - PARVAL[j] = VAL - } - } - } - } - - run=PARVAL[1] - par=PARVAL[2] - - - - -# print command line arguments - for (i=1; i<=NPAR; i++){ - printf("\t... %2i.\t%7s = %s\n", i, PAR[i], PARVAL[i] ); - } -#execute action hereafter - -} - - - - - diff --git a/examples/scripts/slsReceiverScript b/examples/scripts/slsReceiverScript deleted file mode 100755 index 284552a97..000000000 --- a/examples/scripts/slsReceiverScript +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -STARTPORT=$1 -AMOUNT=$2 - -if [ "$2" == "" ]; then - echo Syntax: $0 STARTPORT AMOUNT - echo Example: $0 1991 8 gives you 8 receivers starting with port 1991 -fi - -declare -A ARG - -count=0 -for i in `seq $STARTPORT $((STARTPORT+$((AMOUNT-1))))`; do - if [ "$((count%2))" == "0" ]; then - ARG[$count]="slsReceiver --rx_tcpport $i" - else - ARG[$count]="slsReceiver --rx_tcpport $i --mode 1" - fi - count=$((count+1)) -done - -xterms -k "${ARG[@]}" diff --git a/examples/scripts/xterms b/examples/scripts/xterms deleted file mode 100755 index 119597473..000000000 --- a/examples/scripts/xterms +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# This script starts several xterms, one for each argument -# If the first argument is -k the script waits for you pressing Ctr-C and kills all started xterms afterwards. -# -# example: -# xterms "ls -lah; sleep 4" "runprogramm -f 2" - -if [ "$1" == "-k" ]; then - DOKILL=1 - shift -fi - -LINE=0 -COLUMN=-330 -for i in `seq 1 $#`; do - COLUMN=$((COLUMN+$((i%2))*330)) - echo xterm -g 50x20+${COLUMN}+${LINE} -e ${!i} & - xterm -g 50x20+${COLUMN}+${LINE} -e ${!i} & - PID[$i]=$! - LINE=$((i%2*330)) -done - - -#for i in `seq 0 $(($#-1))`; do -# LINES=$(((i-i%4)/4)) -# arg=$((i+1)) -# xterm -g 50x20+$(((i%4)*330))+$((LINES*330)) -e ${!arg} & -# PID[$i]=$! -#done - -if [ "$DOKILL" != "1" ]; then - exit -fi - -while (true); do - read -done - -for i in ${PID[@]}; do - kill $i -done diff --git a/examples/two_gotthard.config b/examples/two_gotthard.config deleted file mode 100644 index 3f9763d57..000000000 --- a/examples/two_gotthard.config +++ /dev/null @@ -1,55 +0,0 @@ -#####Any line with a # is not read###### - -detsizechan 2560 1 - -hostname bchip007+bchip009+ - -#0:hostname bchip007 -#0:port 1952 -#0:stopport 1953 -#0:rx_tcpport 1956 -0:angdir 1.000000 -0:moveflag 0.000000 -0:ffdir /home/l_msdetect -0:extsig:0 off - -0:detectorip 10.1.1.2 -#0:detectormac 00:aa:bb:cc:dd:ee -#0:rx_udpport 50001 -0:rx_udpip 10.1.1.1 -0:rx_hostname 129.129.202.134 -0:outdir /data/speedt -0:vhighvoltage 120 - - -#1:hostname bchip009 -#1:port 1952 -#1:stopport 1953 -1:rx_tcpport 1957 -1:angdir 1.000000 -1:moveflag 0.000000 -1:ffdir /home/l_msdetect -1:extsig:0 off - -1:detectorip 10.1.2.2 -#1:detectormac 00:aa:bb:cc:dd:ee -1:rx_udpport 50004 -1:rx_udpip 10.1.2.1 -1:rx_hostname 129.129.202.134 -1:outdir /data/speedt -1:vhighvoltage 120 - - -master -1 -sync none -outdir /data/speedt -ffdir /home/l_msdetect -headerbefore none -headerafter none -headerbeforepar none -headerafterpar none -badchannels none -angconv none -globaloff 0.000000 -binsize 0.001000 - diff --git a/examples/two_no_receiver.config b/examples/two_no_receiver.config deleted file mode 100644 index 18718ad64..000000000 --- a/examples/two_no_receiver.config +++ /dev/null @@ -1,64 +0,0 @@ -#####Any line with a # is not read###### - -#type Gotthard+ -hostname bchip007+bchip009+ - -#0:hostname bchip007 -#0:port 1952 -#0:stopport 1953 -#0:rx_tcpport 1956 -0:settingsdir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard -0:angdir 1.000000 -0:moveflag 0.000000 -0:lock 0 -0:caldir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard -0:ffdir /home/l_msdetect -0:extsig:0 off -0:extsig:1 off -0:extsig:2 off -0:extsig:3 off -#0:detectorip 10.1.1.2 -#0:detectormac 00:aa:bb:cc:dd:ee -#0:rx_udpport 50001 -#0:rx_udpip 10.1.1.1 -#0:rx_hostname 129.129.202.134 -0:outdir /data/speedt -0:vhighvoltage 120 - - -#1:hostname bchip009 -#1:port 1952 -#1:stopport 1953 -1:rx_tcpport 1957 -1:settingsdir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard -1:angdir 1.000000 -1:moveflag 0.000000 -1:lock 0 -1:caldir /home/l_msdetect/dhanya/slsDetectorsPackage/settingsdir/gotthard -1:ffdir /home/l_msdetect -1:extsig:0 off -1:extsig:1 off -1:extsig:2 off -1:extsig:3 off -#1:detectorip 10.1.2.2 -#1:detectormac 00:aa:bb:cc:dd:ee -#1:rx_udpport 50004 -#1:rx_udpip 10.1.2.1 -#1:rx_hostname 129.129.202.134 -1:outdir /data/speedt -1:vhighvoltage 120 - - -master -1 -sync none -outdir /data/speedt -ffdir /home/l_msdetect -headerbefore none -headerafter none -headerbeforepar none -headerafterpar none -badchannels none -angconv none -globaloff 0.000000 -binsize 0.001000 -threaded 1 diff --git a/genVersionHeader.sh b/genVersionHeader.sh deleted file mode 100755 index 12b5d8c26..000000000 --- a/genVersionHeader.sh +++ /dev/null @@ -1,25 +0,0 @@ -#####! /bin/awk -f - - -if [ $# -lt 3 ] -then - echo "wrong usage" - exit -1 -fi - - -fin=$1 -ftmp=$2 -fout=$3 - - -#dat=echo "date '+%Y%m%d'" - -echo "Updating $fout" -#echo "in: $fin tmp: $ftmp out: $fout" - -#awk 'NR==FNR {if ($3=="Date:") {l[FNR]=$4; gsub("-","",l[FNR]);} else { if (match($0,"Rev")) {l[FNR]=$(NF);} else {l[FNR]="\""$(NF)"\"";};};next} {$0=$1" "$2" "l[FNR]}1' $fin $ftmp > $fout - -awk 'BEGIN {l[0]=0; "date +%Y%m%d" | getline l[1]; l[2]="\"/\""; l[3]="\"nobody\""; l[3]="\"nobody\""; l[4]="\"0000-0000-0000\"";} \ -NR==FNR {if (match($0,"Rev")) {l[0]="0x"$(NF);} else if (match($0,"Date")) {l[1]="0x"$4; gsub("-","",l[1]);} else if (match($0,"URL")) {l[2]="\""$(NF)"\"";} else if (match($0,"Author")) {l[3]="\""$(NF)"\"";} else if (match($0,"UUID")) {l[4]="\""$(NF)"\"";} else if (match($0,"Branch")) {l[5]="\""$(NF)"\"";};next;} -{if (match($2,"REV")) {$0=$1" "$2" "l[0];} else if (match($2,"DATE")) {$0=$1" "$2" "l[1];} else if (match($2,"URL")) {$0=$1" "$2" "l[2];} else if (match($2,"AUTH")) {$0=$1" "$2" "l[3];} else if (match($2,"UUID")) {$0=$1" "$2" "l[4];} else if (match($2,"BRANCH")) {$0=$1" "$2" "l[5];}}1' $fin $ftmp > $fout diff --git a/recipe/build.sh b/recipe/build.sh deleted file mode 100644 index fba3f4626..000000000 --- a/recipe/build.sh +++ /dev/null @@ -1,15 +0,0 @@ -mkdir build -mkdir install -cd build -cmake .. \ - -DCMAKE_PREFIX_PATH=$CONDA_PREFIX \ - -DCMAKE_INSTALL_PREFIX=install \ - -DSLS_USE_TEXTCLIENT=ON \ - -DSLS_USE_RECEIVER=ON \ - -DSLS_USE_GUI=ON \ - -DCMAKE_BUILD_TYPE=Release \ - -DSLS_USE_HDF5=OFF\ - - -cmake --build . -- -j10 -cmake --build . --target install \ No newline at end of file diff --git a/recipe/copy_gui.sh b/recipe/copy_gui.sh deleted file mode 100644 index 26ce29890..000000000 --- a/recipe/copy_gui.sh +++ /dev/null @@ -1,15 +0,0 @@ - -mkdir $PREFIX/lib -mkdir $PREFIX/bin -mkdir $PREFIX/include - -#No libs for gui? - -#Binaries -cp build/bin/gui_client $PREFIX/bin/. -cp build/bin/slsDetectorGui $PREFIX/bin/. - - -#Which headers do we need for development?? - -# cp include/some_lib.h $PREFIX/include/. \ No newline at end of file diff --git a/recipe/copy_lib.sh b/recipe/copy_lib.sh deleted file mode 100644 index 353397418..000000000 --- a/recipe/copy_lib.sh +++ /dev/null @@ -1,23 +0,0 @@ - -mkdir $PREFIX/lib -mkdir $PREFIX/bin -mkdir $PREFIX/include -mkdir $PREFIX/include/slsDetectorPackage - -#Shared and static libraries -cp build/bin/libSlsDetector.so $PREFIX/lib/. -# cp build/bin/libSlsDetector.a $PREFIX/lib/. -cp build/bin/libSlsReceiver.so $PREFIX/lib/. -# cp build/bin/libSlsReceiver.a $PREFIX/lib/. - -#Binaries -cp build/bin/sls_detector_acquire $PREFIX/bin/. -cp build/bin/sls_detector_get $PREFIX/bin/. -cp build/bin/sls_detector_put $PREFIX/bin/. -cp build/bin/sls_detector_help $PREFIX/bin/. -cp build/bin/slsReceiver $PREFIX/bin/. -cp build/bin/slsMultiReceiver $PREFIX/bin/. - -#Which headers do we need for development?? -cp build/install/include/* $PREFIX/include/slsDetectorPackage/ -# cp include/some_lib.h $PREFIX/include/. \ No newline at end of file diff --git a/recipe/meta.yaml b/recipe/meta.yaml deleted file mode 100644 index f795a7142..000000000 --- a/recipe/meta.yaml +++ /dev/null @@ -1,89 +0,0 @@ - -package: - name: sls_detector_software - version: 4.0.1 - -source: - - path: .. - -build: - number: 1 - rpaths: - - lib/ - -requirements: - build: - - {{ compiler('c') }} - - {{compiler('cxx')}} - - cmake - - qwt 6.* - - qt=4.8.7=7 - - zeromq=4.2.5=hfc679d8_5 - - pyzmq - - xorg-libx11 - - xorg-libice - - xorg-libxext - - xorg-libsm - - xorg-libxau - - xorg-libxrender - - xorg-libxfixes - - {{ cdt('mesa-libgl-devel') }} # [linux] - - {{ cdt('mesa-libegl-devel') }} # [linux] - - {{ cdt('mesa-dri-drivers') }} # [linux] - - {{ cdt('libselinux') }} # [linux] - - {{ cdt('libxdamage') }} # [linux] - - {{ cdt('libxxf86vm') }} # [linux] - - host: - - libstdcxx-ng - - libgcc-ng - - libpng >=1.6.32,<1.6.35 - - xorg-libx11 - - xorg-libice - - xorg-libxext - - xorg-libsm - - xorg-libxau - - xorg-libxrender - - xorg-libxfixes - - run: - - libstdcxx-ng - - libgcc-ng - -outputs: - - name: sls_detector_lib - version: 4.0.1 - script: copy_lib.sh - requirements: - build: - - {{ compiler('c') }} - - {{compiler('cxx')}} - - name: sls_detector_gui - version: 4.0.1 - script: copy_gui.sh - requirements: - build: - - {{ compiler('c') }} - - {{compiler('cxx')}} - - cmake - - qwt 6.* - - qt=4.8.7=7 - - zeromq=4.2.5=hfc679d8_5 - - pyzmq - - xorg-libx11 - - xorg-libice - - xorg-libxext - - xorg-libsm - - xorg-libxau - - xorg-libxrender - - xorg-libxfixes - - {{ cdt('mesa-libgl-devel') }} # [linux] - - {{ cdt('mesa-libegl-devel') }} # [linux] - - {{ cdt('mesa-dri-drivers') }} # [linux] - - {{ cdt('libselinux') }} # [linux] - - {{ cdt('libxdamage') }} # [linux] - - {{ cdt('libxxf86vm') }} # [linux] - run: - - sls_detector_lib=4.0.1 - - qwt 6.* - - qt=4.8.7=7 diff --git a/serverBin/eigerDetectorServer_virtualMaster b/serverBin/eigerDetectorServer_virtualMaster deleted file mode 120000 index 8bab52260..000000000 --- a/serverBin/eigerDetectorServer_virtualMaster +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualMaster \ No newline at end of file diff --git a/serverBin/eigerDetectorServer_virtualSlave b/serverBin/eigerDetectorServer_virtualSlave deleted file mode 120000 index fb644ed5c..000000000 --- a/serverBin/eigerDetectorServer_virtualSlave +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer_virtualSlave \ No newline at end of file diff --git a/serverBin/eigerDetectorServerv4.0.1.22.1 b/serverBin/eigerDetectorServerv4.0.1.22.1 deleted file mode 120000 index 04312328b..000000000 --- a/serverBin/eigerDetectorServerv4.0.1.22.1 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.0.1.22.1 \ No newline at end of file diff --git a/serverBin/gotthardDetectorServer_virtual b/serverBin/gotthardDetectorServer_virtual deleted file mode 120000 index e0f7013b5..000000000 --- a/serverBin/gotthardDetectorServer_virtual +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServer_virtual \ No newline at end of file diff --git a/serverBin/gotthardDetectorServerv4.0.1.4 b/serverBin/gotthardDetectorServerv4.0.1.4 deleted file mode 120000 index bfc7b6c24..000000000 --- a/serverBin/gotthardDetectorServerv4.0.1.4 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv4.0.1.4 \ No newline at end of file diff --git a/serverBin/jungfrauDetectorServer_virtual b/serverBin/jungfrauDetectorServer_virtual deleted file mode 120000 index cbb38b3d6..000000000 --- a/serverBin/jungfrauDetectorServer_virtual +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServer_virtual \ No newline at end of file diff --git a/serverBin/jungfrauDetectorServerv4.0.1.0 b/serverBin/jungfrauDetectorServerv4.0.1.0 deleted file mode 120000 index 807c9b778..000000000 --- a/serverBin/jungfrauDetectorServerv4.0.1.0 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv4.0.1.0 \ No newline at end of file diff --git a/serverBin/mythenDetectorServerv2.0.3 b/serverBin/mythenDetectorServerv2.0.3 deleted file mode 120000 index c9fc9abae..000000000 --- a/serverBin/mythenDetectorServerv2.0.3 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorSoftware/mythenDetectorServer/mythenDetectorServerv2.0.3 \ No newline at end of file diff --git a/settingsdir/eiger/highgain/calibration.snbeb045 b/settingsdir/eiger/highgain/calibration.snbeb045 deleted file mode 100644 index e5a59be31..000000000 --- a/settingsdir/eiger/highgain/calibration.snbeb045 +++ /dev/null @@ -1 +0,0 @@ -227 5.6 diff --git a/settingsdir/eiger/highgain/highgain.cal b/settingsdir/eiger/highgain/highgain.cal deleted file mode 100644 index bee36aa38..000000000 --- a/settingsdir/eiger/highgain/highgain.cal +++ /dev/null @@ -1,4 +0,0 @@ -3486.22 365.75 -3518.43 368.23 -3519.11 357.62 -3491.49 365.08 diff --git a/settingsdir/eiger/highgain/highgain.trim b/settingsdir/eiger/highgain/highgain.trim deleted file mode 100644 index e0693222f91404c1e3ee03dd32bf297927d55d3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048644 zcmeIwu?a#^5Jb_7_!U941q-quYp@FA54K=rDwx@fflsgl(-RECBpWQJ>b|LITc@cm z`+ARkUDjjdyXVozUtXhcBhPj1R&`#~VcZZuV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ R1{h#~0R|XgfPsGud;sf95hDNq diff --git a/settingsdir/eiger/highgain/settings.snbeb045 b/settingsdir/eiger/highgain/settings.snbeb045 deleted file mode 100644 index 1379571157cea7b6fd64d8f97bea14c562cb8c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048640 zcmeIu%L#x$3Un3HWx?%LPzrgz`H zRM)fC&p9QnVh9i*K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ KfB*pke+3?fbPA~e diff --git a/settingsdir/eiger/lowgain/calibration.snbeb045 b/settingsdir/eiger/lowgain/calibration.snbeb045 deleted file mode 100644 index e5a59be31..000000000 --- a/settingsdir/eiger/lowgain/calibration.snbeb045 +++ /dev/null @@ -1 +0,0 @@ -227 5.6 diff --git a/settingsdir/eiger/lowgain/lowgain.cal b/settingsdir/eiger/lowgain/lowgain.cal deleted file mode 100644 index c848f17f3..000000000 --- a/settingsdir/eiger/lowgain/lowgain.cal +++ /dev/null @@ -1,4 +0,0 @@ -3415.26 226.24 -3406.35 223.45 -3407.89 225.60 -3385.72 220.54 diff --git a/settingsdir/eiger/lowgain/lowgain.trim b/settingsdir/eiger/lowgain/lowgain.trim deleted file mode 100644 index a699c34544475a64f6f6b8603b923a74ac5418c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048644 zcmeIwy$yk37=__G;wKcWU?2mT!4!&b4pHc-^|nxWB{tAr#mUKOp5n<>bz9f8spF!~ zyLyj(o!4{ZyDy^;zr04@M;@!%F6%U_{kS21zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< R3^2d|0}L?000aLR_yGGH5)%Lb diff --git a/settingsdir/eiger/lowgain/settings.snbeb045 b/settingsdir/eiger/lowgain/settings.snbeb045 deleted file mode 100644 index 1379571157cea7b6fd64d8f97bea14c562cb8c59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048640 zcmeIu%L#x$3Un3HWx?%LPzrgz`H zRM)fC&p9QnVh9i*K!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ KfB*pke+3?fbPA~e diff --git a/settingsdir/eiger/standard/4500eV/noise.sn031 b/settingsdir/eiger/standard/4500eV/noise.sn031 deleted file mode 100644 index fa8c26055a7458d7ef3db3b40fdb7fa6c2ca8bc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048648 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

k!3 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%0Dctfxl?s8yOOCF#5X5>y^aMk8Fd)V;!VZ*c1 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ⅇn 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 L4C&YFuVerJZ^E^3 diff --git a/settingsdir/eiger/standard/4500eV/noise.sn032 b/settingsdir/eiger/standard/4500eV/noise.sn032 deleted file mode 100644 index 4f333106f7ec9670b9a76f78e0c5f86f316c0e60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048648 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

f=X?C7s+_cVb{NDNE8^Vn%#Y^FxW<9F8S@LcD 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 XA1v6u3$*H2jdT6dCkGeL{0{#IKS4&} diff --git a/settingsdir/eiger/standard/5400eV/noise.sn031 b/settingsdir/eiger/standard/5400eV/noise.sn031 deleted file mode 100644 index 787ba5cc87b9cc5785e997abb40a95d44912f210..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048648 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 z 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%0D42ClPo(nE(kpqpR4cR1?2^;^WH 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

%AQC#p3cbQ-?h+eCcyD-wS+u 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⋙9UOmjjr4=r; z!~1?#@AZOzGb6rPRuew*($<+iz5zZ~fA?_0L%-tX9j^R%c+(dgVBzEJjc)ozOLgFM zW_;bh%=8FnE8J?sO&mP@Sbsv1K_0(f|@P+k0lZ%gcdF*j?)<-jy7I41Kyu*=` z|CzyaM{79zaDXpfPJ6Y|$2&YVh@;iZ45q%ggJW;yi;LXF!AXa7YEE#6#lN`|kAr&{ zXXb21@q>YfJ)ZT<9v)8K^gTZ1PzS>m2k+`JD}T;#g#(}AEfyAja(jm%FPt-T_iZMI zp5pkzWA5S5pU(E~{cy%XFX4!_dRMnv@D$fP)B9=0S1-#0KYuayILg82%-rLMUs}p- zcF#;6b01f=%fT0x^?7zX!;>FVlekYa^_n^F`X(N(Sh@Os)Z^Xioj-o{6i;`!+w;{o zxy(s(gnRei#PjWMhn#x+IOD4(KY7LBXZ6k(Pj~d?t1dmN{&>ovc0cGrl2wpcTGX7psf`TxA^<&aw~<+6vZ_i*}~Vm{P>i#M_E z%mZAj8N8ptV&3snYxBhquAe^myMgPOd2{zL`#HnSyOp-Iq5&ROdF6qx&v3$!15ZYG zzA)UYLEM?)MZa{m(twYjI$`j~O`#DoDe7-RMbEYP%yYR%rw0eVsublkuXJ^I-4h*%c#XA${T@7bOPx19! zeQFaI4vy~3D_`H1cf8L`ubk`i@GgE7EdczlIKJvl0_a>kH^Gr>TGdjbN zlP_-K-G80I)_?Er`S4ed`|9(q-tOdv#m_w)wdjf5&h~V*rz36on*ZL~tCg?ZYQcp@ z^w1CQ_L;o!)OcomKF{#C=LhGHnf$(geBpcJOE35T{=3=5?Mys;Jgl^EuTSdnU8c$m5oH*j1c4ibecw*Hc z2YxVcRJXYcQ;%t;PiH1xP8{xMW)luPv9!kBckQPxJ%p#veA7#vaO#aczHv8COnyGq zXLZlNd54XwSoNzFzI;Ds_~DM1SaIH~pKkJq*GDh3wii3n&D1!IcX<9pZX?`d)EBpZLb!8chseS_{(cApE}{t6}~$<=!YLa_2B27 z;l$5dywxQq4(`k`+&kk;+n+O>#N+LapL@CO z)ostjF??|n+dH20b^kG=4KCrH?ZsN@E6y8SwbwTs&6wI?`FG^nS1q*no>pgjn&DMX zir4RR^#)VDYK3bC?8Q6dq7K+J@{TW_XND(VKl;4P)S)Nt)kt?Z_{asLH}(0O)(p}R z4h*Zfu+*B?>VeB{X5!t^LY%!{{PA=LUw-q%Pi@X;c0W_Id+)f*t#*81cz1@wyoc@E z5UWO5^##YL8IJT&ad2sBg{v>+gXxTeSo+(m%}m|S9%r!emJf$Bqn96^>ZCPX zc+Pm8nRog9eQ5^e;R};?ae^t8jyxztaj=7b?4-b0cq%Jw|@*RpfGrr>Fa?f9# z{PC5`{&@!PpEF$Qnf;mRwONs?JMlD46M4)M9QQQ!CKeu@{B5TJo%Ih-b@Q>u%?}PA z7-H!K-`{q8`SVeed%k*5U%abLUGm^#&+lQTzxM9n^MMOfF16yTMtt?9{@K&o42r?= zcE;Ba9vN`Gs z)k`}uF!`ttwwmm5q0yP$&E%rBmDX=Fv2m7DyjXbnJgql>>!eC)l2qYgU63pSp(z+rO8Zw~CcKilh*-|Ni$(uoH4 z{oI+)huPiCdp}stdV;IEak8h8dT1jrt?+)i?8VXn*YtGe&sWXn*c;6BG!N+xR}C<% zH#2RZ9lo0`rHK7W2RhhrYjOq^A$oH)pDHEVHt+n&aBJTv$F;liYk-ofFk z7xM5)FMcq*f1ByE`rPA4m$bmko#R-fFZwLIat zcczzj@p!7!p3cS6Q=B`dPTbB+9pdD}y;{rVK8^6i4=&xEn;~&>II9;f9n~tITIK#a zJ2M#K?eW(G`OTx6&dj}Uhp)V6_GQ+0nXXoRnrXQ{W@62&GcMm}?(F&Mk#jughQD0! z)Z?A6oNzwP_^1oNxYH?LJ>Z)@Z`+H9Z+@K3Q#kbyFF3U4%lP8L)QK}b{20AxPj5Ns z1J9X1Uv=EfaFWy8x!OB3b*o1%T=c^olfyku^89P27T*_N@nWB5YQs(aeDvQN?pFHX zWOe523?qH+E_*TcSzXTX#hRxxGoSe31&0qy7r1!yxA&%|>VYSgKRz_%=bo?pW{{T7 z{>@Vxe|nx7-uS_#2YZ`U=_$!xcAN87#e%$GsZkhA&=leGfRnanFZ8u6*Q!qds@?;vt6> zem(Mc;c4d0Ea;86=gaC&yqa)^MNM)!Jv51#mXr-2-DsSQUs-f00}PW5_Ivl`)<3z)Rzivuq3A7o_|JLZ(^crd)* z&(u$sc#6lTSbolY!gXhl7Y*n_4}9vUdGNcPsfVB3;_ha8lvchkd++Yy;6Xq8>sbp! zPI}?pFWxj2UrlPkncjHvv-&>Fkv&c5#7{natKCe=%NM3Nv!kvvqd%SF>0KT2z&V$_ z+SO^+;d!%H2MwABxXhfvhC_#MGqu5Y|32e$F2)C*SlY>l6RY>$^c)X9^5T+DtNSp1 zUHoX&ynCbTncm3Q19_iGo1Ow(HmaX5l8Ph(!lqK2W+z<{=a8><<1*F^~jAc zoz-QJw;12McscpX#b_=r4*D)$UHT}`nelZWwr>`;*zQ{8#;JKw4-WFi$s0d>=%-$* zp1^eWomu6^ou)X!=I49yEqKQTS9Q?Ly?6QK#myUReJBP8dv7@M$L-AMOAmO>j=dPz zxYsAVZfAb@z5KQNAI#^gJ%4_`UGA*vQlGrIT4B&bUGl**Pqb90JwJWLSq-qyOdRdx zh0otlExsLo^n>9CAAbgmzy8Z@rHi_q)ofd?)d?stvBZaN)`24PRWv!?DLr56?`$X%r!F#Cq^ zry? z#8-nA_j=-;UU227r#k8@484W{6K8w5yz#ZKc6T__1E%?QmILoIGt2y$y2PIuUUK;^ z>~WRz%+x6_e1Ajy_{E2>o;Hj8>CE_hQy*MB`g`r)ymHY(ezVA5ZhE-$rjPdSefNCi zRf8Js)ud)MJ+~JAgqfgE_m{A-)&%`x< zX6eje;71$vcxV5Y%X;0dBT0?`43dXeY1aD)!5_x#O1x9Ev-Y2P|F?2{bcb=^10=e- zDl;N7vYL`LZ(#9)&(`pTJx@6_;_}Wz>-j9t9v*)qZyS7(^Vm>>i@)~`9MhyXIrODL zGd%ZHy`Nd|Q-Aj8+}~%|YV6Nv+%Vzz)?wkHLB4l~M*G}OVi2TLt(_@3_O{swrLV5pDLm>V7HaKOTohIc&r zxNVq|zil+EFF7#vzMfzTGtz^z%_d!&7k#kd!KVp6Zg_rr6VtuE$L9|y(5pz}`JOoKnM8|u>o;vuj)1a64_T{@9*3;xH4O}?*yqxE*(~zqlb-09ge=COF12EFS6j(xbe^bAM;aLfWW9<_Ry7i#!Gr`f92r+nVR6Z*xe7ET&C;0qp&$Gx%k zHxM4qG}L*Q3!8pta_zfUYT&_0gJ=BpPQ$R$wOr@!Di6|7tB>`szxkjiy=@loXqqq1 zV8ImbE1ftW8qSBShJJqVMXnls(13$x8m*nVg)}FlG3-8vOksNsP^`ciA zXfhMN!PlD{+S5?yJ~~SSo?7Q}g}ciKxYqtI$)kr3^?Ie3Z}8nY`TD_~hCF@Cr3;4l z`GM27XwJ05kmF}wuyE*8oqMX5UV#tyeZxIa>l_}Pa@6a=xm-Ec_RSCmo%(RE>Ewa6 zzV(7%z&SP4&L@0gv+|VZZyi3l4-LJzOMLaTX9oI~bJ3s&4frH_Bk_dR>(oiqA8 z^{NJ*vv~kpjx*T$cL(J2UY~k$#s~Rw^mo(H3*S9?N@Trk^*^sAK+Th?y1J|_CqCfM72}iDdUaRM08gOC2gUxUGyl~&VTf^fY zjJpQE^q^l)8l9Ud?>ynabtWI4CvG^Na6S2KkN@utdeczjp1&N=^odihJCO!&X&&^&+&-`12wZCDx^Cdp2Q7M?_H;e} z?8)&|hsQgOw9@TP*u$xBPx;>(>xUK`a;??LRVQeMO`~^QIONhtzZ|;x2G`TRJHlUq zTOEFQIK0Dju14SZVcUbxJKm_@9zJ(iJq{T3JBO>z9?f!KY@a^+?v5E)tD`FoJeLg| za@`%+FwNK=EOm6kv9Dgw&c?lO%AUD->MsqsLf?9j>**We4?Mc;;qtU6PaUslduh1$ zaGVKwn}L4t(klO{p%*#A9=&vp13$e2_x^79MyJ!Av0iT%UGpprcxpV&iDz_pUp-#< z?&5U=H!L}@^+=N^y^jq)p7>k6zYDvYxMANn%)?X9^A85B-38dV^p^(i^+K1k=`nx# z@ZjS2?q04>*!=W2z*^|hQyv{Oz;N%pkApXG@L0p1AFG*O^}Nu(-mUcj6CQnf6nxnH z;qeZST)x}m8-0H6jD6oYOxjNkdG_h^_ukJQZW>^?hjQIT^_wBiG^T}acTgXE_HJ&l z-2-R1%eD~AVZ zs5KLs%}_qR`S;c}ulcK9o_pZF;gqMx%@wyC{Y*2huMPS04c_Y2*jHoj`hsb#C;T*v zc}b^wAs;79`Oe&98hNRIb$aECJT-DW<*T1}!{#%eXmi)>>(|rlgn7sjxN(>>{bna< zbgmYkbG`14(36IGVU0sA{d8K>XdXCd@|0%{U!Od;XC650tCxdE4jh_b37m4|>e)Pm zcfP@cJI#3Kn>*tS_WCoozcpy*5gdFxfoqRG`LL`#X_G^fJp1b4>tD|I293P4PoEt9 z+5dY(tsd3WCC{Cm7JA@aHQbR?!|$O1@3!$<V@C9N@E6-D5AXU^pN4#x@aHvNJw7$$uMc?gXvCF-;8v4IzdecsrcN5f0^XvQlKr!{O(-xEx;#KQwR|Iv_d?e7d8`qbEyZ;!XMx=%Ri zRIEPE4Gw*U~nMV76 z9q(#k(`2JI#LjWUaWB#^V>;ECE6g!n;>z#Mb+=){IueDry zywkZ^q-)=RK4Ig~pEa%D8fIV*Hjk`n@`I;FKYsG*rbl1yh&${q$hmIdlYAY{)Q)dSJ^nTNT$s?LR8uH=D6>0e4N`t5Rg-ttNn)Jt)%LY9A`m&};uj^lr`WXjo zAqS4wto^;n5u1&9$cK}LA5H4?VGSF%T)e)|G^SfEeY}r)M% z_$kjBZ}jbK9{uWCFT8ROJq4XK_*;ROhw6BM3#Pm@rUwolIq>(b(F%i}VVk2oIQkc~ z=~s>#d_Nk#ANN50=~%;?pZ4MD+nNq%bfy8rySwV#zJ7c^c)rXraju9vq?GQ_nbQhfjlf^KJ8>l@0+* zuKMNjQNH=;2d}fsMjCYCrVWNO7|T(Q!w)`Qdpt95I^oN4H)%G%`7hs|pB{Gi_&^J- za-0pDFYs{4qnn=fFrRs0j{ctb+aceRj*EuA;OfoYqDc=p{rt_Ee)nHKKK;a6vHSIEIZPa5i<8@PDlNgF(Mu=R;E4ZZueox{PQce(m8Gc|B` z$N#Hqb+qtLt#_F2;77x^0D~6iw9*Ju4h{jsJFPE`w}u=~XY}Am!@T`1vp)}D+S^mV zwAhn_LtkcPO^2T3o6}~9+dMuS&gIgP25tVXnzNt>kJ{;!i&L$TPdlD8cnp&lp5s?T zA3PqXfsYn>?uovg!;tITOw853o_sUwho3akzyqA>hUE;ecl+|q7A{Ua@by85dVBiC zL63ZESne$iu=EVub9^xAg9k&N93D7R3!j(s!;I32RnmxSDhJN|Day)rXr*I~pHW={q?#v!7&eii99$k9F zWpB?ezrLw&eO`Gvez$$zHNH1)j=k$X`8|9%xXtOYfzSJVz-jG_cY0S#M;d1I-r#{; zGt|T18~ht4{CTve+|3;CIAE$(lZG5mGjm1|7^^o6xb*TCCY|!vqcuI| z%RhdI%|yL^(oh2%mtJ8xHyibMJn3~eaLR}0$un56)zLS-_TkgRW4ZL=GB0Q9V0za- z-S*6f7kGGPZyu;u>mH<`-oFd@)1aLWwS1)m*8c6F&pr-b>&tr@_-TddK0AjC%ey>2 z+2ifz$tQaBr(bz+?i*=1SEC2LIFqXn9NzVX7e2j$9$0#C?wuC*AD^>%qZYUR@bS}{ zAHodhy?U5xXb`(c%eUuTkAC)f#s@s`+zolWy=dr3pJq+}G@7rVAKpBLhXam2)YA?d zrvA*5Z}xMnr}?$-a<3cnL2r0gGhgB0arQ?;|8(lx9q?|AQ|Q;6clX5{aXNE9Xxa~la3+VAG}Oye%geXM?l!*N z4S2T=x$_AY9GZA~-`Mv`lW$C}KIE9A-me;G>;x zXYlo;7Z|wl$afcb&&_VLq6H!tXbPah22H0jUJ)4tm4hX!Kc`9h(Gag>hVix%1;#r;C<*RjvcE3Dfh|R}S z?e4f9Y2pL#+yVMLX?Qxqo*wY?fG)K>J~d$CQ{zVyz5L@F4{*?DAD+HwQ=7(p1D>Ey z-R3`Tdurjrqut*4eja=7I6ZjP;!T4-d*j5T9~kni>4FE_TzxmN0CTD{otWf9X`2yfVZB^7q-0B@B_a* zn(aI1f$*+hJa}oLlU`Wcckk@U9S&SQnkRqko1S&;@%v)3LeGAkW_= ze#p@q4QlY<#ghiT{NWc|^?X%BFDz^M>ev7B)R-AR)yZ*2Gj6(Z(|yz6gL9DvTwxA$ z=w&)`?71uMh&@bQMr9q=w&uRDW{H~!^FP9BI`_V}6RpX(t-*p$T7qnh9_>m*j z(J5zhP1khk8#iCPKOXON@kuYv^hJ~RG}OV;BfrwvykOW9+w+~Ng&}BCEAY#sT@8=* zns#-BJ2wk+hE0oi^*0UL1z+Uo3BP-&UM>#jd$*@woHXIbsYf~b z_oUyx^Pdg#Uw?9iJ$wR(dm)E5^>75QctMN#@xZ=!TIt56FTo4?;5oyELq1#_G`%&_ zu;;1P9m4@npLm`c?in30R_}as90so44Rtio<6D3&pNDDC4iB&X+y}h!tj&f;dV%YV zp3Mn1zn$ZfV~*}O4nemWq_KBi(Buh|cI!VIpAC4)IV4h%WG zagLYYe$Mscj6N9F^AewX<1Vfr_~rxironrj$iT%-dt@XZHb-a)-*9>sW(-RK8;&E4S!`W>0ORu}8PEY4N>m7zZJ?T;BDOc@X z!z`V{Hb;2;flnXo={|K$8;rMxGiy)xz#c!n!*eHjx9=R^wD1qU`RRGzjrr3|2faMm zY+#y48qNe>wREK6&d9U2@2TI%#`0m%VFtX#Ne4Z2>7N&Az?H8j=kAm>UGR8=k4EqC z&cACoFsEA{j5K)p-k4@w&fE#V=Y};tIrwqFu;)2{)bdeZ`1J!{sO1G8%;2*@7p?T$ zPeUL0)tH;L`v(iJKKN+H!oEFq_T|$k=o0kkVSRYg_j?1zOJlQhZ(kd*^fyi#U^$0P zn|`cmNP`#djXZVgKN>X27wd1l`o{%F-uP)WFEuc6c+$+v9BVmh)bflbzM2~@8enWr za?+S)-s_zQW`M)HwWrXJ{&C~-jp4wF13n&kp1AathQ8E!+W+22L#;iy)2aqP@AS_j z-|g-XE*vy(mhPLL)xm;E&*lZw{h&)v=Kgs0oX67x-}!oj3lAqOzR@EujrjlvC%ts* z`CEf#ebZ}ha^?{%n6NfGy{qAgJiR>}>-i|h96a@AO*6c!2CaVTaq9WL;Y^JmZFgU* z|2_AO_`&nz@;{K9~K?%>}HEcFLcS5%YQxC*T?2EWgMdCr4$ z4d44b_V-4OdVPB8g$6+%FK~FS$9)65n3raw4>@{Dg9dxnw7?jSCoO5*Hq_|RowJrt zCk)v8PJDO!2IN?eSM7Y?cjO(9cx=dVhJ$v!q@mZJ4SVwF!>dkD^Vpep=jO{dd3;m5 z`+44jy)@|kdxKs9oB#0i4%0WBhJ9Rk@yPeSZydgN{^&=Z*~6sAxn8aHs6Y8;hEL6A z@}ujU2Cr!F&BF5TN3;8&&hxqfU(a;OgJm{yXxfY}y2fo^A8NdN@S5yAUBpE* zTzA!XyxCd9lh1d5|7hN~re|kqIFrL0T)XGE?el2*?70WNM|zxlr^A~6)_8XJ)acnh zEVXH<*CT(eY4*f#UoZStmxh_^b+ea)aru8S6r#zzz<}}ewm%aI8?SAl& z#@`xp)Yykl15O&P4c|7t+n|% z6W5K~hJC)np?$NXbr^i`n+IkL6OKLo3BB;e(>@Hf`nhV*%y;wjTH8A!!35Obb+`IdRJswS;nb`BBl_s7}7d>+E!N(1sH*(FG6(#*ti5teZ!w7xOnWTH(z}@H!I%YRkx=+@A~n4Zpc41 zcxTVO(4QPS@cZ!zrk|WNcrwkf^^yj?a`mWhJ-Z9I_{3ZItEJmLyKdx&d1HQh)RR2* zw+$NMq~Si&ryri^gBEML^kKI2UN&HRr%~Uu@edxpJ$Wog&`X~?0Fw?lc+=pqCp_zE zrkf64&`BFlX@VpFv4Kl}^67Mk{P24skevI9k&NZ zj$VX!IX@eI_R^3mXpsYxRvKuvuTP;*{=-c}j$=*J6dp-(fS-yTjpuMN5C+!Nk<=d*di=Q|GXaOBaW zetvEC_SMruBOmo)t==5*;}gqKzdOsLG~OC&#X|$18bAKHv!3$w>>R#6>3(V0qZg;W zG+_7+tew%t7g%Y~BpMbUW#)R8k6#Tu{qVv2{7Khzz&B4%wK#Y$-@AHv z`gW$qxji$Zd3SB+w5?wlJdx*|7H7MYaBdpT=yQhKozmBOqz|rqciuga&#UP+2ioMq zqaCkzeGkvmzP}HrhM#+;NB3$!=faO(>$}GKa6f4AcYzN2Xg5=9Sl)5bs3&>eJ%v8# zOGBN0^#z-+wDMdY-rZ|H*wZiF*6^&=+E)jI7T)mIEMQnW$8GJt=mjoL+MUtuiCZtu zJOk4tKq71~~l8AEtTi`?~2GrkeQ%113Mxu&;vZ!v5&mkpfmj;9>^cs+TeSi7M{^*&lx=eAD#I5AP*03VWr_Wje4gEr#-r? z)qCpC-Gd1S22A(RllOY2!Myp+dzj8)=n;-Qb-p$8*leB6D?RW^U-ZM(vwiuzFcUb= zVB)|HgHHK!^+1DtYyIiPnkE>62kPLR8fx+Bfi`P3xIFQtLErLV?_Sx1FW+3%;IaSQ zut%eFy!c_dC$A0pR}Hyxc(GhO)-Me{;-N!s8nEHX^TfG3fA!4{|*1xhH0gUk}4kE8iX;@%(nYn>j7|6LR!Ihg|C%Pg?npORie)*7Vb9Po6qD zVABOpu6v@Vy*s;a@Xfh;S_KSu>(tQWRbw8xTYkKxlWqYQhdMk0Heck~w}wL>Pwm5p zNeeztweaP9Hr5*s+TflUIPiW+68fs~?_LQp^_frl$ z8hB>!XT$91k?-%o+p$(hTN-Af_M)L*{diBqT&LMRgR6IX<-qlPZNOIxn@6y$Y0@t( z&h@M}I-S82X~@yDaKqm>UYjkm^n9e%n8lRkOo;T^78{^|i2 z%y~r1H1SN0yKWyA9q{0!Ay-)QS2(+Dq@jPB+(UTQ_UL|Z@JKx!aP^8)ZW{7wGhevQ z+=JbDXXfPGw+zc%(%4MY!C5^nbHqoldV8MmY0@i?gu8(cmvejG$93x3+3o`E*6z4k z+&reo9Pm6gVA;3EPq%M34foxi8a_=YPMEZ>4|VQ}8NpA(Ieb0yp5JtsrG3BqhVS8_ z!8=d<*NvM7419XSx%;wjn}_n;3AlQh$KGk?g?(J==czpYq%mKe(}oi+p4SF{?CBv5 z_uY*2qt?Eh-L>1Ud4ijdFzL|)FE;0SXjby=JEsdaf7SDdzwqhMH(oh#t>x0oKQl|i zJgo72HsG#*JZaD*2REKH_@;I}(SX-eK0k$ddCHfYhF5`iU3^~^3?p&VQ zG}K-<%nUCaJ@60i+0X(nds98Mbgb?5Ys8!tY+I-588P=`xza&QZEu$_B%E}w5S>Q|i_J$cuI z93J3L!yYfjIUJbw;CaGf$8aQd4UT1oy*ApL&&eh1b?^`x!`Fa+#3ff_-!AFzYd1^0>`K~XxFyVQ}!E3ns zu#ZokK49B}0h?aja`CBk_N@U+jb7yK%-^Z?!*h8s<-H&8yobjFXZH+`3Hq_4txOn-2bNjIT-SAxr_l6F= z>0b@s_zy#0dc;c)Zcpd>QEv~wclhwk4W~S~*6Yh2UwnVC^q_z5^5pB=_Xit4Ou6oh z+0%uYWaf4S8zS(ZLJvfx3mlmFwmv=by;)ZAcsi7|+2fiA)dZtV00f(S}_3ngP z@34h;8r?^A>b>*d%;}?(4!Lx=hj7hd_u85JCHTz?IIoT6(75lxnR`N`Tv)gS4(IBu z)9{U&nO@=ZOU|@e!mT^UA(ldHli&M^AEb zJGYl(?J19!aOm+J`03j$oLke#TX)zK4_)RA+f4YuYx^|dcBkx_(LB6(so%~$U#|Nhm!JCe_l+*NLaki$Q71<(y|At65%%EmMbO2s%@8)OH24Smqe0tzgX0|z zPo2Zn>$%_b*qi_GysQ6pJZXbt4=?R{Q=21rw7(td~E0-O!J}ukzsedurxpv>EFOw>`D%fxmKTS1S(=pY2)G|Im=f zZ}l{+7jqN-zR--HHs20yezy%=aNu4v_EQVfJ%Q^CwjYf7#}|6c85Yl+n}fd8u0QoK zmur7|)$u$H=iYJS(f9h~#XQ;FbS4i!FXa0hm4+O8)NOuxbwB(avNk6k!QGvr&7Ab6 z7ROCP9c+CKPY$hk^-YUj+#CG-zHi_&0~~b1bbsW}YkIuXoW{N-`t0xA8ebabM++`_ z`1GQOH01JzW;t~D@t)80%eAJ%GY!3}^*%g$(wHv&(4-FDJfWW!zQFO53(Gz|>hQwG ztk=kqCtDO#*^wWdOtkrnJgALCep-;|pgEpM@oZ*9=29J3r?CE`;(t!{5bjg{A z_SL1K1{ZDSXhw2r=NbRZz`f#`fFsvAeQGWm=Cv7^)xHBYr;tM%y=I|KJ`D5I>t-b%j@igH176XT#%8E*yw2!z zr}iz=j#I8MTY31>zzLsMX~=c1N6+)12Zl2m^u|AXn+5JPoWZoON44tAf>!;QB_Hh5 zLDRlh?=bB7=@Ew6%W+1V`^e{c?P*^g4mx?FUY&D%o^;9ee$H*CxcIG>W_Ll3cbN8W z8hVFgW_p?5)@uCp0+Tn^v^cwO;Q!XZr&jQcJ{-3VSl11+n z^wA8%_su(c@wkh6phrD^8g~!UH4OD|FB|mZmP5Dw^&l74bi%WTbAIj2^P&NJdwPVa zzchBY_ymiO_~huFr|`YgK>PZ)r+4S@dFsx=f&-67{KJb&Elh$%qp$7kTgVr=)+w)zjRp;HgS>c3%!OOYh$Gi~q7=_G!>&PmOQJ z)4jiH@LC`0c<<*q9z8kx)!6stKJx@0FT6iB=%9Te|?Bmb_K4)f1$6Eu|xIE=NA5Xo~ernM0 z+Tf>J+49Qv(kQV-Lb_Tlqkv)^~%DG!f& z!ApBQpi7U!ncns42^;3QpSOLdO|71Xp;o>=V6Jz(_?+Q{rN@T`|Me^vr?_vJ0Z(D6 zlQZq}0WP2Q3xB-nTIh$5n~i$9VQt^LJHt;{Y3SFvCtO;64|vTygMYd!Hpod4wT^Ls;|-r?*{ zbos?;rl*G4=;gfuQ&05GUw)a9JzCeNZ$+q=>t`&8%sonRh&M zzHgTvx_onLVd3Nl47zZ6;!^Kve(tHK+0iARC*EOrPXnJkbEOg2^wM_OfKQ*?^}}O) zdVom>t!nM_N{?{W*@I)xO!PnpPIIJ@cDm-R8h3*aaPZ)8E>Ar@_MFS3$6DP24h`!W zjykzwGq$FO4jAKcN9}vkKOgW4zUs+SUvO}nqn_dC2xmNY#&da@6UQ_x$k9smJTdTfNf0zXdqq3SPP&Fy@PU?41{B z&<{htzVXu`KMffAgHMxlJ*n}&dy%f~^M@{e;c+L;$UO86PoA@#!=K*GU+=yrTIiz3 z9Oe0Y;2b9G&*M3*@|@AE)|y9r+w5MtrpG=VYUB!dYKNz1YayTa<}uy&gudW-`d0AL z$tyAa^TCrQJ;>9SJR0!x))}lcD(d=nRg9m1( zW;o8=Ct7GrV|8%&@uR_y-6wkNn?F2037B-*(<`1d^ysM$7fu{{^7M|&or0rp;fyc# z9vj2t37_;Whdz4fGkfPkej0Si-Q4I|K0UD1+2bSq_T|&WQ~W&D1H7H{%{h(g>ESsJ zUg#qYUg>k(>vwkuCSLn|Q->2KUi$T8AEz_@!u#34FHb&=`|jZCLk(?oua{|rOB)Wp z;itp9wb?s2ud4=~_HP<|qe&lfaOj&3+~dc=0|Ad#80yUrubMPA3pM)kt_M8c^&;2# z|L4K)+#EgC>GPt26ZiV#TN*UM;fo&L8)|vLOZ}Ru9J9987cc4I6D;SxA>6+=>{+{C zw5B1SkLvZa@10Kd&T-&YFX&3c{y4h)`oGie%l^K>aWC}fr(ZK0UyijWUtqsBVvo*wurpDuS-kJf(rkqg69y`J#$z}~dGyY}G1a5rdmr*;S7+%@hS ze(Kf0gbkM_y?K|*KR80KwAojS!+nzf+*nV}yyyBxd$%CsuSnmzJ^HqKt&eqHN z8ke5`(V*4$0UsB?-Fw((tq!I-`TCcq?xMj5Jp6aZ=%X8^-rxw@)ThB0Yv=0KsMRyy z)zZLoT;i=^K0Mr`grRct{&y-Nw`1Gc(Qw0OVW&T*xo2j9rK5A@0Tv*8Z$90x91#3n9dgbcZ9!wbS9&Y{5WAD!8@|$*AoYUu=H=b$GgyUNSkN(u_ zkyhVSj&Nq}Ob*O6)Ov?$Z!^M6qkNpWVDQ>LuW+kT?~c)(hI8CJfyZyTkBxbV7cQR7 zWZe4Zkr_A_)@jf%Uup4<*SURr;~B5-&6ym&>Qz79<%%4kAKdQl?wVSfXxFR1Z)xCF zJ8$IRQtN)MSLZPGjDK}>sHX#$aDRN0?mz$ZAO{wo)Zl>S8&m_2Zhte}|Mlh`IyVa* zdg^5!(&QZnY&_1)Pn~(-bLL%t4-FoB(n^b-__8@#%b(Z2pLwn?_3GxcdoVtF)W083 zea|CxGB;>KJVl6O~R9_mfrOUTQ2Q#(r_+* zHRwrWT>RlFOaTuDPP+B-*ua&BGi&#rKHd$J2K}3jHBS8rJ>50%nVLJ}DUWyXyw4-g-3OT7 z<+!sj^niyJ;STd%o*D5&;M4<8aC(}D8fUQa?;bl#gBCw?Qm+;#?Qr$wOs#kMa-54_ z$2%VTn-P3^Xr^QHv8D$Oy*SK}ANI_~o-;GD=iBEC%-vB>c|23&T+h~?>gVls z*Jhz!Z=Q6W8tQQC1D-kHT<}MqJ?J+L8hEVE zeCUyv2He%#Ur$|reJi-nd8~Pp22AH~jXxXD4Vv+}bHdEM3*6pu(khpJ7-{g!Ie!G7 zUmNcYy?ft`e8({OrCu$30ax$%?W@rjEOW*oV48_DSnfS-|J6|c+2B76Smp!&sUcVW zbh@u{;aNLd4z22O3pn!Zd%6dnf|iShS=}{;p^jI2q1Ds(qJL-dX{Mh(Skvsxolrx+ z9CMsbI_%-r13m7ha7&<0>?i8 z)$>D*oSTN3+21!}A1__FuN(B5wS4|vHNG|cE*rNEd34~tYrvDw3p!!q7X0|5A=jE$ zdZHBuZXUy+hlhCWuWx6x`_Ts189x1_@!FXGyf824a_QkSUtrN_O^-b19}T&B91e~0 z(%=hDIXu+|&ph4bG}ecD?+*>V;&B)3!+;4J_wJS2-Fvybf$v;Be(!QTz4HV=f90t0 zt{+@#)8Gd`<@1jQ`TC#(pQnIL%W|E;^GriM{c_BS4t4Vtwr~$&(8L4hcMWImiaTWu z+jBkb+k|cHo4s$CpPte<_hXvP#obhM)xam{#7`$2y!69Rv*&t|zkZhI9`V(?{+;s_ zk9o`=Jo=?m4Ng9ogFC0zeZ?scm%ej^dBCE@8jiIZJos^VhYL@SFw7V3zJL4fpEEUZ z;Ei9dwR3-icW?Bze%D*N2M>-teWhVG?gby!&<^vaVb*H&i3_e=dwR2<243&O^&Rs? zKl+8623)oNMywyc!ql_9^ZdQrqn9=_pamBWduhluPaeT?M}9T!l%2 z|F~$E3m=cUz*ybCx^_knuFHn+^{w&Q@N))RjXMb&hj&HzHOJf@N%+#Kr8f(47 z;Gw$B8J{zI^6XzX{2g!RD0V{$4@!->A~qBZmd~)<6@2v0Qy8#$v03{r;Na7jJ2h=MVC-JQH-8v3(Z2hiuHmYu z$G(}$e`?U6KX~?d$tRrF@aUcw@_0z6J(_q(16^w8uWvmKy4-U)G|VFy(+X!C^zg@? ze3;H?vW8>srv@(g^6AtcOnuEiYjw``NQ-&!9TzNq!%2fKYfmAEhcNtb!t%Eo4vo9V zbPOMcZ<{7Q%A-j=EM5v2?z**~KIL6C)bPO>pUrNZ_UV{MFjs4>?=)ze2lVMjt$<~o zZw;Jg#us{opBg==^G)fCUpdzDoZ--?bGT;a%-R{PW+n%hJ4xs6rylL|RZbeK$LE_f z4>hp)sCW1{?bE(H?j5F3=Ly%m-64Bv(7{`E)9H?`#yqXn`ev+o#uxe?8#L%I4VrwL zJi$5d@bdgW8+e@UKK`p~XL^DQ&n#himrs*(I_#@gLjyn3z-vbG=#(e)KnG0xwDHV7 zY?yfT;10-x4_ByF=WoIv4L+=APaHfI>eYDSQAdx!W!}~>_((r3IN&%l54iI6K@YFs z+LNOOhI+Nbch0LEdvsXuJ~)>TU;T2^^-F_ZUg)2Wd7(GCJe#LDcL#i%{E_FUH?@xq zKB(E>3^~s5IOjhc-gw80OTX6UJWl88?W=)JlU}A-tv=GQ#-&C+A6^@2m^VD<|8C&$ z4XsE0i8S~|hjUo^6a1ZSIP&1Y#V0=vo~x&aRyyR!w-(msjZ^P(t@X%TGdCl>)8GuQ zwR3!GZX0s-C!CLq23+d!$xp+%e(1#~kDt@+%$>)q3X}ZO+xu1rHV+ao>F@Las&@{Z}dE$=fn5z`Qf~2@ae9h5Blh`2Oln8 zeer7^>kZ!Srg!J&iPO7&-i{|Oxqj9-ywl1@Jqa~w@SYyui>DmA&3RtqvQM9|@4nJ) zA3lxq(CqPghr=WN%B6{Ze!y8jU4G@lrA-bDbH!=B?+q7Ryzu1jUebgQu5)+A-BPnV zYu~xp9Ucxp%o>h8bHEM5Y(yI7s8)U&IIZRD3x{{Us&~isz3GS7=lY%FpwStA`0mF; zgI4Ew1fCq>%$hbFp8DOLg_Q=M;L(K-KcDq!jc@m2x$?)m`wkDM95aSD4*TBCYFc1e z)9k4~{P=cf^yr*lX6ej5Ts|&3oZ(1=X1w!bcU&$FKO1`E1&Cu0--`a! z>6Lf<;tNc*@a@6f_vcK1zH9r|u*^bly9ZZYPiMMTf78(0ZG*-%HY@2)48>$d5P8Q5srEq(%=OzrvV>a8szdz(4$|Pozr4p&z@#G3?2wI_SBvG z>r8!)=l+iN^-J%mPd&Ixw5g|ge-FIVO^YZ0`76}X4HLgvc&5Pz0c-v^lWVrH#IP>9 zmWxl1%h8J*z4L3Hn5i81W!m&2S0C=V9-LXzW`%*m*MBzjIBj&{ zrcv-ozFhCLIycKSXs~wIw#N@^yw(f)X_rfz9D2+~4sJT=H#755BS(+U&5lPf?88&L z`^5({PzS>t=yjK^({L_d-*D8!aqjG*;hdJchBLUHJb>lzfpfLqdE|Wesmm`M_evkm zXqrxYyrV4*v-cZUx;8KOiXKljJmVMt?9nH@)9yZQP2YOul^)dakPd$f=(cvo3m)(L zu`ib?*Qd38xaKAJq))!N51YN&xKn1WAN||ohv#Jj4n6o_)5rsR&eYnc zD-9a)JT-QQ@HZ3wfvH|p84cmuQ=rCgS$Yt1%?VL^?^Fb~gI`uS8>-A&pZqcXbG=}p> z*S-OGJJXLfFW|p6(y*rv?{b~f`O(m~T(cLn)0PHIXVW-+?xgi_aH^GW57&ExNA%;e z=bokkUyZ*pp5{b{wWq#3r<;ec;dtV5Z`>SFr24BpS;V){8K;Aotp)Ins_Boy?xxCIHrSsIrey*25+Xt9xe9dr2!9z zJ)CBspETstjR!xkXjXI4u)n_#k6rU%GxBckG{N@n`|+efm=8R>>U@jSV&=~NYRJ{o z^5y}3!<5TA@8;?K)PQH7hcNZ#zFAMNd!dHT`As`c`qj%Ze>1vkjF%>L&i1z>T{{=* zVd8>e?dgn$Zw)-w_Tc%Mng00YeEf3uUAa%U4So92Oy6cg5AA%$%STWC@tQV#?gDKG~PgQ&=}&Uk!YGaBi(O zjcN46WoGVb8ZhXgLqFc>6nw|WYnp^L5A1uVna?=CH(=wY*FMf+t8pgO(PGa$DmZMj*;-g$=p8BJOCvfDs(|UvNOt0hi zZXZt?W(3FV+#4KnXrR?vE^p}IrFUoeV9RmWV8}}Y2kqtzmoIdwm$Sb`ayCEOZ;$iM z52krsHRRqk(WA76)vz$EAkX`X45ZYV3*KH$2Y`*yaJplLmX<)zNp~;LZBQtsdS@L!Ecnyj90T z+S4$TQ$w8}ujJBdE%>A#^T7{8Px{s`3^mgyN3JvVJfM@eu*}EP8Qk&EJnTK~rQsgz zZz-Io#z%v0;STN_RSVy{ecsS&jcfk%CJla=k2M~7&S+C7UoXBr8iam4_3f$N9xVKL z^vNgnyoXCWe_*BIZh6X4Z~wKChJ5wY-R0N5+1b-$8snpv?(y)5zJE66jd#7!OSijW z)@uAMHaGZY>7Ma}E*yM@FHap`-BZ27RkwTG<=38bT(r_B#~QY^esRLot22QM?qh>? z{^53))WL-3$2)jw=*hV=-=sdg!?JIa0oU5h z)y?nq=qX38I^1-7*E?QwkO#xh9{+hD_yNNm^R8!Mtrl+@elW%d$KMK?<+{`S)!W|9 zm>wMbe`&0DIW+Se$NEm!dUg-wsy#L4sUC5``e^7C_B^I(J<+BIIQC)i1^(`YIoW$_ zq_MfJce>O%Jku{P-j8>DbkQxJcY1P1^yG{#KIrqap?A2y z8n9`=sRoXoaM8loH0FzZ9MeRzyRR48){9xt`QHs#G`TNnz)~;N>xDjdoJYP>e&H9i z>cJik??P|Fo`45S4G#HwO~bb*hbOqa%bBM*d8{`&_@M`wX~^~5zBAnN`G?a_KX`;3 z-gxqd2YBV;r4Q#kgT*uYfnNCO5fmkk)^sAihyktbaJ(d?W)y5K)F za7-Uu8i(bs!Io=Zt~2*aKfZUhR}K64a5$S6w9BDi4qte0-;C|ach0N*e1m3r{u|%r zu?fSEHvPd)!_0=cerT{yqkeFk9nWcX29F1SYtSY5d)t6*O(TqN4Vd=Vw=NV_L|b+D~*!lj>g*A05q%XdyQ&u<#`^v*AwbX_%Ic-OlccyQ)Jx^~Xb zX|PrYKMi{M=l`{=M^yK0Ns6gIeBsrs3P+nfd9- zcjq?`@mx0G`4;trcewsG!g5Bd@D1?A?Bxnt(x5}X_UN*Y7lx;Rt#}=~1T-+}7&%ZOGx3cX-~@ zkZ%_51OE9(7ks+m$%D7qcKKDWmM#Gkjv9XKTY;4ZZvSQpxo-`9>t!0?PXkUf^Zh$d zgC=-<$0J8QO#AqA_M{7kJUzi#M9K3w5%7JOPfaa*hN+dS3zw&~ClefDtiH4S*4{DU=JbjaC!Kf6xjsv*z) z5dJNqTd#WfIM&|fO@lMO>sNnt>5XRI^Vd6kL2DZFXb~{=<;**L+-c|!hJN(1 z`cv2N=r9ACH?!R}{PH)8o37o@9HADUci8I9PmR8C`v&2_PlKnvNi(yzyP%eC@345S zC;5D#^|rw)_4+YmT;6G>N3J~m$%Ua-j&tv3qZjj6Cr@9vX@aRQ9@4d5tm(p`*1I0n zi0M@aS1v4`(Bwyho@f$jc=yzgy}JfnJap0pQ}7ZGZ1L1kLy!72)H`!;^x+(qJ+;0G zI%v~3zn$xIGjV6E^#Ma2&%Il#g~0=RFzL$?!-73u?a_eKow9b1J$KJ>Ofz5HiDBd2 zcPfuZ_VD8|S9&%NUdi`!Cf6AqKN@M^$Dx1U98MU#lS8|Gy~0u}AGbYEx%Oz_we`I4 zl;f$^6Nmowh1V08y7erN4=)Y)xahY}A5HeH;p!_5HFDuuyZ33(4$BkHxM-f=_ULy` zpEYlB;pNrl4qxbP_lQ^exoKFR8nEemYotNvM+2{1{lebN)Y9obI8OtIJE8{XwDFBT zvxV>SHZ^PeAzQNWvd|?i0ID_jPPa3r0&_j;EBlvgK7zbXS&(H1OcW>XxZ(W;( zGkfk4U25+de&7E0@zt|@-=zM(AJNDE{oDt=dD1+7c#jP_^+i7no>}umpZgo8Z@K2< z|21;wnLhQzD_HJ<+%*1bY>v+0@m62vY&{=vdOtOIN}qgB*zTY6&Dv96`kqd8dc-eo z8}yhHpWFj@xSYe~uYLY_A196YcqKm#@7A>FISu-EALv;Qd^6*zIq|_7ml@(w2VbsQ zJ>j)aw|@BMj_^wl&h!Y|89fh;{Y~&r15O(C3k$A2_n8(Le8JDdaniBg(zSE5_V+=( z`*GQTCzr>3!%Kr)oP5DyZ<^K0oqqk%YF`~(=dh=nHs`#d+qoV*`N2mT)8G+L=v-fV zheazb_IF=!%eTj4b!J4D8U1R|ML$kG$r1XMLzf(}S=fioM_iuk6P7$2^x~t-EbRI2 z@MRT)r230wyiy zY2Qp>sr#b=-#wl0`m;yFxOrt?=);pQbkI*b{xo3AaUb3r`W5D3K6I$n2hRDb{;iRQ ze0lct&Wp{)-?sU*eqr%hEil*8=SP*^Mr%X z8lO5E%}y`$sr^R-{$`rv-I-eZ{D86Vm0$LSJ4*|F-tmhx{OH*I)RP=@y=v^6q#efY zArE&4@WS)0(5eQfck}X;FPuF$_~B03Q^Q+5!|~$-&NSqC@&MMf>fMa^AjjICciL|n z(~TnyJ<#TF;9Enlxad?j4Y1O9Z|vJKQy%i`wV{p{@zJo4ALm8GJm)hW_~yf7xq6XH zn|*-`u3X=szU1j$?vDms`qqat`e}b@IO8k4-y5*Z4Ucp9YP`GiIQ762IC}6iD?Q`1 z?_HjAKI#ESj;Axez>~`>wRAiCqv2lahekQpe%7?Xb9QQ|caF>b_-w#~Zy&B4@9vY( zlUcyB);kY*#&>rb`~5^k8nZsGDXrG|Dp{?`A=ZJ)w8H@YsiAAEtMn(Z)kP((t|Ep4t~` z_=|tD@}zUz>h?FxQ{8H;@z4%KE?xGm@fhiAj1)x79|FXZ8X z@4gIUb5iSm;KZ+X_ZX*IIM%q#-Ynb&xt{8#*AoYP`{psd{M)yuXPo@wle+ukiOU`y zx?#zsRX=i14PL_c6m-)h&)Obt-^$+_=BXYhJbuBamsYvz&i7!@?T+K*!9xSq_3`vh zI}U4qhi)5srB6*7IQ68r98Wpk`RrWS;}0!@ANJJhoxbVazB%Y;{_h+&PxJxPK7G># z%NgxzVF;e7!>NXEbPAmACT+Y{m&WEquRh#mxSsIj!NF+_mya}#hZeu-kRz9Nb>;wn z-y%K3!k>oT%=oP_U)9Y&y7dM#jp?!HjF-!|PJPOo1G_4ShT=*$7q8M=dz(b z4cvHml7{b7{$1mHLyaeYcCYl}Z-TRzhW=r!XWzOSnEIfbPVc;+QNJ)?3VWLoE;GPm z26AEOi+<1Lt9@^H;xa4zdshb|4LYso3r#q^<8t5h;R(yRS$N<76?pG%?r$PrVc>Ni zXtf8=Gsl`{nBG@In>?QD$G0JmPx_ZXkIaO2eO)*Bi%%VHT7{X&@uX#Uck?|RXU?Z{ zJx>Qe@SD}Vp00F{7TWCb)DI^ve$mD=@9qRFTIAB4hI(_RV{@lpt)Bf2=8vayd3gDc zi*K;;nT;HJ?91VcyR8R(ddH{N1r6|b-}KE}y5Ve|IJ|q(XrDHo`c7!m+f~E&ruWTu zT6th!Ei8KR;i6CdbHfbu1&2Ob^3}1bHs?5D;BjV;C&S{Ceede<>&>3n zysUR8&S%x_FQ3$#l^mRMel&2KBYxU>fdd{sdOU9%_SDdR-%txnfBdqhHw|8`XL~rD z^Tqpmmv?ITTj9(dzz5r`aG9Mm80vWXbgb!yOShinSa1H-5?yWT)Fw}YH6%BHxh5rBHvR-%WT8^bXgNJ4}xuk8_SC9k@7+afXE=k`%-Tz%V zp7qVwXm|pFQKKp|GBUD8lj3<~metlbjedHvuRnP-iNzP<`9;58aMEOM@$-vDHE5!dRyp=@ z=v_ZzZm_S081XdHY~MX`kLkEUt$KAg?eUaWa|K-05KpV#)uR_DP5S>j;C>$BcE9yO z18#o0Q|b7*wI5EJ)l-8vYP=a}mqQ1S^`$P&Jm9x|YhC~jTgIVOAwLbIq9%s!_zWQp2!9$-OajAp<*HFFs(3^h5(fRwa z{<$ZOdgGgSYw`RxceR=WpJ{N0OCQ$u#CEUrAAi;C9XBnX2E6pC>-T>SF9Wa4RV{VtkSEr=I{N2>wHg00_~!IV4-VdW-oOtY z+Y6CX{U;?%1z-1zG0d24a%(8#-d;CJ5`ZDuJ>jr6K1 z4nKY3@m0r+d0~$q>Wa}{vxtiy_MG#I_D@6e6lZSYiZLg#G>fN)A2i9UhWkmAbNTNF zc|a4taN*Uf{d9Y#%iZIjb2+{l=la1fmp`<$kCQ$e^xId{+LK=X-5{54GpmMt_ftIm zYRSVVm+$=5v-zkcE}H1HzJS5zRw?9 zJEuzytzb{CntG(gJk(R4CjD5eLrc8g<hg#+MuN)Oj`4)uZp!lb32( z>kCi)`)>55&w3H3j`}p|OAK8gPETs$rdciZ-E&X(lRvcL@HBI0xSivF9^64Oo;;$z z-f5MihBHv#xxJ@>7vM}hz3!wvx@dIIoa?haYxhTOXEb&uS6#L2tB0Fz@%F9Fx14ud zyZiLp!|^iM<0;SikJmeYXvNJ}Yg+#t)Km|T9Db{3pYOg6Gm)d-4dQUw$1e^qpTHT| zHv=)W(CCgkv&R#4#N>f}^+E4`H;AFpJ;dXwZ@uz^$KKV{8}I1V8}I1)_;}Kf4_<4& zy}MW9_>gDf#o@v4Ebr5yCO>ZQqg_tE=;vt=rw{$oj+2fX1ZC~j->(y#la2Cv@?X6f9%y!7WA9qyi) z+M@;f{yuNr{q-F=YreGN6r(mRX`|=EV^1H>?D5~7@>7FW`*iU~9IfvMXSnOpyV~O4 z4tQ?B?;8+npGWrmdgiwn8gZE!Z+O*wz0(5fx)XUruf67_rh9k;UTZ#>pIOmoZf^!W zxM_Pgq`le5&xilsnnw5Bxik9YsA*1qYT2U+)CGGy6f2JhYKm81j5)jv_W0iYy{+}G zNB7awnLDBejq3A6zB@tRrvay2u{W5Nd>(uo^de7vy2QFe@_9?QIJ5aW*msT_hn{HB zkC~~b25-H)Z*r`~^H2?X@rb9vj~~3aK`gIm6GNLgb=1@Yco&Py6V&@Y$jM*NAA_^s z10TieO^tsJ_--&`KH^Z5=6kHwQPUo-UxWVfxg%=g)xUH5a=@8-dbF<&$agNEPO~sm zPy968AWp71+`@TXZX#UAN1oF z@0`c>_@o!>e781JPx{pIu7*Bn!|zN@b?p6nkmK%n=LLSTJfV{p_kdoVxkotY5aU~* zQ$9Yr`-bSCM_p&~#oZv6K5JTe(VXy$rwbolYUtqx=ko1+9@H@h`@VJGTKb*Kx8Hqs z4`{;O-J-Ku$o)SC`tqb&<|9@f9{tnLM|^m#-w$sG|F--whkanfv6m-&@HYgHef`LD?%p;(_0nKXn|{m%x7zyf3dKHZSk?hl>zoa-Ck)8k#u{+8nv>m09MZ_p#n z*2Ond?|P*-Z`=!Y@`bNB?*VmqLO;Jg4fMYqZg3{Y4ALn_4fl&*>faz1hyKLV;|w3o zwBs_n-u3o*;E!kb&$&2S<*8{#aDzHD>r;PX&D>1w8)-;I4l`c=vgL@=i42^Vy zcb+dBYe4BWSBrPC~U!xwS1_4iN=PM*>( z7oUCl!8azJKKVQoS6^aq>Pc_i7d6F!ef4h;2ky1ndNaQpysM2vZ+uWwU(Rqi$LSm| zFYH_U`{bzy_1_Q9<=!B!?+J&PxW&=&dBAal9_`a$ZHCrz^^ISAcf>xw#j2^6UhwM0 zo-;Fke!S}=e!lSeWf12{AAV=z%p(tQ_qRfx`y&45K%a9xcAxY@W3y13Mt@uKOs)E| zcaJlDikIKa#NHt8(?D08-qm%c7rOLKgFM=t@j88Sc}$aD^&?)4n$1Eyu6yk9T&@_s zs8{d&`Z(~x-%dW^k?$_^Nsj*PsRiz|y&LfQK5%uH`0#a*Lywx`^6cBzG|-0Yd64Uz zPkN*YPc!%KuHceqPU`Z~nkUu5ub({BLwA{evFg#F4?Os-^_*_nyz>Z$^$qILMvs5{ zg0tu?`pgs@Z#{aPq%zOG3wwqQ=0TG-Z$EJiW{#ua9*D@@&&iEblIoZ9?tIS zmVfEeGhQ>LftDNO;Wk5iZwKFz`hM<``hMny!(G91gPDru>kaz$jo8CSPkqrqyIg;7 z@#3;4Uo36iMe+HaNBYK1#|>Ww_1rUl((4^parVJJedb7;Iz0PxphrFPdK$#?Mt!+7 z|YO*5Xak2NoNWba=CAL%rIXWsG3Hy;|+v`+^<=hkZ5Z?0ylS9Lw(Qx6ASwDX~v z^4*!9X`~DATN#}gmz_T-Dhh35wQ=1Q+8;J$%w&-$Vd2i?^&H|J)J%h?};IPvPylrFJi%*Q$H zG~%;Qo4WcJYhSGI&>eNovm2a=#pAmG-t&ttI@C8O^>64dIrj~J9GrRnZP16cvwry9 zU3|1yKM!K^v)m8cqt&@s5J&e7eYf8AD?hKq>OtRl%tEhE18>2(Cry1j;=T>({_m~* z4HHM?)(^iHR5hSy^IuDqKk&-LJ5)1hZP^=A+8;r8^-J8QW=2et6)r+Lw(cJbzA z{%YFOpIH0e>Csz#^ObM3n1i{y59)ZY77+;`5H<^=!@O2DSA}k6d%WZB36gj{4?>UOjzJeBgcBoYlX6@!%GJ z58$;=lRNZw5JLw(vlHW~Z+vE}C;R%LTfQ3J?bj=h@ZhEkcf2^vRjnKH&fQ3RJa~DA z&+M(mtJ@uEhV=2lyKh!}p5U=o_s4L98tU=)>*M|QluKKCafna5IqQjLnwl5C)bQkw zp4EUa123J+qsiJ?{(9omi!&O;(SuW-IeNYwo(Hw{+8p|u+3ejLJ(!Q5T(ei#PduIW zK#!k>-vi%iQHOS%-aTm*e*=CT&gj&GGalJftG_RO2hP>DZ)UzJy!yr=PK+}?&_Y+= zp?=g6|6$;_cX7T8e(PPn+0nr#?`fx7O+C|!vpXb?23pi?X5A&a80RS&e_=AARWH?w+cF8bmXUGlw~Yn(ixU(cTM zXm5trernS1-8|&ss4xBaxu1B<#nT<&p?98xJX~thrY28t+IQYv5RXTHYT4&Yo_SC6 zZOuF0*uTMcj)hp8g$^`uNc3d|NHS*uJar4({253P^UYp z)(yC6#V3zXYIV=?n~^+E9D1i4KmYz`a8|CG&Gq}%?w0zz@qOw~zM6h&_~vf-GSEaz z-;~W)w$gzGu(2Y~BJ3-f* z!M#yOe>}k_)|o!6Y3q#NxcP{$@54Lo_HdX%9@FagbNDeh?{4v5tXk^$`$Ug>3B^2M5qrx>;LqA#BD6(L-JoZ@ z)@DuvJ@}n@|2*8FU-hiJYyr>38J zYTO{74xG;Euy+IhaeBA!Z^#Yu>C^}A&x5*rdo$E0{r7ms!ymPHO`rT5%Wz^9DIMObnRj~4IFEUu9zMO(%;VylFJ5*0toiom;I1`GGpFeJ1Cp5V~0cl)%f_ik`TgP!n+fAe^!`NQDbm!mcwF+Yd2dFl}l-lqYd z|7X-M-*3PJbkHh?e`a|DE;;T8AIw$ncz+G~YPC>^-P z(3!@2tj$QS=M7>(|7zl=-@E$G#L|~mdmjdMX`&5h^N{Ns5T8bI-v>PM{4Kc0+I^r? zJl*}D39mVS9(-$Z^+YFL8g6(u$l(EQc{I3NJTW_S&7Y^O<%9W&liT0w{HIw@G<+NQ z;$Fz1R~?%5N|*1*e%^2S7w_$fr+?3^)suru9s28?H}=g!9A0bn^rwcJ;+^Zm(+u=@ zgM3=c@m}n04LnJU_m2aw@pZ-%zSE#r-ZXdjLcE&zC?MD z%tX()s$)Oy+ZwO>^`1BO=+PUmXz?u8yE`o3K3*JZ(rFgX?D4_hDNML#&eIq1V&X;+s&Jmh6L)?)RmS9;9AIexv-DJHFQ{9UPc zzVce0p7E$7*Sq>^>#bhs{XTfwPlqS})Z?{#!Jqo0#Tu`lzcaj0OMN=hh1cxl0AKOS zr9;o}h8y(5EBD9@Y4*gczZ>)~$9G{CV(_`+;`HrrCp~!7!|`^YN!@0BTk|-6Yy5co z*33_yJ-K?}5AL+u|2g2L!&CkD15O(Jc#6lp(}Nm3z%L)qe+Ktf9kDmy5+|Nk-kS>z zVx93pJdg1?|QCcd=Ms{Y>weAULsr@jOF z)z+7q&TcR>y!x>x&)$cDcAT_0ldm=od;C&cKlFSY^Z<02BVK*r!t1O%h!1dgcl5&p zUiD4f*6N6{<_R61p9b+a_*|GvKT~KHB7~sb`+hL!VeY#ps2`_<10&p&AKQ06>IM98PJm^ z@9rF(`lAUKedetfb;ZE9K^#pyYX)jR5Bjrq-d+6L)@Gm=eDrz;z0j!Fw}X4p%*@Zb zI%X~xKR#={-$1*ky>xB)SFieLrutAvzCO*_8SneiZOtDago@ZqM> z8IQ#3&1`Y#OV7B(;pVftG^%UQxhH-6@%M%noXts&-0q&*^{lQlz4SfkpI6n!N2eL- zq5fLG-JW_+1FiVQ08QN`9C-CtUHyvlt&7E>Kc4FU2C+2IoNwyLb*8Ty@W^#`gL?Yn zgR}309@Q#_Z~DS39_p75_?sDh<|6mCKJW5A4rZv9nKXMEobwAe;1Q<>TzhCIA(v(`xZXV= zR}C|u*;+r(gV-BB59;yCy#xN`ho_%-xnl8r8O+%pE%L!Xb~e;?fk-_ zKkt7I{sxiSI?twjeX}y6CIr?=b7mpZEb5LI`-iddH z&z>{&o&6Zh1ee}%dFn3?x&XHvcSa5V=*iy;y*k5>lYZ-bGRNZa@XdSr)G`}&X!GtT z2A|&3qaQWx0sq}U{_DeB=u#WMCoR=8OZmPbd7mB-3wZR1hi88dABX=Mocnzk=)vvG zj}E`5;rRhI-VE;syn5@t;lDwir@tjM%2$UUa@2CKXp+l2PqPAR_dw5P338m-$M1{= ze*I^_f!iF_Qdhm^bdNQ!^`K8r`DSzjemyvohtIouwDOBKIea!7`|{ro>dH$$Z|a9G zdg#7EKjO@hCTsEd@Ypw3y{k_Lt{d_uKWG6we4r1Hd75S1=8*<9@ZgtAx3wPKXHXa4 zuOUzQN*8Z#@NP{n9<|gF(|4;TE%@;BS3kUEn|p&2sqX&fK6cb?Fh~EKT{R7r7wbT~$Y2GZn`dTAe$yR>PV8dD$Ji zt@WdhJ+bCXgLw6<^}|Cmav$*E_tb|Nynv4ZAGF~V%gf;b6rWrfqtGUwS-iT=ie3j=;(k$NHRGX*nL0;gID+dp6o^yI} z$rTf?dm)!je0rAe9n9%@(3crK4YcS5Pj~OOR^L92^8DyjOD;deH(Q)~vnTicz*FbV z);V2t(uL0+59RBJkM0q@*3~lyu{7Tx*WV1Dh)EmncLP3WIMjEp&iBEOhv~Yl^$Psq zw|Ke#7bg%5`@!Oy#UL16rkDi*NSpGF{-s`*X0uRt7U#`09&_W;FK==1S{LeuQ z*r&xl-^ASTV=zlGw8w*2J@K@wt7jVR(`+7ecW1Z!%VXzwXw=IM^5p1=e($)=M7|o< z_L`eGpv%7ebl%q8gXV%mT{-_8+#&IF;MA*gb;R(&S|2o9+cOt4!~1cdS?wF_d4KH( z9dTQW1#9=wli&QmfiC;;;Bp`7*C%bx=&^^Jk3g#)~bdy*PQIr@kMx<;Ba3`thuH`+6`( zIY5{1;|9IcsAgW;Ghh3>rC(jX>k~Ile!D|r=(|A-O}sF>@5Admjx%lf{bqY~+IQ|= z=-Vtm3^Y5#i>r5<)l(<$@#K?So{JZ&Z~1zcgOi8Op9VeM;GQ_s7d>j2l|5c~+S7l2 zc-q77i5DLZ-uQc&zxtpt{@dD~9QEk?F^KoKoK_n9F7f-j?j1KxzAN?Qi>Ft=@@R4= zcqB)xbMOAm#T+;*(E@xEt`$Du$Z$LY@3=u8 zAME4y?kT=myQ6;$`s0T)x?A%QcX!j%-M#^rci%eAX6eqULqCq{@=?tj@FPwdyPeZJe{747o%VNT9yQ;Rq1$rYnF`DwP#W4XTuT5yOJ^L{W#{fkla zWsqkMo;Nu6H&Kjl!o00LyA$03HE8s1PQ~Ej8QuEwRKwo_XL7phda{>GnJkW<&IXCd#EYzf3ymLJ2=aX|h_Hf_uVUYWF_&t0X)bWnTd~k}P)4OwPzJPm) z*BNf-eD(K_XL4__Z%w~C{Br+0mqRyhJl56ahdqAC|2gndZJs<2{78edUju$V(C2Qr zEAF-$-g)C(9l7}Eav$im*BU1t-~5}QUT^E}B_1{P4f^ap(GFs(kE5CCi=X=7g}$uK zftQ|Y-++U@X08vM;{Wf*zFzEqc)Z`9?uveK<+u8JRu2a+^-7EU8(z;yo_FA-e7)*L zzPo+H&w)OAx+{3)gMM+y!$TW?&E47=KHBsu?jCFPaJ&rsmPe~Nym}C?PhRysxcB+S zA70QVU!J<|h`GO>p+4~7qqTEfd5MQsakTJ7tl2d$G4}elxBTmV;n%DA((+|r2OZ9ESc~@*$6p%04PxZb!w2uq=}=4Dmj}M@DMruE)zK3jIMmVu zjx;*Q;VcdI%#B_gdQ{)qU6YT;9aI~ae7fjY3s-&1x0a{YJ)St!p&8`SeS>%$X5cB; znKdoy9AJE_bFB!K2P4K*&cp- zIQZ;IpI_Ro-w(KahhlhahTfg|nN_p6t$D5=TGi=3n45hX-E|(&^2fki9C{Eh?|E>p z-VNrU7Jc1$?_%{P4#y38vfmz_8`J^4(}|Op{G|;~8ud-9Tz!kH7j^CF5tkU+&CHn@ z;=c#%^{#LF#K_}?vo`|{=k!?L@b0nJw>Urdkyadf_RL@Vay{v><^`xL4v!o?c-N<= zc>btQ8~@amD@I-4kXUu|$_%af!MA#KXTTlgHC|8W>bOTV<%ybV`8$Kh_kpuH;!&SY zXL{&vtFM+lJ=^yarw8@y^I3iIH{hm0ozH_a8tu_y?s}z%e(yMG$C1DG#mK{nxzoy5*=LC$H(&uUXjVPqXw6 zyylty)ZrQaAA@+H!MvPXnpN|1AF84=$JzCQZ&eh-n-}n+AE#AeO zdoxhq8P9LfGcI}JUe^>SuRgZ?|L%u+y%F@mn1} zJPrE(Iq3TaI`pHaJs#z$wfOqSPXj)6tj&NXI=zdLgF|h5?+5YDaEf&oiW5tpzVPYA z^R+fL)uB_KGu(3J>DgZT@zE{D{rxcTT`n!S+#$~!_-R&h#HxdfPTV*2_uw`D?zo9#zo*MM2qXrHdd7W-g zxq5SkSA4!Zr~BLBeiW~^K4_C~-=17`@^Q*jv%6wm)uNXs zvDQ3vAMw$kj=uGeUyQndgCFh}e%kEQ4{66mmw3IX;azTXO^+J5`vrZwK+bX*Om@rx;Hf{GJBd-w*!&_<4$ZH_+_IUmEH9 zV{ra5s6h`M9|!e#Ko1{q%Tbd~?>FchT04I;=+Pcde&EeN8m#er9{x7q;{$(b5-+aV zn6cO!oQdUc@&DXfExz&0n*Qg(J<+rKC{NuR@Q4TJ&Ct0sy?E9iJ-#K}VmxVu@^RhZ zE{c&$JCD7a3C;YWj~=@68o$0i4Q4_EF7dRe$tyjoE1yU1LAuowldpWk5ibrgH>jbO z+_%FGV(pu|I@bDnH_$Iv5B7nMdpv2xRX=>e2jcS1xj65*>BT9I2hN)9x5v9a&A>fW zhc@@<9#4BT%gqm(?d#nWaDZ4(^>Ol2KlgajM5n#D@tOs%`n!t5IlVxW7ML zPLIF2Vt^0M{GI5&;r4FM<^6oD-|xvUb#HKPZ3g%~>AfM%YFN`I<_39u^-jkP>d`76 zXP$Jo(x`@9`*`HN4Ei?{ad`3MwZD-!G%I=D<+vN-JkyG^{^iKW%TxW=qk1&Uzd@hw zjrqEFbkHjfPhRz%-1hM5Reduk77x$te;V8eYnthAu4#DM9&I$JLqm5SuXT4s91bx! zt>rWm_1+IWpxd3vbGkrp&UjWodc}uJjK4FU>g16pE}p&{aOj^ly1WOm&cy!D;9cDt z^sScqypiuN+2c+Be%q(tdw&b)(zACpae{A3@BZfM|9PNQEFEg8%NMf|_hzu?rxuOg z<V4lDM}6GZ>bqw+-39m98aFNO zOkUyzymA1)+1gXbJa{EHoxJA@t^U@>iP!hS>%5>(4SP7n^T1yHnad6MajNxoa1XjC zYIrwKdt!jM?*`m@}7SibFl~^A2Lg@kL*F z@70qgHT=}>4v51ght6h8um1lzxZnDx!QWJM&4~_c{o~e`7MDF)BaL9QBV((0YJ za_RT(E}9{|bb03w4%&VX>giLSGg^5j-uK}B$3QcF_0+{lZ{E;qUw?F(E8oplEwT2S zi<)BihwFJz1BZPY=%ZQQ4Y=?)OSh*wwA13g(P^J=`1Ik)=W=grTJ7mw9XUAEPz#Tk zc+|K-jDGcHKH_iSyB@67QImgqO(XC12l4Vio>+4huMe^EaEZO4e6`GlCc3TpRV*$! z@@d4$XWG?L$C=*E+8!=zeaUy`sTMz)%lECj%kCGCfQM?*AQnGw>^tw>Jj@iQJ(|7@ zc;$om=3cDcozaNbeALpvClB!81+n*7dsY`WF8$)*jXgf$v8JDH-}Vi3J`c3=MVuM& zCZEjl27Lb+oLR@O5Abdl^6JCWol;LszQ4Y+`6!=$8a&NTE!ynqn>O!a-wq##_Ydsx z*H3-l?)Qfs_dZ)9V^xD0nub#x)$L&ty z<&*rUfd;@ulRm}r*`681CD*(8nNz*ux`BpzcPG?yrZ-PM(yIopZ-bijc8{&acOS*7 z>75_^r|Z*z;|6D9=&`3Cb;Q!dFZ}je|7~k$IL%x>uiQzqa>x0AOAha86|atd%2Sgj zTJ^67@A%ZEd6y@pkXz`hMh#l|x%Tnu{13?Bl@g9Y_Ar(j zd4@~AGrl{QcaJqbdwTX%mxlIu3*ue|9Ju;UZ|h?96W`mdY2&XwcZw$3`QV=2fJa=~ za61G0^zciMa`B1PgEfEE<(*#h#Qjpw9q~QsuUz~5lB1sd?z#8R!-v7$Q_E8<+&~NP zLp}QHO+RYWFYo>EeK0$F^y(k4IyCd!jA#^RAD?}(@_9kq4Qld2Tz!h?v3tR@z8`UN zaoxZJ+QrwCbMLg6B`;_zP7biw<_N?_=FZRUa5`#l8o_Nj5JD=Pc zGx}qoov+;$y4ADqZ_e|eFLiMLIpEMsGqVpo;z_;V)?#UeyrTy{&3b^R$CFOp15UHU z!57^8Gkf_T2Ql>Gl7mMrdywuoTkC}e{qO*9+G(IWZ`>6+@#e{G{ciB&B@e9WpiQn= zI%qTxwesM@*5+aM?pwOWspVZ?&eEb^b8wFL&%u0gisd;?a%k0$Cpb6P*K4)Z;gNGZ zcs;=#r`@@Jtm}mi{5bgKhnrUY>yC)+r!sWZ8?5oc<8C0db!8D-tjr}>sz85 zN1pmFd906bLw8sH4ZPG>n#HZ_YCjTppIDQ`gWJ<+dWbj^yTm14fy4Wr^g-1 z6I{;m>qR|v^Hh&Kwofx&I_Q2ssO?_jxxpOt%6~kbxM;!Q-MKj2Jf{h#cYO872XS)v z;*QWMhE``c(834r_~>*$em-cU^EpSEXR|9bPz8~%#7M?VhpR*R;011-FG z9zG7v%BTPRfa~?oetUBK)Zq(Wy7}kn-QP0(;9xmWec-`wpGG-6qDQ-_*y!uwxv%h~dh}XAze845%nR@Po zn(FA)zI?rjYhMg*x|+LswCKk<55EjFsjF8tark>-{b|q#-^BZwA1!p^yR>i*G|7 z{p!=pGdZ4bhJ4V6eLVfG<%2vL#Pitm)1anzKHZ>>KGYWDUeW2PpO@hVd(98O9_gf! z796~DrVcJK^`S3oz0*dsJn`}2QqQ+8hJU^-vGni>CoTBJ%XPoa(A}fyX;4qh+X0s| zvEt}dn-BcZyYqDE#XB9&aq(9UO`dAt^i6Mf4zKT=et9_57Nb@k;!@9?!I^$N z%~ZZQ(<>K;cwSk59n6y!=X@4R7e8>-6E3;pfCjmE%o~S%TIv5b@T@ca;420{kMirb z#>snY=knE}$(n}dhQ~V&{mT3E@ot}P{+l@tGrvJTZhGky=f39wjn%csKRv1=UacFP z(Qd7_b9?H^;jOj0>eD12=#uL`_|fECp1*;fbiEnO6)z2PX%~wZoYADdJn=jii}wcm z-o^0P+MMLmBHk?Z-dsFy5KoKPmqD#~&EU;|A9ucb2lv{yfaBf32VA^yMu$DQ&3((i z`1>1FFM3wrH;a#cTHFn>w0ru|MI&Bo^AzvLFZ=eK{m-C=bDH%@BW|4PinZ50(WjqT z@z1x07l*py<>rIl%$sh0SkoZ>Wym-0e8C~d8II;7kKStWk4}4O$Aw27`_Ack8tjR~ zuXlf2#N#!8v2s26%nLf)J=*mtU##;RaC`c`#qbHYoc@;Jz~!Cxyzn=|H*$k-L5wv{ zb?A5gd5}XJ?R@wAbNJ^V7x0UxUvBqAo;#=ZuYpGM5rbPC&{+-p^vTih_kk{XUj}-- zt1DLRJabQO$XDEENSmiP8uZ~QUtL@{)$)$VeC)f2c+6b9@7z3{iR(L})jR*x;*&gm z*rUPw4Qk=yjhT7piC*l9zkx5-_QeC;d98M__MDl&J-YS63%+^B*SjQN8s!VUOo z5^HS+H<+bd?`i70QD2Q_*Ia2fb8&p|`#6|AeV+z8I>-M!;0L{=olcs>2Yp)eTu;uM z$8Akd-sq`b#r}J!PaO2{*BLKxLEi=cXbHD2vY`ZOCo=~YjBqm2f7 z>Cl%Lz0lYFP*)6(>2W4TT{Z2iWp3W>(@D2DYv=aWHLsT;T{PIIQLMW5=+n;)c)*@K z-k7ys>b1Gl11-*R(M^Lr{dlUSuC+RRw z2fpax=YZ=5edx*TfgU+(^VzK8Rtu+in#JJ5rJj6zdH}t4U-*MZpY-Ohcr|g}pq^ZF zuJ7C0IbFr!5NEG^HT3T(-_to=<cw09lG2ddweLLAL`r3E6)A@ zIMCoe@tqbu^NVgz@$R~Nqo&%pc_hb^2hAO~IGz>fe)PSI*N0rc4}&utwEMXSwC4jJ zTJn)bcbZ0C((g?C)8mOtjpso487#H!yn#A~tou+P78cuF@; za7GvH-s^{_`o`~f0}b}o^4APx|zeR`bIRH07Ifn)P4? z;^K>wS907@yy9u(rTiQ0xleLwzkzmIal0RSw5E#=J$TorGkfm`-0G;Q7d_$>Exh!*dwLab50`yCrQd${;8Gcf ze8!zmpSD(ye)aT5mwi8RYN=sQ4}Rjsx-077ZMOLMhvx*}^XKreE;Z?becyTn`pe{aKVtAkzUdeMVmL^%N-f44=506}X@;&oO49KaE_~hE74KJT~ z)B$^XareaN-`w=1HjnV&=DG8Hy{*Bw@_W!{Ie5*GK7R}7mM5Pkz0q3EJ=SJr?aa5S zcRJO#rbP{B#rRh6iqkv)+*5iz#h2%fi_w>FkUnShsExzBwL2kRUEYYNmp}cjph1n^ z#oj=}Ywh^d67P&=I{2&}PXL#*H-lQ<;}rjHct6nJ&$*v{8rAqPh<_gRaD%(Z6Z`H# z9?(w1JwWT{L4EOb>G=k{W^1jESa|)ngoiZA#bNf%#GH6tef?YWTAZJH?jxNy$nnF4 z8<#t4uJYU~Yv=r;$Mc5IgM0YeM{~e=11|OGz@;a3@zE)t798|>rvV?hhvMv|g%|Q~ z;DfuvUr)8^v#+kT`TQE};S}phlbZD4lzW47I%xHGRDOOt`!wJdPnTZJT7COw`8+gR z8mxWC^7*JIJofQaAD=shhwnG2?M}$$0jMSS-9RTlXx5AU4+GwEoZ+FyBBgQxAV^jpNIJyP0_2z`r*G9yMqcC+Gd(e)=2Vw`(87ivt|a)x1IP_Gxsl z@=^|M`tfwGf9o4)tFN2!6#j59f*1!9RQ!QGdxV)mR??#_DsO7vFzTMh=p@|Q;^~*>7 zh*PKfzqU3z5bs=n{H3XT%m*=Y^HMAxXYQW;?h_90v^jJC#L_Fqo$#}-C-rdK*SDwI z@$*V<{o>|pz0oF*zj(yq^rJ;SEzUgCVkWrs;%TO0d4Urjo_n=6(>H^@Uk0;P!}A6? z=IES8XYPZ#^xi;+*_glDa@;N6(B^xP=g#5K8%}#426ur@IrPzFzGg;~SX^S%!Xb_Z z-g)AnX&qE=~DaWz{|cF zedv>4@rczk-`t_E15R=3dy3_wIjUg>V)We1U(ZS%dhC_MqZ`!Lhj+DJYjS3W&h_V9 zA7;z98`KB9&@7#|Pd6Xr+oSyk`*hO}a$djV(l1Zk3%-7Ttj!P?jdK6_cyF$>)H6?R zP!ISk#}jv6<2NHQYX5t{(Ja+e&l#Q8d{I*kdHLJB+~30u&UxvM@jwg?5JwY#Z_uwj zF+9M_Kl$QtiN$4K9R0M}oEhkScD@aw6&#Rt0F0sDYA?)LjW%z}sJhSSsC zP#YH=_PT5Goc(=}t1hTRn>uvSOZyG-X_lv!I^9Y7dDq{>Pg{!@heyx8-*Rtj-_-yA zr!TeTJ`XPgEdn+&JFzJ9Y1jKQobJa?fv#(aoguJ4bJHOui-xfO>*^4lRUA18|a|HyE)*K zhf^H?JjJ}8nHpj}yX$h^4{GsRU*^eE^TK1#6KK?TKIz#$9rWD53tY6SqXwTmn+aXz zHAiQBq8sQ;gF4THK5^m4Cyo}d=ZBk~8`RKC=icQzw{B+E{?3Twy>qo&JJ%oXYWMx~ z+x?=S9{hO4+r#TU{->>-@lg+E!UKHzcQ1Hujn{p2N9gH0%5xqCvZc)Z;WoN9?z+d0qd$x;8$;lBsx_-Js3=f_aK z+V^<>z9+x!@uR;3*7)TD57fl($!~gZz?*MstLfVmOSgFXXrN0ib=0^)Jio;`Z%$^* zPyE0a{)=7vo$VdgZHY-u@o&7%zT(x)*-p#M{R~6K*`8 zhCKJY;oYF7d~+8g-``F#c;xa|UuxDTKjhJSgF52*NryA2KeLcaFFteCvtIb(*$h8# zjmN(M;;rS-B!@=6Tlel8!pLpJ=qX+N!c%u&f|ZC_PgJ5aqtU=J8=U~;>AZt znsD(67eCVIU2Hyx;RDU?migF|k6XNby!Q2<_wx7v_~rV0!7EzjH*XqzFZ^zXJj3VS zSnClNe(!jk)9^B=pFZ3)I^!en#oD8lcX|Tv>ibUAHUm#*8M=w09X!lh1{@z|%ynqO+#!!OVL^k-gb;}lOT zU%Z?7_rbZ^_Vq6Z7md|WA0O>v`FI09?|hQ0zF6FzPXj%;c$eOPZ%qT8H>hIdzu3de9fS{q8~kr1;q`1*x3zdaSgVc8Ilr8NpFLcjpnkmNn~8Y(cwiRJ?D5B3+*vjB zPrq}T)D|z#ntz_odE-g{4dTVgr$el7LX5rcpO`-%`~IfTpa!0Jd3A$*--tU(TOQ-U zcZ2@j12OXOxsx=Aq2UJiL7sQLtLItm|7@)X`Ml%{-8ZN!-r4^eJ`Zwzb9i}?U;LNv zy}v8BH9zdR6XNOf4tQy`Zw}VH(a-ZhBTm}IycwPbf5-LeM~m;*J`H~2{M>>68r0?$ zPx0&P26x;(O?tLZM|0FWf8AgG(kv%kVsY|Jj(xr3basQDXs~CN@b2+0hDK)}2ONFl zeCC5aUZ^dXA7YBLN9TWrzYS(h1HV2E^fgDZ?hOypXN}8y`Shv}Jni1`nGbrx-7IjV zk5>D<@biwJCb{bH>+@sn*}ZXQ%@4ZiRZG4-z@s1M_==}fO?+Z#j~5RwyI<;9`=;H& z=F{I^XL8&vdFt!WEYx%#o40+n)Knk%AzvNwH;D6|m#_au(#+d>GtYXY&E0g4n>OCd zNmu%veHifY$9uids23V|W#1h1g6jqv)s^q(>3*uOC%W=T?)w3kUiqO0E;Z`i8D3o0 z{T-5bLwbH}joZ1oiB;1YZyMZdeegn$c+JqhIQjO(@V@%DwH!6{q`o*YzHw*vyql4C zoa*xTWx(wnH~+kUd_2{$uUGsyyz>Lp^6fQS-1dJCJeQB#T5WzhSC=k5-hkiy`A>s) zxnjigL~VWg+lxyqZ*X`AIld?NN~}5HvPUDnUyn7dW}%1IF|^VkSFbdC$M0@BSNjHM zxYgn@@5Itew{!e*Xq9L7&hp&3T5{ymf)DNi+_dUToL=P7V~#iEo%;B@+v@6@zv6FD z!}@On&v4Od-`@vMJodf~`0S}qqj>t#?#Tyz;8pL2G}S8}F=FvGuLNsSkRb%W)^vmg}5H&5|Fuy^Foa8o&N{ZC>8xyZ1LVOTF>H48*@3^y2;f zAnwCJ4==@w!6y!<8oc;8@XlJS-qP1y;8%ANH_i0tBj42Z)U&5Jb=BdiCl7dAy}T5c zF1+IOVr>rkr;p!x@_P1fwofztdh>m%N54FE{Par84YaGPh8*0!Z#lT}=|K(-nrRV( z`^R8@=B%FDa@2B;&)nsxhX>qXTJuq`lnSL`(i!u@ySzt8ml2* zUHCrm4Q^0dPk#KMK`t))`u9vXO?1%dUWrpruQc=UX~1hO{swV!=vPC1_o(m3nOUpz zWe`U{AMxpt4u3b~-5{Q3=kJFb_~Bf>8Z_YiI{2xL7x0Op(LK&fv+}MsFTBea&v!FX zmp6Ex2Oju$M4p-RTp#$=R0E%9b?w`GJy*4EaAxM};gmy*Sarq8zXtg? z;KEIFJ^t8QJ|FyDz%5s-XMQ_VKd6sO4DbyHf4tM1PCbjK#~j50U1ldo4DI@{k6SJE z<>*fhy70&`SNXixk3Ou$>+uF0YX5z(&r`a(ufHGfW~7!n&i^^cqZ7ApRb6}T%MJBF z`}aYue4|UOKIl{%57-0eY60$MNINaO$anEK*w;JVe4<-T{lq0lpZI8W?v6R9BW`Q+ zR}Vk^Jl3BW`f#Y>>01DNYW&wAhVSOBH+g+eV(tO{IBVW&@|14=(1+`W=RqAj#nbj_ zxWQUHAN>3cGT*-q&Tw0c!Q)&k-D>_ZxF`19RdrtmI_$|4cf;p_&w5O+T)p$pK8~LD z)uTcGIQ1>}UjvW&=}p~_1KsqQ8xDM+w!Y~Sk4HUg-0qEfbUMRvgPJtpbqDyoS9qGppLaXHFyL#>F~sn$G0^-&gkQ@9`K6g9lkumWo=$^v$qF$e9kH_ei~bR6~q>dt$#0KL;9}%T*7|)g9G0o*VT1Jjka} zE=^!9o>pi0^v@&lwEBDD-vMW0X`mm!cTe}oJ`L5i)}vf}fEy=$a^+d;$y5LOwWdj| zIQ`SdYx~}P1LCTGTk~H%GpDycaOhVrAV(cseC*!PL$}_|TpT`qsO|nbZLyvo2erkyYxLr{L497xrBz(yMB0$?@Hb$Dy~s56EsKIz9f?{U{VFPeq^oqZa_ z$pN+K;4v;5%)z@F>X`#C-A^%m>d7xW;?>Y2&EoCrM~`a18*qxd!5)5hoCZDU8NVK# zS&MfrE>G>NpoXVe zIoBT^x%O$&w|t!P`I$$~X~YA1Q;#ol#N)*u=liX3*t`~7*Hho}y{jpf22VZEsy6+eH#igP>;|(}+sr-Vand`FDvI`r#vOwBt8_TJ-4MxihhN)ck+Ds@I)Lk|PMf z;&$Kwv-`s@5d5<2^$ak~&6Z`}|E(O~szXA1q*PZ|Wky6sRs#+i-4nImX;P;j`TT~F z1`N;ni(BpHVBZ~BzTW77EoZ)a>LJII78>QNcdlO^O($Q@4SEFK&g4zEe0Rs4&;vZ{ zhsJu=({n>DoZDj!?`K0jOy3k8wCj65s-qECj_@vD&SS%Uzi8k$bHAI0Z+buH>ip!L z8hAb(Pq{QZgG*nIr@Kj`8PUf(_XM85OY+t7K(F$4-#qQpsKy!=9zDb8;X2;Np32sG-rB`)yvlcfZX82W{?d+3~(bg1*UfdBB|(*R%J_%|o-JmQsJ#WY*1<2#&bf~U?5`C^UV z+8G~d+x*qR(id)go_bfSFL%K#%sCAj^s>7tkAHCVY>mV7qvx>j>xX9fxCBplC*Y=` zKfIoTcet$eB9~tKFywB}xpy3TIX7_b?(rLr{_*K;x@p7%mu7bij)0*z=brZTjQ_p? zp9Xt8;uRcqG^JtB+{}bFHO}qt&ZKMH&S@Rb^47mISUk1XgMQpM{lkRg9iMr~vnP)> zcg6eq{oXZ9{qYEf;FaEdS9J28KJ`3;!G~|hJ05!JaISV9r)#-z?9BswFk$%)4LSt337#5IHS>wJ-x$JkISB18tAu=2e#ZC zVP76@--Vv&^Z~hsm3`xPule7dy*qy-ZgO3 zM$hK3zU1>p|MKv`H#`2o)UQ793n$_*DZbtf7qh2l@@_8zFgm?YowXcpAxwPuR zdV4&i>(r31Z*x#T&Ag#YJq_|N8t%J2`OejPm;cs~>)ua;UUTg2TeUZxJQVQ!VD0Zw zy0))JHG05v-B6zf&2l!^%~X%pW-eF2=HuqJ8vE9Ibf0K9gU5z^ed2-VZaRm@e}35) z{Jm-1HquZ_n|A@5H}=h&w$}y>Ki>K2SB`zX`sv@@F-zQXanVd0P41zZuZ{J3*|og! z(W%#+pSz~X-tH-WbLL?h!^Qj5!0qXsPP$;oqXQN%Xpu)FFZJ-BhI(uH_<6(|oMt1R z=k{R3F?+bqVewv$e)P{vTHHtV^rWE|bujSK?3_MY;hMok)eXWr7FcXvSzf4(*JEY#zq1CPKX-#+X#^r$C&s7u40be}&r)NQRd zb@J8mQw{HEpeqeEo;-u`bc8y3)X6nVe&}m6RI5jv(?~NcAs2=o=1!kI z@8$(dA2iYZzebKV-{sn;XWxTde7nQLqsKmOd+@CV4EpsiZ~a-*fNOoZ=jJCD-tytm znj_q0{qs)!=98|?!wmQa!&`uYb!jqb1S1GY2zb|3Mm$B9qBX>2yQzBPEl51Qf8 zYKHR+w$R__2CQM?rd=IA?{H|xqXy3Ww&tbT(m!r{wA)KVzMfBwG@R>24+5vT=v5!^ z)ZnE9j%OOXH}Y4bNBHN4T3X?%v&Q9a;;~OB4SY}o#~Exq_ILOA-dT=K1xxpX#IB=#R$Gze)etPl9)i<2Y!Bd!%C*SDs&Occ2;qC7cJb_OR zjq=?|y3{+fCl4fZ z{5+snpJr@NzcAL*ZP(7#n<2mC@Mm7j^^S*r=X}wZ9`VWHhbR4NVd)93JQ!;ANDodm zu;2>$e5chv809vd{lRxgLHH0Uy0z4<16E3}PAjh@Zc8lERS`Fu@d-d=Z& z&v$;=P)8pgxHNn60gmrQpXy;b*9(09of>H@2aYp&IOx{5dur+Qzn^zZ-F%G@TH%oZV@VYbb%t3$7_{eYG+tU|6aqva%&xU&E^63B7fKL-l8U#Fg z?FnAf2@9s#>up}}00%!jVbFz34lHYD`1G$IVNPaXPcA;a>j#%v$#G6UTs(qTd(!Og z;xPkvOdSr|<$3bO9v$9c!ZyDgYZ~m)Yes6*fG_w!qq)nW9~M4OfrD0mFVc_;%bvCG zR?rLUM}yDSyBF|y%TL}ogH0d(-r?y9j(YlNmy?EC_t+hCpY#GBo?3XrcfMJqYdG@F zPaeP3>K_*le4cXj19SS_Gi&^USF3e@c(j_2Yj^^OzWCs&#=Jc3=?S0N(TYnAp4HJ0 zOFnLV-g%~P`|e5__TdTM(j?qNz3d(gTMo}~(*g^IbNA7l)xhJo;Da3Zf_HN1dT7w2 zKYHl&j$=BV;n-8&yf&Y$eKYG5zM1Zh(n*`1@SYobbMEP9AGVp^H1tTrRRfQw9`q)c zrfHwnbWeYtyYF=4r)hfWFf;dDKEL6aVH$T0`|9N29G4t-Vc$M{z4J`|`1bb)k2{Q? zejZuF**Ak5-fA`%-tIm-zir^+8!Xy}sW*MVhUd&49#3K4z2Ki*>)l~Iu!fPYX?5-`i6ne{xri>>zucGny2t+5UaOVYX<6eE*Cz}Uyglu2%mj( zcK_2bA5Zge#wVO=X`=zQT0MH-9l9uhn{NX;heVrcI}LZ z^w8&w&qAMRm?1n^d#a%u=4R;b@0-&H9rKPh*u0q+w7^q?1C|;ywx^f-hJ4sG$`S6Y zZ)Lh^!9f>K++|$OhnNK{01A88(Yr5&=vD$fzKMfpwfTx~kw0>=pPRTKlxAwN@iP4SRCdn>{&V_m6fx zrU3`PHGX-#@`P!vj)yRD>CfEcn>(!aL9d!L=uj(%2ixbFv&RO0^}ZV(dD^pvDVJWH z>haHW8t}n##vi?y8BFKi^??hXeAqZ>qR+ct`0UP^VH)OuSG{u{sG&hF?9CGnY})AX z9pbobsJ&>YlS7v^o%`Ekj}E~vHD+*X;IU2vzVFJpzV&o&(Dkh`|8Sd^UVPVjuy@^n zXCJ5cG~~k2?`?xN`0lYDdBJ16>gCe9zjwaPn}&X1;giQR+CA;b;{klNeBd1py~y*V zVS9I7e`@H1CTB45!-Tils^O7y`11ASher?c(=coGZw)h3=icZ+jdwlh=e2=D{ygC) z59R8^T=1EnJB!EDJ6?0*UmD)^M6Z6->YZl%Y2a6jQ$PAO2Yp!kImeyjiNkE=>+hq# z{4+Nko|lbj(ziWY^rScW_-N*V*}+Z&w%@eq1(zD!w5x;12mM;xmnW=wN`rb>e{bkF z4fR_)Q;%2Zn+NLUd3xt3t$wuHm#-gu`lRu#@ui`^`RW{xbG7)a>DLo~EiA5s^J4X9JE`@pEq=Wo$51#NY7ak9$!+QGUtCz1gUheOKcOJ;6 zgHN zU90E$YP$Th?xIgUJJa9zVbVEHUf|F>&zvXBIo# z_oSY70bgHwpurl)eM2pM^6d%d@OCe0^j(>geO?M$Xnbk>-hi!tIXrx9sFgzp4mCo) z?`d;ZYmHMb47zvMoS73|^QF^wBo8M%b)Is}^P$008tlo#t>@ieeL2^gTz?;|aoFF? zZo8%zjvw#Vmv>yJ2LAOh99s4b>BB7LFPB#W=XC?GcY1j^pFQpK#Qf!_!57+hch%$L z$Mf;j7q57B*PzX}FHaw8-2>Xx>%p1^82ZKO8}Wqg?4q&n2ZlPHO`CVTw98Y&dwt-U zW?XdG_w$q|2bOa>=yk{Kn*~fEXS3!lUODu7`k9}4;ar_F{ou1_?M~2Q=KFsk&$+(O z4LP39`DkCPM_TmiT^&#KY9EJtV2*HTcNbvE(f9iCZCUeAFTNr5a(DvYcjAe|nHj^y zp9W0#2)@3)HuTF!+WD0RU+5C>cV-{A{+#ItJ}w;2;jMp9T5!pw-F@SsJZHPFIAGAg zZ;=KbeOS9c^2O1+@&=1L^Dk=Xt$>qI(V)> zy77C5bw1wpNjI%#w zt2cjl1s+}S(ojR|zJKqVv!{KUVc^!EHJ@QQqr)D5ox`x727hRB-?r!7+P$Pd4SHzi zp>Lfg+RZQxIJ}3=N8HP?FHcyfp+~yh|J}KCz4+9%|dT5?D_d7R?BN47v}o4x4%E0e5Q-WhX!A9nulKCSx=ArGe)_~`S_Cq2MZgF}sg zOA{Xcn5%aff>-Kz;g%((P#LGkH zxYL+kIW)lFm)<v-}+bYjNa{g!qJzt9KGYg0f#oeo6AK5o_sp=BnSU(1E=>i z(87}_KpXuj;d^yg>m9AeKHw`)J%^DsbV)9YPBzInldxx1$aHO}esbT+?WTbl__aGDK1 z8afp2fKpC5F{kqbwzd!%oi_S5kG+@Oy)w3v^YH0B*0>S%Y4(|v+Fe7W@S%iknt z{G*8;dH7(+;R{TmmWFvP*S@;xvc@gf-?4eJIXN2^Kj^bJztq8nNB`3(U*(W}3& z^C(@@yUh5n7ZNvYl>xOUfs&Q`kJ9XF4`)>_3bkPA%J>8z}x&GD2RnJp-a`b`Me0ZhC z4D7on>h;A>YkzCzk9wSGxP$6xQcDvr+yj_;rjZZc<)^`azD&D4{CuO!+||J00e*Yl z<-w8XiPxGw{rWq&zlG_V9y;Wzm+M?EPtt&CPmVijO*dY>@rhR7g?e+~4-EUhS3S`x zAC7(A$=4Ts&dk71|M<;^#`Pdi&@6DPGYfg1YWYq#&vDUX=Cr`_;~{_aBnKXBy7cE= zj=GzMeZ9MXaGmRgPJGVkF-yJ5b;eis!Wy?Tb#h_TsoveT2M4}9w7^WW5&?8Ko@IB$E5qg9z z2iCOkZ*|vQ)6MJEr)#-pCD)VJ%N#W0=i4(VSlTwIBl?nbUiKdX_RBl13J`=SKoB% z4X0Y?dZI`01FyYL4fZXB*dObI2gX#VDSnD7EzHR67VB?0#cRt|eiE|j<;nOSE zz2ODDYMlAe`tx|gnYTRIOkv^r(SQ%n_w1Y}FnlX|SI0w7xtj}Yed&olPkQ9?&b@%+ z4355O9Tq-0bWEEZIO_DdSvX(+u;tNV|DjW_zv;r42JPF|kA1afYt1{l(vSzo zyTA#XMt#B3o4-H9=Y@B8*3Q=(-7wu9Pg?2YC2VuTrv@HQ8gb!;xgOm){?Gu|zIob9 z1HQgsnwfVva@Cl-KF0s+!~T2M=JdT`pEk8>@c2!mnVHYWzrnA4*BiY8$GoK}4LNY} z=>MrfBdxIAEj2XyZNBzk+UL(lPt$jP$;D5r{_T01haPZw^3)oReAq(0GuXJCr}3%b z_qQWx70&rC^u?<*%me;rqc1(<(5t&fmtOclgIYPx@%yRE@$BPI?e^4NHGHpohv|p= z-1x2G{>!0*7Y_};H1O(y4z)O~`Qx1q^?DS%F;Dl;npXE)@80!*BS+AvCq2J6ysPKo z@a=D2_UVMhd;0dIYcoyPa^bpv@?qy#+jpIQ*o8UvTK7VLgpoogZFn=Xhwg)~|hBYJ{I0GlmIUo*KFMxjEA3+u0s{JX50==Xh=#FwBMbuyDfh{iwfhq=8fK z^VA+aFn5<=yJzcN&;EXR(qKmN@p*@Zm$o$I=@ss<%v8_v<-%6K@7z0nyzcMnJ>}87 ze6xV7*7=Xd?v*Dm;P5jI@6$;)o%?%8JH7VkQUlvJ0Uxiw1+>W#`l1)^yrBt)T5)R7 zCP%3Agb<hQAGI%zw2w1s?ay{CGEPnqkXKWXgy#lt(?>T$tUZ;j7>8fM`~2Ob{au&>5DERlwKeL2&Ip3Owa^{w+m9)246 jhkLU~*K*a+$_MYT=-`!E`F6a+agJAyY0yst&GP>b_dxRl diff --git a/settingsdir/eiger/standard/5400eV/noise.sn032 b/settingsdir/eiger/standard/5400eV/noise.sn032 deleted file mode 100644 index 196d6b714a226d8a35fed1910424f44f894acd62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048648 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ΝkF&+ej-s+^Yve|9niY@3eWD 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

L1^gJoZT?(nTAIdpMv^^WzfhFRew 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�cm6Ojqpru^BGhE>H&C&`_ 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


3A=P4Hltm0B|qhvj}~rCUCY=0M-q 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

XR}=QZ$9em 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

|2fuRA+#hVb#L|uqbb%kPciO|kn~r*I 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 z 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 B?V$hw diff --git a/settingsdir/eiger/standard/calibration.sn031 b/settingsdir/eiger/standard/calibration.sn031 deleted file mode 100644 index 1c934f729..000000000 --- a/settingsdir/eiger/standard/calibration.sn031 +++ /dev/null @@ -1,5 +0,0 @@ -3851.3 517.439 -3850.95 521.812 -3845.29 518.808 -3645.21 484.783 -410 \ No newline at end of file diff --git a/settingsdir/eiger/standard/calibration.sn032 b/settingsdir/eiger/standard/calibration.sn032 deleted file mode 100644 index 1c934f729..000000000 --- a/settingsdir/eiger/standard/calibration.sn032 +++ /dev/null @@ -1,5 +0,0 @@ -3851.3 517.439 -3850.95 521.812 -3845.29 518.808 -3645.21 484.783 -410 \ No newline at end of file diff --git a/settingsdir/eiger/standard/eigernoise.sn049 b/settingsdir/eiger/standard/eigernoise.sn049 deleted file mode 100644 index f2523eb94070c367dca3651417bbc68f568c73a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048648 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 zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= RV1NMz7+`<_1{nCqzz1u?5tIM` diff --git a/settingsdir/eiger/veryhighgain/calibration.sn031 b/settingsdir/eiger/veryhighgain/calibration.sn031 deleted file mode 100644 index 1c934f729..000000000 --- a/settingsdir/eiger/veryhighgain/calibration.sn031 +++ /dev/null @@ -1,5 +0,0 @@ -3851.3 517.439 -3850.95 521.812 -3845.29 518.808 -3645.21 484.783 -410 \ No newline at end of file diff --git a/settingsdir/eiger/veryhighgain/calibration.sn032 b/settingsdir/eiger/veryhighgain/calibration.sn032 deleted file mode 100644 index 1c934f729..000000000 --- a/settingsdir/eiger/veryhighgain/calibration.sn032 +++ /dev/null @@ -1,5 +0,0 @@ -3851.3 517.439 -3850.95 521.812 -3845.29 518.808 -3645.21 484.783 -410 \ No newline at end of file diff --git a/settingsdir/eiger/veryhighgain/noise.sn031 b/settingsdir/eiger/veryhighgain/noise.sn031 deleted file mode 100644 index 2daeaebb418040e6d73897ddffa2e7418183420e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048644 zcmeIuu?>Sj5Cp)Lu|Y`4H0FZb15Ho@We`#Xfs1g!zrF<0IccTc;F3v_ZA{K7`M#2M zPX1;8x|X_Y|2$i2-^Sj5Cp)Lu|Y`4H0FZb15Ho@We`#Xfs1g!zrF<0IccTc;F3v_ZA{K7`M#2M zPX1;8x|X_Y|2$i2-^izan>sD( zva9#l*LmGXzIz&d{N*|NHu754c3J0H9mWmu0|ppifB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= RV1NMz7+`<_1{nCqzz4v}5cvQA diff --git a/settingsdir/eiger/verylowgain/calibration.sn031 b/settingsdir/eiger/verylowgain/calibration.sn031 deleted file mode 100644 index 1c934f729..000000000 --- a/settingsdir/eiger/verylowgain/calibration.sn031 +++ /dev/null @@ -1,5 +0,0 @@ -3851.3 517.439 -3850.95 521.812 -3845.29 518.808 -3645.21 484.783 -410 \ No newline at end of file diff --git a/settingsdir/eiger/verylowgain/calibration.sn032 b/settingsdir/eiger/verylowgain/calibration.sn032 deleted file mode 100644 index 1c934f729..000000000 --- a/settingsdir/eiger/verylowgain/calibration.sn032 +++ /dev/null @@ -1,5 +0,0 @@ -3851.3 517.439 -3850.95 521.812 -3845.29 518.808 -3645.21 484.783 -410 \ No newline at end of file diff --git a/settingsdir/eiger/verylowgain/noise.sn031 b/settingsdir/eiger/verylowgain/noise.sn031 deleted file mode 100644 index 2daeaebb418040e6d73897ddffa2e7418183420e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048644 zcmeIuu?>Sj5Cp)Lu|Y`4H0FZb15Ho@We`#Xfs1g!zrF<0IccTc;F3v_ZA{K7`M#2M zPX1;8x|X_Y|2$i2-^Sj5Cp)Lu|Y`4H0FZb15Ho@We`#Xfs1g!zrF<0IccTc;F3v_ZA{K7`M#2M zPX1;8x|X_Y|2$i2-^&_MfI3PObdBp?7m6kHM<(5_-KndTHHtLnL_HAAWg^zKy(AwO!VER{L>7{D1)l7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ S1{h#~0R|XgfB^>nG4KJwcM$Oa diff --git a/settingsdir/mythen/fast/calibration.snxxx b/settingsdir/mythen/fast/calibration.snxxx deleted file mode 100755 index 326e7f501..000000000 --- a/settingsdir/mythen/fast/calibration.snxxx +++ /dev/null @@ -1 +0,0 @@ -800 10 diff --git a/settingsdir/mythen/fast/fast.cal b/settingsdir/mythen/fast/fast.cal deleted file mode 100755 index 1e0a97fbb..000000000 --- a/settingsdir/mythen/fast/fast.cal +++ /dev/null @@ -1 +0,0 @@ -829 9.3 diff --git a/settingsdir/mythen/fast/fast.trim b/settingsdir/mythen/fast/fast.trim deleted file mode 100755 index be2e8fa45..000000000 --- a/settingsdir/mythen/fast/fast.trim +++ /dev/null @@ -1,1296 +0,0 @@ -Vtrim 824 -Vthresh 560 -Rgsh1 200 -Rgsh2 300 -Rgpr 50 -Vcal 600 -outBuffEnable 0 -0 2 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 diff --git a/settingsdir/mythen/fast/noise.snxxx b/settingsdir/mythen/fast/noise.snxxx deleted file mode 100644 index fda6c5045..000000000 --- a/settingsdir/mythen/fast/noise.snxxx +++ /dev/null @@ -1,1296 +0,0 @@ -Vtrim 800 -Vthresh 700 -Rgsh1 200 -Rgsh2 300 -Rgpr 50 -Vcal 600 -outBuffEnable 0 -36 1 0 0 0 0 -13 1 0 0 0 0 -26 1 0 0 0 0 -17 1 0 0 0 0 -34 1 0 0 0 0 -22 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -34 1 0 0 0 0 -32 1 0 0 0 0 -27 1 0 0 0 0 -34 1 0 0 0 0 -24 1 0 0 0 0 -22 1 0 0 0 0 -18 1 0 0 0 0 -29 1 0 0 0 0 -57 1 0 0 0 0 -15 1 0 0 0 0 -31 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -22 1 0 0 0 0 -30 1 0 0 0 0 -19 1 0 0 0 0 -33 1 0 0 0 0 -43 1 0 0 0 0 -32 1 0 0 0 0 -31 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -14 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -29 1 0 0 0 0 -26 1 0 0 0 0 -28 1 0 0 0 0 -30 1 0 0 0 0 -25 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -33 1 0 0 0 0 -9 1 0 0 0 0 -30 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -31 1 0 0 0 0 -23 1 0 0 0 0 -27 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -35 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -34 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -42 1 0 0 0 0 -40 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -39 1 0 0 0 0 -34 1 0 0 0 0 -37 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -37 1 0 0 0 0 -28 1 0 0 0 0 -15 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -43 1 0 0 0 0 -25 1 0 0 0 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -29 1 0 0 0 0 -43 1 0 0 0 0 -40 1 0 0 0 0 -23 1 0 0 0 0 -20 1 0 0 0 0 -40 1 0 0 0 0 -26 1 0 0 0 0 -32 1 0 0 0 0 -33 1 0 0 0 0 -38 1 0 0 0 0 -44 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -46 1 0 0 0 0 -32 1 0 0 0 0 -44 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -32 1 0 0 0 0 -43 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -48 1 0 0 0 0 -19 1 0 0 0 0 -26 1 0 0 0 0 -42 1 0 0 0 0 -33 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -44 1 0 0 0 0 -21 1 0 0 0 0 -36 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -48 1 0 0 0 0 -30 1 0 0 0 0 -43 1 0 0 0 0 -16 1 0 0 0 0 -outBuffEnable 0 -30 1 0 0 0 0 -35 1 0 0 0 0 -30 1 0 0 0 0 -17 1 0 0 0 0 -21 1 0 0 0 0 -24 1 0 0 0 0 -10 1 0 0 0 0 -46 1 0 0 0 0 -27 1 0 0 0 0 -18 1 0 0 0 0 -43 1 0 0 0 0 -31 1 0 0 0 0 -19 1 0 0 0 0 -29 1 0 0 0 0 -40 1 0 0 0 0 -18 1 0 0 0 0 -35 1 0 0 0 0 -35 1 0 0 0 0 -19 1 0 0 0 0 -41 1 0 0 0 0 -29 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -22 1 0 0 0 0 -23 1 0 0 0 0 -37 1 0 0 0 0 -33 1 0 0 0 0 -25 1 0 0 0 0 -40 1 0 0 0 0 -35 1 0 0 0 0 -36 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -41 1 0 0 0 0 -33 1 0 0 0 0 -22 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -20 1 0 0 0 0 -41 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -27 1 0 0 0 0 -43 1 0 0 0 0 -18 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -22 1 0 0 0 0 -27 1 0 0 0 0 -39 1 0 0 0 0 -27 1 0 0 0 0 -23 1 0 0 0 0 -41 1 0 0 0 0 -21 1 0 0 0 0 -29 1 0 0 0 0 -20 1 0 0 0 0 -36 1 0 0 0 0 -35 1 0 0 0 0 -32 1 0 0 0 0 -23 1 0 0 0 0 -30 1 0 0 0 0 -42 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -38 1 0 0 0 0 -38 1 0 0 0 0 -30 1 0 0 0 0 -35 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -52 1 0 0 0 0 -38 1 0 0 0 0 -43 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -25 1 0 0 0 0 -32 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -42 1 0 0 0 0 -36 1 0 0 0 0 -30 1 0 0 0 0 -37 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -46 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -41 1 0 0 0 0 -39 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -28 1 0 0 0 0 -43 1 0 0 0 0 -43 1 0 0 0 0 -32 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -outBuffEnable 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -27 1 0 0 0 0 -19 1 0 0 0 0 -32 1 0 0 0 0 -40 1 0 0 0 0 -25 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -26 1 0 0 0 0 -22 1 0 0 0 0 -24 1 0 0 0 0 -24 1 0 0 0 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -35 1 0 0 0 0 -35 1 0 0 0 0 -36 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -24 1 0 0 0 0 -20 1 0 0 0 0 -28 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -15 1 0 0 0 0 -41 1 0 0 0 0 -44 1 0 0 0 0 -33 1 0 0 0 0 -21 1 0 0 0 0 -27 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -38 1 0 0 0 0 -28 1 0 0 0 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -35 1 0 0 0 0 -41 1 0 0 0 0 -16 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -25 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -42 1 0 0 0 0 -34 1 0 0 0 0 -36 1 0 0 0 0 -40 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -24 1 0 0 0 0 -41 1 0 0 0 0 -39 1 0 0 0 0 -32 1 0 0 0 0 -21 1 0 0 0 0 -34 1 0 0 0 0 -20 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -27 1 0 0 0 0 -35 1 0 0 0 0 -40 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -43 1 0 0 0 0 -34 1 0 0 0 0 -50 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -37 1 0 0 0 0 -42 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -35 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -44 1 0 0 0 0 -30 1 0 0 0 0 -39 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -25 1 0 0 0 0 -38 1 0 0 0 0 -41 1 0 0 0 0 -44 1 0 0 0 0 -39 1 0 0 0 0 -34 1 0 0 0 0 -45 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -39 1 0 0 0 0 -40 1 0 0 0 0 -44 1 0 0 0 0 -33 1 0 0 0 0 -42 1 0 0 0 0 -30 1 0 0 0 0 -25 1 0 0 0 0 -31 1 0 0 0 0 -39 1 0 0 0 0 -31 1 0 0 0 0 -44 1 0 0 0 0 -47 1 0 0 0 0 -outBuffEnable 0 -29 1 0 0 0 0 -40 1 0 0 0 0 -14 1 0 0 0 0 -14 1 0 0 0 0 -21 1 0 0 0 0 -26 1 0 0 0 0 -17 1 0 0 0 0 -20 1 0 0 0 0 -24 1 0 0 0 0 -22 1 0 0 0 0 -19 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -18 1 0 0 0 0 -34 1 0 0 0 0 -19 1 0 0 0 0 -10 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -23 1 0 0 0 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -45 1 0 0 0 0 -22 1 0 0 0 0 -21 1 0 0 0 0 -21 1 0 0 0 0 -20 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -21 1 0 0 0 0 -38 1 0 0 0 0 -24 1 0 0 0 0 -32 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -44 1 0 0 0 0 -43 1 0 0 0 0 -35 1 0 0 0 0 -16 1 0 0 0 0 -32 1 0 0 0 0 -40 1 0 0 0 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -37 1 0 0 0 0 -23 1 0 0 0 0 -38 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -46 1 0 0 0 0 -26 1 0 0 0 0 -27 1 0 0 0 0 -56 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -41 1 0 0 0 0 -31 1 0 0 0 0 -14 1 0 0 0 0 -27 1 0 0 0 0 -23 1 0 0 0 0 -22 1 0 0 0 0 -35 1 0 0 0 0 -27 1 0 0 0 0 -30 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -16 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -31 1 0 0 0 0 -35 1 0 0 0 0 -32 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -21 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -40 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -41 1 0 0 0 0 -36 1 0 0 0 0 -23 1 0 0 0 0 -28 1 0 0 0 0 -24 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -25 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -46 1 0 0 0 0 -40 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -41 1 0 0 0 0 -24 1 0 0 0 0 -24 1 0 0 0 0 -37 1 0 0 0 0 -42 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -26 1 0 0 0 0 -outBuffEnable 0 -25 1 0 0 0 0 -23 1 0 0 0 0 -39 1 0 0 0 0 -23 1 0 0 0 0 -36 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -23 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -17 1 0 0 0 0 -36 1 0 0 0 0 -19 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -36 1 0 0 0 0 -29 1 0 0 0 0 -9 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -42 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -22 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -38 1 0 0 0 0 -44 1 0 0 0 0 -23 1 0 0 0 0 -26 1 0 0 0 0 -25 1 0 0 0 0 -30 1 0 0 0 0 -21 1 0 0 0 0 -30 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -35 1 0 0 0 0 -24 1 0 0 0 0 -29 1 0 0 0 0 -44 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -29 1 0 0 0 0 -42 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -29 1 0 0 0 0 -34 1 0 0 0 0 -38 1 0 0 0 0 -18 1 0 0 0 0 -23 1 0 0 0 0 -52 1 0 0 0 0 -28 1 0 0 0 0 -23 1 0 0 0 0 -35 1 0 0 0 0 -24 1 0 0 0 0 -32 1 0 0 0 0 -32 1 0 0 0 0 -25 1 0 0 0 0 -21 1 0 0 0 0 -31 1 0 0 0 0 -39 1 0 0 0 0 -35 1 0 0 0 0 -32 1 0 0 0 0 -28 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -20 1 0 0 0 0 -36 1 0 0 0 0 -43 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -16 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -26 1 0 0 0 0 -39 1 0 0 0 0 -21 1 0 0 0 0 -36 1 0 0 0 0 -43 1 0 0 0 0 -46 1 0 0 0 0 -43 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -17 1 0 0 0 0 -19 1 0 0 0 0 -46 1 0 0 0 0 -38 1 0 0 0 0 -45 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -28 1 0 0 0 0 -28 1 0 0 0 0 -24 1 0 0 0 0 -50 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -29 1 0 0 0 0 -48 1 0 0 0 0 -44 1 0 0 0 0 -43 1 0 0 0 0 -28 1 0 0 0 0 -43 1 0 0 0 0 -34 1 0 0 0 0 -13 1 0 0 0 0 -41 1 0 0 0 0 -31 1 0 0 0 0 -24 1 0 0 0 0 -46 1 0 0 0 0 -24 1 0 0 0 0 -25 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -40 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -outBuffEnable 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -21 1 0 0 0 0 -24 1 0 0 0 0 -17 1 0 0 0 0 -39 1 0 0 0 0 -12 1 0 0 0 0 -33 1 0 0 0 0 -20 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -18 1 0 0 0 0 -26 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -31 1 0 0 0 0 -28 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -39 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -28 1 0 0 0 0 -16 1 0 0 0 0 -36 1 0 0 0 0 -34 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -52 1 0 0 0 0 -25 1 0 0 0 0 -23 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -33 1 0 0 0 0 -17 1 0 0 0 0 -32 1 0 0 0 0 -41 1 0 0 0 0 -17 1 0 0 0 0 -50 1 0 0 0 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -61 1 0 0 0 0 -38 1 0 0 0 0 -43 1 0 0 0 0 -33 1 0 0 0 0 -39 1 0 0 0 0 -36 1 0 0 0 0 -22 1 0 0 0 0 -25 1 0 0 0 0 -27 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -21 1 0 0 0 0 -34 1 0 0 0 0 -35 1 0 0 0 0 -42 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -24 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -33 1 0 0 0 0 -47 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -27 1 0 0 0 0 -45 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -32 1 0 0 0 0 -40 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -32 1 0 0 0 0 -37 1 0 0 0 0 -28 1 0 0 0 0 -37 1 0 0 0 0 -32 1 0 0 0 0 -41 1 0 0 0 0 -44 1 0 0 0 0 -36 1 0 0 0 0 -outBuffEnable 0 -20 1 0 0 0 0 -41 1 0 0 0 0 -27 1 0 0 0 0 -12 1 0 0 0 0 -32 1 0 0 0 0 -27 1 0 0 0 0 -18 1 0 0 0 0 -4 1 0 0 0 0 -27 1 0 0 0 0 -35 1 0 0 0 0 -26 1 0 0 0 0 -13 1 0 0 0 0 -30 1 0 0 0 0 -37 1 0 0 0 0 -18 1 0 0 0 0 -26 1 0 0 0 0 -20 1 0 0 0 0 -27 1 0 0 0 0 -15 1 0 0 0 0 -15 1 0 0 0 0 -33 1 0 0 0 0 -31 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -37 1 0 0 0 0 -30 1 0 0 0 0 -16 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -35 1 0 0 0 0 -16 1 0 0 0 0 -33 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -32 1 0 0 0 0 -33 1 0 0 0 0 -18 1 0 0 0 0 -20 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -41 1 0 0 0 0 -28 1 0 0 0 0 -27 1 0 0 0 0 -27 1 0 0 0 0 -16 1 0 0 0 0 -34 1 0 0 0 0 -30 1 0 0 0 0 -46 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -18 1 0 0 0 0 -34 1 0 0 0 0 -39 1 0 0 0 0 -29 1 0 0 0 0 -18 1 0 0 0 0 -47 1 0 0 0 0 -30 1 0 0 0 0 -15 1 0 0 0 0 -37 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -45 1 0 0 0 0 -33 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -23 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -21 1 0 0 0 0 -34 1 0 0 0 0 -34 1 0 0 0 0 -37 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -39 1 0 0 0 0 -41 1 0 0 0 0 -20 1 0 0 0 0 -26 1 0 0 0 0 -41 1 0 0 0 0 -21 1 0 0 0 0 -19 1 0 0 0 0 -39 1 0 0 0 0 -35 1 0 0 0 0 -30 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -20 1 0 0 0 0 -39 1 0 0 0 0 -36 1 0 0 0 0 -30 1 0 0 0 0 -46 1 0 0 0 0 -25 1 0 0 0 0 -16 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -31 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -22 1 0 0 0 0 -38 1 0 0 0 0 -24 1 0 0 0 0 -26 1 0 0 0 0 -29 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -26 1 0 0 0 0 -40 1 0 0 0 0 -43 1 0 0 0 0 -35 1 0 0 0 0 -28 1 0 0 0 0 -38 1 0 0 0 0 -9 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -38 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -28 1 0 0 0 0 -outBuffEnable 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -20 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -25 1 0 0 0 0 -36 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -25 1 0 0 0 0 -43 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -23 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -41 1 0 0 0 0 -39 1 0 0 0 0 -27 1 0 0 0 0 -32 1 0 0 0 0 -23 1 0 0 0 0 -29 1 0 0 0 0 -31 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -38 1 0 0 0 0 -20 1 0 0 0 0 -26 1 0 0 0 0 -20 1 0 0 0 0 -20 1 0 0 0 0 -35 1 0 0 0 0 -23 1 0 0 0 0 -31 1 0 0 0 0 -23 1 0 0 0 0 -34 1 0 0 0 0 -23 1 0 0 0 0 -25 1 0 0 0 0 -21 1 0 0 0 0 -35 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -19 1 0 0 0 0 -30 1 0 0 0 0 -38 1 0 0 0 0 -30 1 0 0 0 0 -32 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -31 1 0 0 0 0 -36 1 0 0 0 0 -32 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -37 1 0 0 0 0 -41 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -36 1 0 0 0 0 -42 1 0 0 0 0 -25 1 0 0 0 0 -41 1 0 0 0 0 -36 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -32 1 0 0 0 0 -15 1 0 0 0 0 -47 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -37 1 0 0 0 0 -31 1 0 0 0 0 -46 1 0 0 0 0 -29 1 0 0 0 0 -37 1 0 0 0 0 -19 1 0 0 0 0 -20 1 0 0 0 0 -47 1 0 0 0 0 -27 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -28 1 0 0 0 0 -46 1 0 0 0 0 -23 1 0 0 0 0 -30 1 0 0 0 0 -49 1 0 0 0 0 -28 1 0 0 0 0 -31 1 0 0 0 0 -41 1 0 0 0 0 -25 1 0 0 0 0 -14 1 0 0 0 0 -34 1 0 0 0 0 -41 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -22 1 0 0 0 0 -29 1 0 0 0 0 -17 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -outBuffEnable 0 -21 1 0 0 0 0 -13 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -37 1 0 0 0 0 -32 1 0 0 0 0 -18 1 0 0 0 0 -36 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -39 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -16 1 0 0 0 0 -23 1 0 0 0 0 -29 1 0 0 0 0 -40 1 0 0 0 0 -28 1 0 0 0 0 -34 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -17 1 0 0 0 0 -45 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -23 1 0 0 0 0 -24 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -22 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -20 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -49 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -38 1 0 0 0 0 -34 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -41 1 0 0 0 0 -31 1 0 0 0 0 -31 1 0 0 0 0 -25 1 0 0 0 0 -46 1 0 0 0 0 -48 1 0 0 0 0 -28 1 0 0 0 0 -44 1 0 0 0 0 -39 1 0 0 0 0 -35 1 0 0 0 0 -34 1 0 0 0 0 -24 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -19 1 0 0 0 0 -19 1 0 0 0 0 -30 1 0 0 0 0 -54 1 0 0 0 0 -19 1 0 0 0 0 -48 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -38 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -41 1 0 0 0 0 -42 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -52 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -53 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -44 1 0 0 0 0 -38 1 0 0 0 0 -34 1 0 0 0 0 -30 1 0 0 0 0 -25 1 0 0 0 0 -53 1 0 0 0 0 -37 1 0 0 0 0 -43 1 0 0 0 0 -40 1 0 0 0 0 -35 1 0 0 0 0 -38 1 0 0 0 0 -38 1 0 0 0 0 -45 1 0 0 0 0 -30 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -35 1 0 0 0 0 -outBuffEnable 0 -20 1 0 0 0 0 -20 1 0 0 0 0 -50 1 0 0 0 0 -28 1 0 0 0 0 -48 1 0 0 0 0 -28 1 0 0 0 0 -39 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -17 1 0 0 0 0 -26 1 0 0 0 0 -36 1 0 0 0 0 -24 1 0 0 0 0 -20 1 0 0 0 0 -25 1 0 0 0 0 -25 1 0 0 0 0 -19 1 0 0 0 0 -23 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -44 1 0 0 0 0 -30 1 0 0 0 0 -14 1 0 0 0 0 -45 1 0 0 0 0 -32 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -26 1 0 0 0 0 -27 1 0 0 0 0 -12 1 0 0 0 0 -24 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -39 1 0 0 0 0 -19 1 0 0 0 0 -27 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -14 1 0 0 0 0 -34 1 0 0 0 0 -44 1 0 0 0 0 -39 1 0 0 0 0 -32 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -46 1 0 0 0 0 -19 1 0 0 0 0 -24 1 0 0 0 0 -41 1 0 0 0 0 -35 1 0 0 0 0 -22 1 0 0 0 0 -24 1 0 0 0 0 -26 1 0 0 0 0 -40 1 0 0 0 0 -21 1 0 0 0 0 -26 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -38 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -27 1 0 0 0 0 -34 1 0 0 0 0 -40 1 0 0 0 0 -19 1 0 0 0 0 -29 1 0 0 0 0 -39 1 0 0 0 0 -19 1 0 0 0 0 -18 1 0 0 0 0 -19 1 0 0 0 0 -37 1 0 0 0 0 -43 1 0 0 0 0 -29 1 0 0 0 0 -46 1 0 0 0 0 -42 1 0 0 0 0 -24 1 0 0 0 0 -14 1 0 0 0 0 -41 1 0 0 0 0 -53 1 0 0 0 0 -42 1 0 0 0 0 -23 1 0 0 0 0 -45 1 0 0 0 0 -24 1 0 0 0 0 -38 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -21 1 0 0 0 0 -38 1 0 0 0 0 -29 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -33 1 0 0 0 0 -21 1 0 0 0 0 -40 1 0 0 0 0 -34 1 0 0 0 0 -21 1 0 0 0 0 -25 1 0 0 0 0 -54 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -19 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -21 1 0 0 0 0 -33 1 0 0 0 0 -25 1 0 0 0 0 diff --git a/settingsdir/mythen/highgain/calibration.snxxx b/settingsdir/mythen/highgain/calibration.snxxx deleted file mode 100755 index 326e7f501..000000000 --- a/settingsdir/mythen/highgain/calibration.snxxx +++ /dev/null @@ -1 +0,0 @@ -800 10 diff --git a/settingsdir/mythen/highgain/highgain.cal b/settingsdir/mythen/highgain/highgain.cal deleted file mode 100755 index b5f43f83a..000000000 --- a/settingsdir/mythen/highgain/highgain.cal +++ /dev/null @@ -1 +0,0 @@ -804 15.0 diff --git a/settingsdir/mythen/highgain/highgain.trim b/settingsdir/mythen/highgain/highgain.trim deleted file mode 100755 index b15219ff6..000000000 --- a/settingsdir/mythen/highgain/highgain.trim +++ /dev/null @@ -1,1296 +0,0 @@ -Vtrim 843 -Vthresh 770 -Rgsh1 400 -Rgsh2 260 -Rgpr 200 -Vcal 600 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 diff --git a/settingsdir/mythen/highgain/noise.snxxx b/settingsdir/mythen/highgain/noise.snxxx deleted file mode 100644 index 0b8de0d30..000000000 --- a/settingsdir/mythen/highgain/noise.snxxx +++ /dev/null @@ -1,1296 +0,0 @@ -Vtrim 800 -Vthresh 700 -Rgsh1 400 -Rgsh2 260 -Rgpr 200 -Vcal 600 -outBuffEnable 0 -36 1 0 0 0 0 -13 1 0 0 0 0 -26 1 0 0 0 0 -17 1 0 0 0 0 -34 1 0 0 0 0 -22 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -34 1 0 0 0 0 -32 1 0 0 0 0 -27 1 0 0 0 0 -34 1 0 0 0 0 -24 1 0 0 0 0 -22 1 0 0 0 0 -18 1 0 0 0 0 -29 1 0 0 0 0 -57 1 0 0 0 0 -15 1 0 0 0 0 -31 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -22 1 0 0 0 0 -30 1 0 0 0 0 -19 1 0 0 0 0 -33 1 0 0 0 0 -43 1 0 0 0 0 -32 1 0 0 0 0 -31 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -14 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -29 1 0 0 0 0 -26 1 0 0 0 0 -28 1 0 0 0 0 -30 1 0 0 0 0 -25 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -33 1 0 0 0 0 -9 1 0 0 0 0 -30 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -31 1 0 0 0 0 -23 1 0 0 0 0 -27 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -35 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -34 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -42 1 0 0 0 0 -40 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -39 1 0 0 0 0 -34 1 0 0 0 0 -37 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -37 1 0 0 0 0 -28 1 0 0 0 0 -15 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -43 1 0 0 0 0 -25 1 0 0 0 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -29 1 0 0 0 0 -43 1 0 0 0 0 -40 1 0 0 0 0 -23 1 0 0 0 0 -20 1 0 0 0 0 -40 1 0 0 0 0 -26 1 0 0 0 0 -32 1 0 0 0 0 -33 1 0 0 0 0 -38 1 0 0 0 0 -44 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -46 1 0 0 0 0 -32 1 0 0 0 0 -44 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -32 1 0 0 0 0 -43 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -48 1 0 0 0 0 -19 1 0 0 0 0 -26 1 0 0 0 0 -42 1 0 0 0 0 -33 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -44 1 0 0 0 0 -21 1 0 0 0 0 -36 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -48 1 0 0 0 0 -30 1 0 0 0 0 -43 1 0 0 0 0 -16 1 0 0 0 0 -outBuffEnable 0 -30 1 0 0 0 0 -35 1 0 0 0 0 -30 1 0 0 0 0 -17 1 0 0 0 0 -21 1 0 0 0 0 -24 1 0 0 0 0 -10 1 0 0 0 0 -46 1 0 0 0 0 -27 1 0 0 0 0 -18 1 0 0 0 0 -43 1 0 0 0 0 -31 1 0 0 0 0 -19 1 0 0 0 0 -29 1 0 0 0 0 -40 1 0 0 0 0 -18 1 0 0 0 0 -35 1 0 0 0 0 -35 1 0 0 0 0 -19 1 0 0 0 0 -41 1 0 0 0 0 -29 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -22 1 0 0 0 0 -23 1 0 0 0 0 -37 1 0 0 0 0 -33 1 0 0 0 0 -25 1 0 0 0 0 -40 1 0 0 0 0 -35 1 0 0 0 0 -36 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -41 1 0 0 0 0 -33 1 0 0 0 0 -22 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -20 1 0 0 0 0 -41 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -27 1 0 0 0 0 -43 1 0 0 0 0 -18 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -22 1 0 0 0 0 -27 1 0 0 0 0 -39 1 0 0 0 0 -27 1 0 0 0 0 -23 1 0 0 0 0 -41 1 0 0 0 0 -21 1 0 0 0 0 -29 1 0 0 0 0 -20 1 0 0 0 0 -36 1 0 0 0 0 -35 1 0 0 0 0 -32 1 0 0 0 0 -23 1 0 0 0 0 -30 1 0 0 0 0 -42 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -38 1 0 0 0 0 -38 1 0 0 0 0 -30 1 0 0 0 0 -35 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -52 1 0 0 0 0 -38 1 0 0 0 0 -43 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -25 1 0 0 0 0 -32 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -42 1 0 0 0 0 -36 1 0 0 0 0 -30 1 0 0 0 0 -37 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -46 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -41 1 0 0 0 0 -39 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -28 1 0 0 0 0 -43 1 0 0 0 0 -43 1 0 0 0 0 -32 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -outBuffEnable 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -27 1 0 0 0 0 -19 1 0 0 0 0 -32 1 0 0 0 0 -40 1 0 0 0 0 -25 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -26 1 0 0 0 0 -22 1 0 0 0 0 -24 1 0 0 0 0 -24 1 0 0 0 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -35 1 0 0 0 0 -35 1 0 0 0 0 -36 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -24 1 0 0 0 0 -20 1 0 0 0 0 -28 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -15 1 0 0 0 0 -41 1 0 0 0 0 -44 1 0 0 0 0 -33 1 0 0 0 0 -21 1 0 0 0 0 -27 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -38 1 0 0 0 0 -28 1 0 0 0 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -35 1 0 0 0 0 -41 1 0 0 0 0 -16 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -25 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -42 1 0 0 0 0 -34 1 0 0 0 0 -36 1 0 0 0 0 -40 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -24 1 0 0 0 0 -41 1 0 0 0 0 -39 1 0 0 0 0 -32 1 0 0 0 0 -21 1 0 0 0 0 -34 1 0 0 0 0 -20 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -27 1 0 0 0 0 -35 1 0 0 0 0 -40 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -43 1 0 0 0 0 -34 1 0 0 0 0 -50 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -37 1 0 0 0 0 -42 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -35 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -44 1 0 0 0 0 -30 1 0 0 0 0 -39 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -25 1 0 0 0 0 -38 1 0 0 0 0 -41 1 0 0 0 0 -44 1 0 0 0 0 -39 1 0 0 0 0 -34 1 0 0 0 0 -45 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -39 1 0 0 0 0 -40 1 0 0 0 0 -44 1 0 0 0 0 -33 1 0 0 0 0 -42 1 0 0 0 0 -30 1 0 0 0 0 -25 1 0 0 0 0 -31 1 0 0 0 0 -39 1 0 0 0 0 -31 1 0 0 0 0 -44 1 0 0 0 0 -47 1 0 0 0 0 -outBuffEnable 0 -29 1 0 0 0 0 -40 1 0 0 0 0 -14 1 0 0 0 0 -14 1 0 0 0 0 -21 1 0 0 0 0 -26 1 0 0 0 0 -17 1 0 0 0 0 -20 1 0 0 0 0 -24 1 0 0 0 0 -22 1 0 0 0 0 -19 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -18 1 0 0 0 0 -34 1 0 0 0 0 -19 1 0 0 0 0 -10 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -23 1 0 0 0 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -45 1 0 0 0 0 -22 1 0 0 0 0 -21 1 0 0 0 0 -21 1 0 0 0 0 -20 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -21 1 0 0 0 0 -38 1 0 0 0 0 -24 1 0 0 0 0 -32 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -44 1 0 0 0 0 -43 1 0 0 0 0 -35 1 0 0 0 0 -16 1 0 0 0 0 -32 1 0 0 0 0 -40 1 0 0 0 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -37 1 0 0 0 0 -23 1 0 0 0 0 -38 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -46 1 0 0 0 0 -26 1 0 0 0 0 -27 1 0 0 0 0 -56 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -41 1 0 0 0 0 -31 1 0 0 0 0 -14 1 0 0 0 0 -27 1 0 0 0 0 -23 1 0 0 0 0 -22 1 0 0 0 0 -35 1 0 0 0 0 -27 1 0 0 0 0 -30 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -16 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -31 1 0 0 0 0 -35 1 0 0 0 0 -32 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -21 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -40 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -41 1 0 0 0 0 -36 1 0 0 0 0 -23 1 0 0 0 0 -28 1 0 0 0 0 -24 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -25 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -46 1 0 0 0 0 -40 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -24 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -41 1 0 0 0 0 -24 1 0 0 0 0 -24 1 0 0 0 0 -37 1 0 0 0 0 -42 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -26 1 0 0 0 0 -outBuffEnable 0 -25 1 0 0 0 0 -23 1 0 0 0 0 -39 1 0 0 0 0 -23 1 0 0 0 0 -36 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -23 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -17 1 0 0 0 0 -36 1 0 0 0 0 -19 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -36 1 0 0 0 0 -29 1 0 0 0 0 -9 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -42 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -22 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -38 1 0 0 0 0 -44 1 0 0 0 0 -23 1 0 0 0 0 -26 1 0 0 0 0 -25 1 0 0 0 0 -30 1 0 0 0 0 -21 1 0 0 0 0 -30 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -35 1 0 0 0 0 -24 1 0 0 0 0 -29 1 0 0 0 0 -44 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -29 1 0 0 0 0 -42 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -29 1 0 0 0 0 -34 1 0 0 0 0 -38 1 0 0 0 0 -18 1 0 0 0 0 -23 1 0 0 0 0 -52 1 0 0 0 0 -28 1 0 0 0 0 -23 1 0 0 0 0 -35 1 0 0 0 0 -24 1 0 0 0 0 -32 1 0 0 0 0 -32 1 0 0 0 0 -25 1 0 0 0 0 -21 1 0 0 0 0 -31 1 0 0 0 0 -39 1 0 0 0 0 -35 1 0 0 0 0 -32 1 0 0 0 0 -28 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -20 1 0 0 0 0 -36 1 0 0 0 0 -43 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -16 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -26 1 0 0 0 0 -39 1 0 0 0 0 -21 1 0 0 0 0 -36 1 0 0 0 0 -43 1 0 0 0 0 -46 1 0 0 0 0 -43 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -17 1 0 0 0 0 -19 1 0 0 0 0 -46 1 0 0 0 0 -38 1 0 0 0 0 -45 1 0 0 0 0 -25 1 0 0 0 0 -26 1 0 0 0 0 -28 1 0 0 0 0 -28 1 0 0 0 0 -24 1 0 0 0 0 -50 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -29 1 0 0 0 0 -48 1 0 0 0 0 -44 1 0 0 0 0 -43 1 0 0 0 0 -28 1 0 0 0 0 -43 1 0 0 0 0 -34 1 0 0 0 0 -13 1 0 0 0 0 -41 1 0 0 0 0 -31 1 0 0 0 0 -24 1 0 0 0 0 -46 1 0 0 0 0 -24 1 0 0 0 0 -25 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -40 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -outBuffEnable 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -21 1 0 0 0 0 -24 1 0 0 0 0 -17 1 0 0 0 0 -39 1 0 0 0 0 -12 1 0 0 0 0 -33 1 0 0 0 0 -20 1 0 0 0 0 -24 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -18 1 0 0 0 0 -26 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -31 1 0 0 0 0 -28 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -35 1 0 0 0 0 -27 1 0 0 0 0 -28 1 0 0 0 0 -39 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -28 1 0 0 0 0 -16 1 0 0 0 0 -36 1 0 0 0 0 -34 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -52 1 0 0 0 0 -25 1 0 0 0 0 -23 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -32 1 0 0 0 0 -33 1 0 0 0 0 -17 1 0 0 0 0 -32 1 0 0 0 0 -41 1 0 0 0 0 -17 1 0 0 0 0 -50 1 0 0 0 0 -25 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -61 1 0 0 0 0 -38 1 0 0 0 0 -43 1 0 0 0 0 -33 1 0 0 0 0 -39 1 0 0 0 0 -36 1 0 0 0 0 -22 1 0 0 0 0 -25 1 0 0 0 0 -27 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -21 1 0 0 0 0 -34 1 0 0 0 0 -35 1 0 0 0 0 -42 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -24 1 0 0 0 0 -30 1 0 0 0 0 -34 1 0 0 0 0 -34 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -27 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -33 1 0 0 0 0 -47 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -27 1 0 0 0 0 -45 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -30 1 0 0 0 0 -32 1 0 0 0 0 -40 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -32 1 0 0 0 0 -37 1 0 0 0 0 -28 1 0 0 0 0 -37 1 0 0 0 0 -32 1 0 0 0 0 -41 1 0 0 0 0 -44 1 0 0 0 0 -36 1 0 0 0 0 -outBuffEnable 0 -20 1 0 0 0 0 -41 1 0 0 0 0 -27 1 0 0 0 0 -12 1 0 0 0 0 -32 1 0 0 0 0 -27 1 0 0 0 0 -18 1 0 0 0 0 -4 1 0 0 0 0 -27 1 0 0 0 0 -35 1 0 0 0 0 -26 1 0 0 0 0 -13 1 0 0 0 0 -30 1 0 0 0 0 -37 1 0 0 0 0 -18 1 0 0 0 0 -26 1 0 0 0 0 -20 1 0 0 0 0 -27 1 0 0 0 0 -15 1 0 0 0 0 -15 1 0 0 0 0 -33 1 0 0 0 0 -31 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -37 1 0 0 0 0 -30 1 0 0 0 0 -16 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -35 1 0 0 0 0 -16 1 0 0 0 0 -33 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -32 1 0 0 0 0 -33 1 0 0 0 0 -18 1 0 0 0 0 -20 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -41 1 0 0 0 0 -28 1 0 0 0 0 -27 1 0 0 0 0 -27 1 0 0 0 0 -16 1 0 0 0 0 -34 1 0 0 0 0 -30 1 0 0 0 0 -46 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -18 1 0 0 0 0 -34 1 0 0 0 0 -39 1 0 0 0 0 -29 1 0 0 0 0 -18 1 0 0 0 0 -47 1 0 0 0 0 -30 1 0 0 0 0 -15 1 0 0 0 0 -37 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -45 1 0 0 0 0 -33 1 0 0 0 0 -29 1 0 0 0 0 -33 1 0 0 0 0 -23 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -21 1 0 0 0 0 -34 1 0 0 0 0 -34 1 0 0 0 0 -37 1 0 0 0 0 -31 1 0 0 0 0 -38 1 0 0 0 0 -33 1 0 0 0 0 -40 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -39 1 0 0 0 0 -41 1 0 0 0 0 -20 1 0 0 0 0 -26 1 0 0 0 0 -41 1 0 0 0 0 -21 1 0 0 0 0 -19 1 0 0 0 0 -39 1 0 0 0 0 -35 1 0 0 0 0 -30 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -20 1 0 0 0 0 -39 1 0 0 0 0 -36 1 0 0 0 0 -30 1 0 0 0 0 -46 1 0 0 0 0 -25 1 0 0 0 0 -16 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -31 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -22 1 0 0 0 0 -38 1 0 0 0 0 -24 1 0 0 0 0 -26 1 0 0 0 0 -29 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -26 1 0 0 0 0 -40 1 0 0 0 0 -43 1 0 0 0 0 -35 1 0 0 0 0 -28 1 0 0 0 0 -38 1 0 0 0 0 -9 1 0 0 0 0 -34 1 0 0 0 0 -25 1 0 0 0 0 -38 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -28 1 0 0 0 0 -outBuffEnable 0 -28 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -20 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -25 1 0 0 0 0 -36 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -25 1 0 0 0 0 -43 1 0 0 0 0 -28 1 0 0 0 0 -29 1 0 0 0 0 -23 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -30 1 0 0 0 0 -27 1 0 0 0 0 -41 1 0 0 0 0 -39 1 0 0 0 0 -27 1 0 0 0 0 -32 1 0 0 0 0 -23 1 0 0 0 0 -29 1 0 0 0 0 -31 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -38 1 0 0 0 0 -20 1 0 0 0 0 -26 1 0 0 0 0 -20 1 0 0 0 0 -20 1 0 0 0 0 -35 1 0 0 0 0 -23 1 0 0 0 0 -31 1 0 0 0 0 -23 1 0 0 0 0 -34 1 0 0 0 0 -23 1 0 0 0 0 -25 1 0 0 0 0 -21 1 0 0 0 0 -35 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -19 1 0 0 0 0 -30 1 0 0 0 0 -38 1 0 0 0 0 -30 1 0 0 0 0 -32 1 0 0 0 0 -24 1 0 0 0 0 -23 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -35 1 0 0 0 0 -29 1 0 0 0 0 -31 1 0 0 0 0 -36 1 0 0 0 0 -32 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -28 1 0 0 0 0 -37 1 0 0 0 0 -41 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -36 1 0 0 0 0 -42 1 0 0 0 0 -25 1 0 0 0 0 -41 1 0 0 0 0 -36 1 0 0 0 0 -26 1 0 0 0 0 -31 1 0 0 0 0 -22 1 0 0 0 0 -32 1 0 0 0 0 -15 1 0 0 0 0 -47 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -37 1 0 0 0 0 -31 1 0 0 0 0 -46 1 0 0 0 0 -29 1 0 0 0 0 -37 1 0 0 0 0 -19 1 0 0 0 0 -20 1 0 0 0 0 -47 1 0 0 0 0 -27 1 0 0 0 0 -19 1 0 0 0 0 -35 1 0 0 0 0 -28 1 0 0 0 0 -46 1 0 0 0 0 -23 1 0 0 0 0 -30 1 0 0 0 0 -49 1 0 0 0 0 -28 1 0 0 0 0 -31 1 0 0 0 0 -41 1 0 0 0 0 -25 1 0 0 0 0 -14 1 0 0 0 0 -34 1 0 0 0 0 -41 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -22 1 0 0 0 0 -29 1 0 0 0 0 -17 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -30 1 0 0 0 0 -outBuffEnable 0 -21 1 0 0 0 0 -13 1 0 0 0 0 -41 1 0 0 0 0 -23 1 0 0 0 0 -26 1 0 0 0 0 -34 1 0 0 0 0 -37 1 0 0 0 0 -32 1 0 0 0 0 -18 1 0 0 0 0 -36 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -34 1 0 0 0 0 -29 1 0 0 0 0 -29 1 0 0 0 0 -39 1 0 0 0 0 -27 1 0 0 0 0 -37 1 0 0 0 0 -30 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -30 1 0 0 0 0 -26 1 0 0 0 0 -30 1 0 0 0 0 -16 1 0 0 0 0 -23 1 0 0 0 0 -29 1 0 0 0 0 -40 1 0 0 0 0 -28 1 0 0 0 0 -34 1 0 0 0 0 -28 1 0 0 0 0 -22 1 0 0 0 0 -17 1 0 0 0 0 -45 1 0 0 0 0 -22 1 0 0 0 0 -26 1 0 0 0 0 -23 1 0 0 0 0 -24 1 0 0 0 0 -34 1 0 0 0 0 -26 1 0 0 0 0 -22 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -20 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -37 1 0 0 0 0 -34 1 0 0 0 0 -49 1 0 0 0 0 -27 1 0 0 0 0 -29 1 0 0 0 0 -38 1 0 0 0 0 -38 1 0 0 0 0 -34 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -41 1 0 0 0 0 -31 1 0 0 0 0 -31 1 0 0 0 0 -25 1 0 0 0 0 -46 1 0 0 0 0 -48 1 0 0 0 0 -28 1 0 0 0 0 -44 1 0 0 0 0 -39 1 0 0 0 0 -35 1 0 0 0 0 -34 1 0 0 0 0 -24 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -33 1 0 0 0 0 -19 1 0 0 0 0 -19 1 0 0 0 0 -30 1 0 0 0 0 -54 1 0 0 0 0 -19 1 0 0 0 0 -48 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -27 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -33 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -33 1 0 0 0 0 -38 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -41 1 0 0 0 0 -42 1 0 0 0 0 -31 1 0 0 0 0 -32 1 0 0 0 0 -38 1 0 0 0 0 -52 1 0 0 0 0 -33 1 0 0 0 0 -35 1 0 0 0 0 -53 1 0 0 0 0 -36 1 0 0 0 0 -21 1 0 0 0 0 -44 1 0 0 0 0 -38 1 0 0 0 0 -34 1 0 0 0 0 -30 1 0 0 0 0 -25 1 0 0 0 0 -53 1 0 0 0 0 -37 1 0 0 0 0 -43 1 0 0 0 0 -40 1 0 0 0 0 -35 1 0 0 0 0 -38 1 0 0 0 0 -38 1 0 0 0 0 -45 1 0 0 0 0 -30 1 0 0 0 0 -28 1 0 0 0 0 -26 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -33 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -35 1 0 0 0 0 -outBuffEnable 0 -20 1 0 0 0 0 -20 1 0 0 0 0 -50 1 0 0 0 0 -28 1 0 0 0 0 -48 1 0 0 0 0 -28 1 0 0 0 0 -39 1 0 0 0 0 -23 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -22 1 0 0 0 0 -31 1 0 0 0 0 -29 1 0 0 0 0 -30 1 0 0 0 0 -17 1 0 0 0 0 -26 1 0 0 0 0 -36 1 0 0 0 0 -24 1 0 0 0 0 -20 1 0 0 0 0 -25 1 0 0 0 0 -25 1 0 0 0 0 -19 1 0 0 0 0 -23 1 0 0 0 0 -36 1 0 0 0 0 -31 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -44 1 0 0 0 0 -30 1 0 0 0 0 -14 1 0 0 0 0 -45 1 0 0 0 0 -32 1 0 0 0 0 -25 1 0 0 0 0 -29 1 0 0 0 0 -35 1 0 0 0 0 -26 1 0 0 0 0 -27 1 0 0 0 0 -12 1 0 0 0 0 -24 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -25 1 0 0 0 0 -28 1 0 0 0 0 -36 1 0 0 0 0 -35 1 0 0 0 0 -33 1 0 0 0 0 -39 1 0 0 0 0 -19 1 0 0 0 0 -27 1 0 0 0 0 -24 1 0 0 0 0 -47 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -14 1 0 0 0 0 -34 1 0 0 0 0 -44 1 0 0 0 0 -39 1 0 0 0 0 -32 1 0 0 0 0 -32 1 0 0 0 0 -36 1 0 0 0 0 -26 1 0 0 0 0 -37 1 0 0 0 0 -46 1 0 0 0 0 -19 1 0 0 0 0 -24 1 0 0 0 0 -41 1 0 0 0 0 -35 1 0 0 0 0 -22 1 0 0 0 0 -24 1 0 0 0 0 -26 1 0 0 0 0 -40 1 0 0 0 0 -21 1 0 0 0 0 -26 1 0 0 0 0 -39 1 0 0 0 0 -28 1 0 0 0 0 -38 1 0 0 0 0 -29 1 0 0 0 0 -25 1 0 0 0 0 -27 1 0 0 0 0 -34 1 0 0 0 0 -40 1 0 0 0 0 -19 1 0 0 0 0 -29 1 0 0 0 0 -39 1 0 0 0 0 -19 1 0 0 0 0 -18 1 0 0 0 0 -19 1 0 0 0 0 -37 1 0 0 0 0 -43 1 0 0 0 0 -29 1 0 0 0 0 -46 1 0 0 0 0 -42 1 0 0 0 0 -24 1 0 0 0 0 -14 1 0 0 0 0 -41 1 0 0 0 0 -53 1 0 0 0 0 -42 1 0 0 0 0 -23 1 0 0 0 0 -45 1 0 0 0 0 -24 1 0 0 0 0 -38 1 0 0 0 0 -34 1 0 0 0 0 -31 1 0 0 0 0 -21 1 0 0 0 0 -38 1 0 0 0 0 -29 1 0 0 0 0 -36 1 0 0 0 0 -36 1 0 0 0 0 -37 1 0 0 0 0 -27 1 0 0 0 0 -31 1 0 0 0 0 -27 1 0 0 0 0 -33 1 0 0 0 0 -21 1 0 0 0 0 -40 1 0 0 0 0 -34 1 0 0 0 0 -21 1 0 0 0 0 -25 1 0 0 0 0 -54 1 0 0 0 0 -33 1 0 0 0 0 -26 1 0 0 0 0 -19 1 0 0 0 0 -33 1 0 0 0 0 -32 1 0 0 0 0 -26 1 0 0 0 0 -21 1 0 0 0 0 -33 1 0 0 0 0 -25 1 0 0 0 0 diff --git a/settingsdir/mythen/standard/calibration.snxxx b/settingsdir/mythen/standard/calibration.snxxx deleted file mode 100755 index 326e7f501..000000000 --- a/settingsdir/mythen/standard/calibration.snxxx +++ /dev/null @@ -1 +0,0 @@ -800 10 diff --git a/settingsdir/mythen/standard/noise.snxxx b/settingsdir/mythen/standard/noise.snxxx deleted file mode 100644 index 3cb00d1b9..000000000 --- a/settingsdir/mythen/standard/noise.snxxx +++ /dev/null @@ -1,1296 +0,0 @@ -Vtrim 824 -Vthresh 560 -Rgsh1 300 -Rgsh2 260 -Rgpr 100 -Vcal 600 -outBuffEnable 0 -0 2 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 diff --git a/settingsdir/mythen/standard/standard.cal b/settingsdir/mythen/standard/standard.cal deleted file mode 100755 index a7522a05a..000000000 --- a/settingsdir/mythen/standard/standard.cal +++ /dev/null @@ -1 +0,0 @@ -817 11.6 diff --git a/settingsdir/mythen/standard/standard.trim b/settingsdir/mythen/standard/standard.trim deleted file mode 100644 index f59047964..000000000 --- a/settingsdir/mythen/standard/standard.trim +++ /dev/null @@ -1,1296 +0,0 @@ -Vtrim 824 -Vthresh 560 -Rgsh1 300 -Rgsh2 260 -Rgpr 100 -Vcal 600 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -outBuffEnable 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 -0 1 0 0 0 0 diff --git a/slsDetectorCalibration/.gitignore b/slsDetectorCalibration/.gitignore deleted file mode 100644 index 5f41dcb88..000000000 --- a/slsDetectorCalibration/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.o -*.*~ diff --git a/slsDetectorCalibration/MovingStat.h b/slsDetectorCalibration/MovingStat.h deleted file mode 100755 index 35249b1c9..000000000 --- a/slsDetectorCalibration/MovingStat.h +++ /dev/null @@ -1,156 +0,0 @@ -#ifndef MOVINGSTAT_H -#define MOVINGSTAT_H - -#include - - -class MovingStat - { - - /** @short approximated moving average structure */ - public: - - - /** constructor - \param nn number of samples parameter to be used - */ - MovingStat(int nn=1000) : n(nn), m_n(0) {} - - /** - clears the moving average number of samples parameter, mean and standard deviation - */ - void Clear() - { - m_n = 0; - m_newM=0; - m_newM2=0; - } - - /** - clears the moving average number of samples parameter, mean and standard deviation - */ - void Set(double val, double rms=0, int m=-1) - { - if (m>=0) m_n = m; else m_n = n; - m_newM=val*m_n; - SetRMS(rms); - } - /** - clears the moving average number of samples parameter, mean and standard deviation - */ - void SetRMS(double rms) - { - if (rms<=0) { - m_newM2=m_newM*m_newM/n; - m_n=0; - } else { - if (m_n>0) - m_newM2=(m_n*rms*rms+m_newM*m_newM/m_n); - else { - m_newM2=(m_n*rms*rms+m_newM*m_newM/n); - m_n=0; - } - } - } - - /** sets number of samples parameter - \param i number of samples parameter to be set - */ - - int SetN(int i) {if (i>=1) n=i; return n;}; - - /** - gets number of samples parameter - \returns actual number of samples parameter - */ - int GetN() {return m_n;}; - - /** calculates the moving average i.e. adds if number of elements is lower than number of samples parameter, pushes otherwise - \param x value to calculate the moving average - */ - inline void Calc(double x) { - if (m_n 0) ? m_newM/m_n : 0.0; - } - - /** returns the squared mean, 0 if no elements are inside - \returns returns the squared average - */ - double M2() const - { - return ( (m_n > 1) ? m_newM2/m_n : 0.0 ); - } - - /** returns the variance, 0 if no elements are inside - \returns returns the variance - */ - inline double Variance() const - { - return ( (m_n > 1) ? (M2()-Mean()*Mean()) : 0.0 ); - } - - /** returns the standard deviation, 0 if no elements are inside - \returns returns the standard deviation - */ - inline double StandardDeviation() const - { - return ( (Variance() > 0) ? sqrt( Variance() ) : -1 ); - } - - private: - int n; /**< number of samples parameter */ - int m_n; /**< current number of elements */ - double m_newM; /**< accumulated average */ - double m_newM2; /**< accumulated squared average */ - }; -#endif diff --git a/slsDetectorCalibration/RunningStat.h b/slsDetectorCalibration/RunningStat.h deleted file mode 100755 index 1197ffc0f..000000000 --- a/slsDetectorCalibration/RunningStat.h +++ /dev/null @@ -1,55 +0,0 @@ - class RunningStat - { - public: - RunningStat() : m_n(0) {} - - void Clear() - { - m_n = 0; - } - - void Push(double x) - { - m_n++; - - // See Knuth TAOCP vol 2, 3rd edition, page 232 - if (m_n == 1) - { - m_oldM = m_newM = x; - m_oldS = 0.0; - } - else - { - m_newM = m_oldM + (x - m_oldM)/m_n; - m_newS = m_oldS + (x - m_oldM)*(x - m_newM); - - // set up for next iteration - m_oldM = m_newM; - m_oldS = m_newS; - } - } - - int NumDataValues() const - { - return m_n; - } - - double Mean() const - { - return (m_n > 0) ? m_newM : 0.0; - } - - double Variance() const - { - return ( (m_n > 1) ? m_newS/(m_n - 1) : 0.0 ); - } - - double StandardDeviation() const - { - return sqrt( Variance() ); - } - - private: - int m_n; - double m_oldM, m_newM, m_oldS, m_newS; - }; diff --git a/slsDetectorCalibration/analogDetector.h b/slsDetectorCalibration/analogDetector.h deleted file mode 100644 index 1b72e8e7f..000000000 --- a/slsDetectorCalibration/analogDetector.h +++ /dev/null @@ -1,1109 +0,0 @@ -#ifndef ANALOGDETECTOR_H -#define ANALOGDETECTOR_H - -//#include - -#include -#include "slsDetectorData.h" -#include "pedestalSubtraction.h" -#include "commonModeSubtraction.h" -#include "tiffIO.h" - - -#ifdef ROOTSPECTRUM -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -using namespace std; - -#ifndef FRAMEMODE_DEF -#define FRAMEMODE_DEF -/** -enum to define the flags of the data set, which are needed to seect the type of processing it should undergo: frame, pedestal, flat -*/ - enum frameMode { eFrame, ePedestal, eFlat }; -#endif - - -template class analogDetector { - - /** @short class to perform pedestal subtraction etc. for an analog detector */ - - public: - - - - /** - - Constructor (no error checking if datasize and offsets are compatible!) - \param d detector data structure to be used - if null it is assumed that the data are in ordered ip=iy*nx+ix - \param sign is the sign of the data - \param nped number of samples for pedestal averaging - \param cm common mode subtraction algorithm, if any. Defaults to NULL i.e. none - \param nnx detector size in x - must be specified if no data structure is defined, otherwise defaults to the size of the data structure. - \param nny detector size in y - must be specified if no data structure is defined, otherwise defaults to the size of the data structure. - \param gm pointer to tha gain map matrix - - - */ - - - analogDetector(slsDetectorData *d, int sign=1, - commonModeSubtraction *cm=NULL, int nped=1000, int nnx=-1, int nny=-1, double *gm=NULL) : det(d), nx(nnx), ny(nny), stat(NULL), cmSub(cm), iframe(-1), dataSign(sign), gmap(gm), id(0) { - - if (det) - det->getDetectorSize(nx,ny); - - stat=new pedestalSubtraction*[ny]; - for (int i=0; idet; - nx=orig->nx; - ny=orig->ny; - dataSign=orig->dataSign; - iframe=orig->iframe; - gmap=orig->gmap; - cmSub=orig->cmSub; - id=orig->id; - xmin=orig->xmin; - xmax=orig->xmax; - ymin=orig->ymin; - ymax=orig->ymax; - thr=orig->thr; - // nSigma=orig->nSigma; - fMode=orig->fMode; - myFile=orig->myFile; - fm=orig->fm; - - - stat=new pedestalSubtraction*[ny]; - for (int i=0; iSetNPedestals(); - //cout << nped << " " << orig->getPedestal(ix,iy) << orig->getPedestalRMS(ix,iy) << endl; - for (int iy=0; iygetPedestal(ix,iy),orig->getPedestalRMS(ix,iy),orig->GetNPedestals(ix,iy)); - } - } - image=new int[nx*ny]; -#ifdef ROOTSPECTRUM - hs=(TH2F*)(orig->hs)->Clone();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); -#ifdef ROOTCLUST - hs3=(TH2F*)(orig->hs3)->Clone();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); - hs5=(TH2F*)(orig->hs5)->Clone();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); - hs7=(TH2F*)(orig->hs7)->Clone();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); - hs9=(TH2F*)(orig->hs9)->Clone();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); -#endif -#endif - - } - - - /** - clone. Must be virtual! - \returns a clone of the original analog detector - */ - virtual analogDetector *Clone() { - return new analogDetector(this); - } - - /** - Gives an id to the structure. For debugging purposes in case of multithreading. - \param i is to be set - \returns current id - */ - int setId(int i){id=i; return id;}; - - /** - Returns id of the structure. For debugging purposes in case of multithreading. - \returns current id - */ - int getId() {return id; }; - /** - Returns data size of the detector data structure - \returns data size of the detector data structurein bytes - */ - int getDataSize(){return det->getDataSize();}; - /** - Returns data size of the detector image matrix - \param nnx reference to image size in x - \param nny reference to image size in y - \param nns reference to number of subpixels for interpolating detector, will always be 1 in this case - \returns number of pixels of the detector image - */ - virtual int getImageSize(int &nnx, int &nny, int &nns){nnx=nx; nny=ny; nns=1; return nx*ny;}; - /** - Returns data size of the detector image matrix - \param nnx reference to pixel size in x - \param nny reference to pixel size in y - \returns number of pixels of the detector image - */ - virtual int getDetectorSize(int &nnx, int &nny){nnx=nx; nny=ny; return nx*ny;}; - - /** - set gain map - \param gm pointer to gain map matrix to be set - NULL unsets - \returns pointer to current gain map - */ - double *setGainMap(double *gm) {gmap=gm; return gmap;}; - - /** - return gain map - \returns pointer to current gain map - */ - double *getGainMap() {return gmap;}; - /** - reads a 32 bit tiff file of the size of the detector and sets its values as gain map for the detector. If file does not exist returns NULL, but does not change gainmap compared to previous settings. - \param imgname complete name of the file containing the gain map data - \returns pointer to current gain map is file reading succeeded, NULL is file reading didn't work. - */ - double *readGainMap(const char * imgname) { - uint32 nnx, nny; - float *gm=ReadFromTiff( imgname, nny, nnx); - if (gm) { - if (gmap) delete [] gmap; - gmap=new double[nnx*nny]; - for (int ix=0; ixClear(); -#ifdef ROOTSPECTRUM - hs->Reset(); -#ifdef ROOTCLUST - hs3->Reset();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); - hs5->Reset();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); - hs7->Reset();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); - hs9->Reset();//new TH2F("hs","hs",(orig->hs)-getNbins,-500,9500,nx*ny,-0.5,nx*ny-0.5); -#endif -#endif - }; - - /** resets the commonModeSubtraction and increases the frame index */ - virtual void newFrame(){iframe++; if (cmSub) cmSub->newFrame();}; - - - /** sets the commonModeSubtraction algorithm to be used - \param cm commonModeSubtraction algorithm to be used (NULL unsets) - \returns pointer to the actual common mode subtraction algorithm - */ - commonModeSubtraction *setCommonModeSubtraction(commonModeSubtraction *cm) {cmSub=cm; return cmSub;}; -/** - gets the commonModeSubtraction algorithm to be used - \returns pointer to the actual common mode subtraction algorithm - */ - commonModeSubtraction *getCommonModeSubtraction() {return cmSub;}; - - - /** - sets the sign of the data - \param sign 1 means positive values for photons, -1 negative, 0 gets - \returns current sign for the data - */ - int setDataSign(int sign=0) {if (sign==1 || sign==-1) dataSign=sign; return dataSign;}; - - - /** - adds value to pedestal (and common mode) for the given pixel - \param val value to be added - \param ix pixel x coordinate - \param iy pixel y coordinate - \param cm 1 adds the value to common mod, 0 skips it. Defaults to 0. - not properly implemented - */ - virtual void addToPedestal(double val, int ix, int iy=0, int cm=0){ - if (ix>=0 && ix=0 && iy0) { - val-= getCommonMode(ix, iy); - } - stat[iy][ix].addToPedestal(val); - /* if (cmSub && cm>0) { */ - /* if (det) if (det->isGood(ix, iy)==0) return; */ - /* cmSub->addToCommonMode(val, ix, iy); */ - /* }; */ - }; - } - - double getCommonMode(int ix, int iy) { - if (cmSub) return cmSub->getCommonMode(ix, iy); - else return 0; - } - - - virtual void addToCommonMode(char *data){ - if (cmSub) { - for (int ix=xmin; ix0) - addToCommonMode(data, ix, iy); - } - } - //cout << "cm " << getCommonMode(0,0) << " " << getCommonMode(1,0) << endl; - } - } - virtual void addToCommonMode(char *data, int ix, int iy=0){ - if (cmSub) { - if (det) if (det->isGood(ix, iy)==0) return; - if (getNumpedestals(ix,iy)>0){ - cmSub->addToCommonMode(subtractPedestal(data,ix,iy,0), ix, iy); - // cout << ix << " " <=0 && ix=0 && iy0) - return stat[iy][ix].getPedestal()+getCommonMode(ix,iy); - else return stat[iy][ix].getPedestal(); - else return -1; - }; - - - /** - gets pedestal rms (i.e. noise) - \param ix pixel x coordinate - \param iy pixel y coordinate - \returns pedestal rms - */ - virtual double getPedestalRMS(int ix, int iy){ - if (ix>=0 && ix=0 && iy=0 && ix=0 && iy=0 && ix=0 && iy=0 && ix=0 && iySetBinContent(ix+1, iy+1,image[iy*nx+ix]); -#endif - } - } - ret=WriteToTiff(gm, imgname, ny, nx); - delete [] gm; -#ifdef ROOTSPECTRUM - char rootfn[10000]; - sprintf(rootfn,"%s.root",imgname); - TFile *f=new TFile(rootfn,"RECREATE"); - hs->Write("hs"); -#ifdef ROOTCLUST - hs3->Write("hs3"); - hs5->Write("hs5"); - hs7->Write("hs7"); - hs9->Write("hs9"); -#endif - hmap->Write("hmap"); - - - f->Close(); - delete f; - delete hmap; -#endif - return ret; - } -#ifdef ROOTSPECTRUM - TH2F *getSpectrum(){return hs;}; -#endif - /** - write 32bit tiff file containing the pedestals - \param imgname file name to be written - \returns NULL if file writing didn't succed, otherwise a pointer - */ - - virtual void *writePedestals(const char * imgname) { - float *gm=NULL; - void *ret; - gm=new float[nx*ny]; -#ifdef ROOTSPECTRUM - - TH2F *hmap=new TH2F("hmap","hmap",nx, -0.5,nx-0.5, ny, -0.5, ny-0.5); - -#endif - for (int ix=0; ixgetCommonMode(); */ - /* else */ - gm[iy*nx+ix]=stat[iy][ix].getPedestal(); -#ifdef ROOTSPECTRUM - hmap->SetBinContent(ix+1, iy+1,gm[iy*nx+ix]); -#endif - } - } - ret=WriteToTiff(gm, imgname, ny, nx); - delete [] gm; - -#ifdef ROOTSPECTRUM - char rootfn[10000]; - sprintf(rootfn,"%s.root",imgname); - TFile *f=new TFile(rootfn,"RECREATE"); - hs->Write("hs"); -#ifdef ROOTCLUST - hs3->Write("hs3"); - hs5->Write("hs5"); - hs7->Write("hs7"); - hs9->Write("hs9"); -#endif - hmap->Write("hmap"); - f->Close(); - delete f; - delete hmap; -#endif - return ret; - } - - /** - read 32bit tiff file containing the pedestals - \param imgname file name to be read - \returns 0 if file reading didn't succed, otherwise 1 - */ - int readPedestals(const char * imgname) { - uint32 nnx, nny; - float *gm=ReadFromTiff( imgname, nny, nnx); - if (nnx>nx) nnx=nx; - if (nny>ny) nny=ny; - - - - if (gm) { - for (int ix=0; ixnx) nnx=nx; - if (nny>ny) nny=ny; - - - - if (gm) { - for (int ix=0; ixnx) nnx=nx; - if (nny>ny) nny=ny; - if (gm) { - for (int ix=0; ix=0 && xmi<=nx) xmin=xmi; - if (xma>=0 && xma<=nx) xmax=xma; - if (xmax=0 && ymi<=ny) ymin=ymi; - if (yma>=0 && yma<=ny) ymax=yma; - if (ymax=0 && ix=0 && iygetValue(data, ix, iy); - else - val=((double*)data)[iy*nx+ix]; - - /* if (ix==10 && iy==10) */ - /* cout << ix << " " << iy << " " << val ; */ - /* if (ix==100 && iy==100) */ - /* cout << ix << " " << iy << " " << val; */ - addToPedestal(val,ix,iy); - /* if (ix==10 && iy==10) */ - /* cout <<" " << getPedestal(ix,iy)<< endl; */ - /* if (ix==100 && iy==100) */ - /* cout << " " << getPedestal(ix,iy)<< endl; */ - } - return ; - - }; - - - /** - Subtracts pedestal from the data array in the region of interest - \param data pointer to the data - \param val pointer where the pedestal subtracted data should be added. If NULL, the internal image is used - \returns pointer to the pedestal subtracted data - */ - // virtual int *subtractPedestal(char *data, int *val=NULL) { - - virtual int *subtractPedestal(char *data, int *val=NULL, int cm=0) { - - newFrame(); - - if (val==NULL) - val=image;//new double[nx*ny]; - - for (int ix=xmin; ix=0 && ix=0 && iygetValue(data, ix, iy)-getPedestal(ix,iy,cm))/g; - else - val= (((double*)data)[iy*nx+ix]-getPedestal(ix,iy))/g; - -#ifdef ROOTSPECTRUM - hs->Fill(val,(iy-ymin)*(xmax-xmin)+(ix-xmin)); -#ifdef ROOTCLUST - double v3=0,v5=0,v7=0,v9=0; - for (int iix=-4; iix<5; iix++) - for (int iiy=-4; iiy<5; iiy++) { - if (det) - val= (dataSign*det->getValue(data, ix+iix, iy+iiy)-getPedestal(ix+iix,iy+iiy,cm))/g; - else - val= (((double*)data)[(iy+iiy)*nx+ix+iix]-getPedestal(ix+iix,iy+iiy,cm))/g; - - if (iix>-4 && iiy>-4 && iix<4 && iiy<4) { - if (iix>-3 && iiy>-3 && iix<3 && iiy<3){ - if (iix>-2 && iiy>-2 && iix<2 && iiy<2){ - v3+=val; - } - v5+=val; - } - v7+=val; - } - v9+=val; - } - hs3->Fill(v3,(iy-ymin)*(xmax-xmin)+(ix-xmin)); - hs5->Fill(v5,(iy-ymin)*(xmax-xmin)+(ix-xmin)); - hs7->Fill(v7,(iy-ymin)*(xmax-xmin)+(ix-xmin)); - hs9->Fill(v9,(iy-ymin)*(xmax-xmin)+(ix-xmin)); - -#endif -#endif - return val; - } - }; - - - /** - sets threshold value for conversion into number of photons - \param t threshold to be set - \returns threshold value - */ - double setThreshold(double t){thr=t; return thr;}; - - /** - gets threshold value for conversion into number of photons - \returns threshold value - */ - double getThreshold(){return thr;}; - /** - converts the data into number of photons for the selected pixel - \param data pointer to the data - \param ix pixel x coordinate - \param iy pixel y coordinate - \returns converted number of photons. If no threshold is set, returns gain converted pedestal subtracted data. - */ - - virtual int getNPhotons(char *data, int ix, int iy=0) { - int nph=0; - double v; - if (ix>=0 && ix=0 && iyFill(v,(iy-ymin)*(xmax-xmin)+(ix-xmin)); */ -/* #endif */ - if (thr>0) { - v+=0.5*thr; - nph=v/thr; - if (nph>0) - return nph; - return 0; - } - return v; - } - return 0; - }; - - /** - converts the data into number of photons for all pixels - \param data pointer to the data - \param nph pointer where the photons should added. If NULL,the internal image is used - \returns pointer to array containing the number of photons - */ - int *getNPhotons(char *data, int *nph=NULL) { - - double val; - if (nph==NULL) - nph=image; - newFrame(); - - addToCommonMode(data); - - for (int ix=xmin; ixReset(); -#ifdef ROOTCLUST - - if (hs3) - hs3->Reset(); - if (hs5) - hs5->Reset(); - if (hs7) - hs7->Reset(); - if (hs9) - hs9->Reset(); -#endif - //cout << "done " << endl; -#endif - }; - - /** sets/gets number of samples for moving average pedestal calculation - \param i number of samples to be set (0 or negative gets) - \returns actual number of samples - */ - int SetNPedestals(int i=-1) { - int ix=0, iy=0; - if (i>0) - for (ix=0; ix=0 && ix=0 && iy=0 && ix=0 && iy *det; /**< slsDetectorData to be used */ - int nx; /**< Size of the detector in x direction */ - int ny; /**< Size of the detector in y direction */ - pedestalSubtraction **stat; /**< pedestalSubtraction class */ - commonModeSubtraction *cmSub;/**< commonModeSubtraction class */ - int dataSign; /**< sign of the data i.e. 1 if photon is positive, -1 if negative */ - int iframe; /**< frame number (not from file but incremented within the dataset every time newFrame is called */ - double *gmap; - int *image; - int id; - //int xmin, xmax, ymin, ymax; int xmin; /**< minimum x of the region of interest */ - int xmin; /**< minimum x of the region of interest */ - int xmax; /**< maximum x of the region of interest */ - int ymin;/**< minimum y of the region of interest */ - int ymax;/**< maximum y of the region of interest */ - double thr; /**< threshold to be used for conversion into number of photons */ - // int nSigma; /**< number of sigma to be used for conversion into number of photons if threshold is undefined */ - frameMode fMode; /**< current detector frame mode */ - FILE *myFile; /**< file pointer to write to */ -#ifdef ROOTSPECTRUM - TH2F *hs; -#ifdef ROOTCLUST - TH2F *hs3; - TH2F *hs5; - TH2F *hs7; - TH2F *hs9; -#endif -#endif - pthread_mutex_t *fm; -}; - -#endif diff --git a/slsDetectorCalibration/commonModeSubtraction.h b/slsDetectorCalibration/commonModeSubtraction.h deleted file mode 100644 index 0484e6746..000000000 --- a/slsDetectorCalibration/commonModeSubtraction.h +++ /dev/null @@ -1,82 +0,0 @@ -#ifndef COMMONMODESUBTRACTION_H -#define COMMONMODESUBTRACTION_H - -#include "MovingStat.h" - - - - -class commonModeSubtraction { - - /** @short class to calculate the common mode of the pedestals based on an approximated moving average*/ - - public: - - /** constructor - \param nn number of samples for the moving average to calculate the average common mode - \param iroi number of regions on which one can calculate the common mode separately. Defaults to 1 i.e. whole detector - - */ - commonModeSubtraction(int nn=1000, int iroi=1) : cmStat(NULL), cmPed(NULL), nCm(NULL), nROI(iroi) {cmStat=new MovingStat[nROI]; for (int i=0; i0) cmStat[i].Calc(cmPed[i]/nCm[i]); - nCm[i]=0; - cmPed[i]=0; - }}; - - /** adds the pixel to the sum of pedestals -- virtual func must be overloaded to define the regions of interest - \param val value to add - \param ix pixel x coordinate - \param iy pixel y coordinate - */ - virtual void addToCommonMode(double val, int ix=0, int iy=0) { - (void) ix; (void) iy; - - //if (isc>=0 && isc0) return cmPed[0]/nCm[0]-cmStat[0].Mean(); - return 0;}; - - - - - - protected: - MovingStat *cmStat; /** { - - - public: - mythen3_01_jctbData( int nch=64*3,int dr=24, int off=5): slsDetectorData(64*3,1,dr*8*nch,NULL,NULL,NULL), dynamicRange(dr), serialOffset(off), frameNumber(0), numberOfCounters(nch) {}; - - virtual void getPixel(int ip, int &x, int &y) {x=-1; y=-1;}; - - virtual short unsigned int getChannel(char *data, int ix, int iy=0) { - int ret=-1; - short unsigned int *val=mythen03_frame(data,dynamicRange,numberOfCounters,serialOffset); - if (ix>=0 && ix=0) frameNumber=f; return frameNumber; }; - virtual int setDynamicRange(int d=-1) {if (d>0 && d<=24) dynamicRange=d; return dynamicRange;}; - virtual int setSerialOffset(int d=-1) {if (d>=0) serialOffset=d; return serialOffset;}; - virtual int setNumberOfCounters(int d=-1) {if (d>=0) numberOfCounters=d; return numberOfCounters;}; - - - private: - - int dynamicRange; - int serialOffset; - int frameNumber; - int numberOfCounters; - - - - -}; - -#endif diff --git a/slsDetectorCalibration/dataStructures/Mythen3_02_jctbData.h b/slsDetectorCalibration/dataStructures/Mythen3_02_jctbData.h deleted file mode 100644 index 0dd991f56..000000000 --- a/slsDetectorCalibration/dataStructures/Mythen3_02_jctbData.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef MYTHEN302JCTBDATA_H -#define MYTHEN302JCTBDATA_H - - -#include "Mythen3_01_jctbData.h" -//class mythen3_02_jctbData : public slsDetectorData { -class mythen3_02_jctbData : public mythen3_01_jctbData { - - - public: - mythen3_02_jctbData( int nch=64*3,int dr=24, int off=5): mythen3_01_jctbData( nch,dr, off) - //slsDetectorData(64*3,1,dr*8*nch,NULL,NULL,NULL), dynamicRange(dr), serialOffset(off), frameNumber(0), numberOfCounters(nch) - {}; - - /* virtual void getPixel(int ip, int &x, int &y) {x=-1; y=-1;}; */ - - /* virtual short unsigned int getChannel(char *data, int ix, int iy=0) { */ - /* int ret=-1; */ - /* short unsigned int *val=mythen03_frame(data,dynamicRange,numberOfCounters,serialOffset); */ - /* if (ix>=0 && ix=0) frameNumber=f; return frameNumber; }; */ - /* virtual int setDynamicRange(int d=-1) {if (d>0 && d<=24) dynamicRange=d; return dynamicRange;}; */ - /* virtual int setSerialOffset(int d=-1) {if (d>=0) serialOffset=d; return serialOffset;}; */ - /* virtual int setNumberOfCounters(int d=-1) {if (d>=0) numberOfCounters=d; return numberOfCounters;}; */ - - - /* private: */ - - /* int dynamicRange; */ - /* int serialOffset; */ - /* int frameNumber; */ - /* int numberOfCounters; */ - - - - -}; - -#endif diff --git a/slsDetectorCalibration/dataStructures/adcSar2_jctbData.h b/slsDetectorCalibration/dataStructures/adcSar2_jctbData.h deleted file mode 100644 index 0b0665aaf..000000000 --- a/slsDetectorCalibration/dataStructures/adcSar2_jctbData.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef ADCSAR2_JCTBDATA_H -#define ADCSAR2_JCTBDATA_H - - -class adcSar2_jctbData : public slsDetectorData { - - - public: - adcSar2_jctbData(int nsamples=1000): slsDetectorData(nsamples,1,nsamples*8,NULL,NULL,NULL){}; - - virtual void getPixel(int ip, int &x, int &y) {x=ip/8; y=1;}; - - virtual short unsigned int getChannel(char *data, int ix, int iy=0) { - int adcvalue=0; - int vv1= *((int16_t*) (data+8*ix)); - int vv2= *((int16_t*) (data+8*ix+2)); - for (int jj=0;jj<8;jj++){ - adcvalue=adcvalue+ (((vv1>>(jj*2)) & 0x1)<<(jj)); - } - for (int jj=0;jj<4;jj++){ - adcvalue=adcvalue+ (((vv2>>(jj*2)) & 0x1)<<(jj+8)); - } - return adcvalue; - }; - - virtual int getFrameNumber(char *buff) {return frameNumber;}; - - virtual char *findNextFrame(char *data, int &ndata, int dsize) { - ndata=dsize; - return data; - } - - virtual char *readNextFrame(ifstream &filebin) { - char *data=NULL; - if (filebin.is_open()) { - data=new char[dataSize]; - filebin.read(data,dataSize); - } - return data; - } - - /* virtual int **getData(char *ptr, int dsize=-1) { */ - /* int **val; */ - /* val=new int*[1]; */ - /* val[0]=mythen03_frame(ptr,dynamicRange,nx,serialOffset); */ - /* return val; */ - - /* } */ - - - - virtual int setFrameNumber(int f=0) {if (f>=0) frameNumber=f; return frameNumber; }; - - private: - - int frameNumber; - - - - -}; - -#endif diff --git a/slsDetectorCalibration/dataStructures/chiptestBoardData.h b/slsDetectorCalibration/dataStructures/chiptestBoardData.h deleted file mode 100644 index 0ef633c44..000000000 --- a/slsDetectorCalibration/dataStructures/chiptestBoardData.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef CHIPTESTDATA_H -#define CHIPTESTDATA_H - -#include "slsDetectorData.h" - -class chiptestBoardData : public slsDetectorData { - - - public: - - /** - chiptestBoard data structure. Works for data acquired using the chiptestBoard. - Inherits and implements slsDetectorData. - - Constructor (no error checking if datasize and offsets are compatible!) - \param npx number of pixels in the x direction - \param npy number of pixels in the y direction (1 for strips) - \param nadc number of adcs - \param offset offset at the beginning of the pattern - \param dMap array of size nx*ny storing the pointers to the data in the dataset (as offset) - \param dMask Array of size nx*ny storing the polarity of the data in the dataset (should be 0 if no inversion is required, 0xffffffff is inversion is required) - \param dROI Array of size nx*ny. The elements are 1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all 1s. - - */ - chiptestBoardData(int npx, int npy, int nadc, int offset, int **dMap=NULL, uint16_t **dMask=NULL, int **dROI=NULL): slsDetectorData(npx, npy, nadc*(npx*npy)+offset, dMap, dMask, dROI), nAdc(nadc), offSize(offset), iframe(0) {}; // should be? nadc*(npx*npy+offset) - - - - /** - - Returns the frame number for the given dataset. Virtual func: works for slsDetectorReceiver data (also for each packet), but can be overloaded. - \param buff pointer to the dataset - \returns frame number - - */ - - virtual int getFrameNumber(char *buff){(void)buff; return iframe;}; - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! - \param data pointer to the memory to be analyzed - \param ndata size of frame returned - \param dsize size of the memory slot to be analyzed - \returns always return the pointer to data (no frame loss!) - */ - - virtual char *findNextFrame(char *data, int &ndata, int dsize) {ndata=dsize;setDataSize(dsize); return data;}; - - /** - Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! - \param filebin input file stream (binary) - \returns pointer to the first packet of the last good frame, NULL if no frame is found or last frame is incomplete - */ - - virtual char *readNextFrame(ifstream &filebin) { - - int afifo_length=0; - uint16_t *afifo_cont; - - if (filebin.is_open()) { - if (filebin.read((char*)&afifo_length,sizeof(uint32_t))) { - setDataSize(afifo_length*nAdc*sizeof(uint16_t)); - afifo_cont=new uint16_t[afifo_length*nAdc]; - if (filebin.read((char*)afifo_cont,afifo_length*sizeof(uint16_t)*nAdc)) { - iframe++; - return (char*)afifo_cont; - } else { - delete [] afifo_cont; - return NULL; - } - } else { - return NULL; - } - } - return NULL; - }; - - private: - const int nAdc; /** { -public: - - - - - /** - Implements the slsReceiverData structure for the eiger prototype read out by a half module i.e. using the slsReceiver - (256*256 pixels, 512 packets for 16 bit mode, 256 for 8, 128 for 4, 1024 for 32, 1040 etc.) - \param d dynamic range - \param c crosstalk parameter for the output buffer - - */ - - - eigerHalfModuleData(bool t, bool l, int dr, int tg, int psize, int dsize, int npf, int x, int y, double c=0): - slsReceiverData(x, y, npf, psize), - top(t), left(l), - dynamicRange(dr), tenGiga(tg), - packetSize(psize), onepacketdataSize(dsize), numberofPacketsPerFrame(npf), - xtalk(c), - header_t(0), footer_t(0){ - - - int **dMap; - uint32_t **dMask; - - dMap=new int*[ny]; - dMask=new uint32_t*[ny]; - - - for (int i = 0; i < ny; i++) { - dMap[i] = new int[nx]; - dMask[i] = new uint32_t[nx]; - } - - //Map - int totalNumberOfBytes = numberofPacketsPerFrame * packetSize; - int iPacket = 8; - int iData = 0; - int increment = (dynamicRange/8); - int ic_increment = 1; - if (dynamicRange == 4) { - increment = 1; - ic_increment = 2; - } - - if(top){ - for (int ir=0; ir= onepacketdataSize){ - iPacket += 16; - iData = 0; - } - - } - } - } - - //bottom - else{ - iData = 0; - int numbytesperline; - switch(dynamicRange){ - case 4: numbytesperline = 256; break; - case 8: numbytesperline = 512; break; - case 16:numbytesperline = 1024; break; - case 32:numbytesperline = 2048; break; - } - iPacket = totalNumberOfBytes - numbytesperline - 8; - if((dynamicRange == 32) && (!tenGiga)) - iPacket -= 16; - - for (int ir=0; irpacketnum)); - }; - - - - /** - returns the pixel value as double correcting for the output buffer crosstalk - \param data pointer to the memory - \param ix coordinate in the x direction - \param iy coordinate in the y direction - \returns channel value as double - - */ - double getValue(char *data, int ix, int iy=0) { - // cout << "##" << (void*)data << " " << ix << " " <=0 && ix=0 && iy=0 && dataMap[iy][ix]missingpacket); - - if(identifier==deactivatedPacketValue){ - // cprintf(RED,"deactivated packet\n"); - return -2; - } - // -----END OF CHECK ------------------------------------------------------------- - - - }else{ - cprintf(RED,"outside limits\n"); - return -99; - } - - //get proper data - n = ((uint32_t)(*((uint32_t*)(((char*)data)+(dataMap[iy][ix]))))); - - //each byte is shared by 2 pixels for 4 bit mode - if(dynamicRange == 4){ - if(ix != origX) - return ((n & 0xf0)>>4)^m; - return (n & 0xf)^m; - } - else if(dynamicRange == 8) return (n & 0xff)^m; - else if(dynamicRange == 16) return (n & 0xffff)^m; - else return (n & 0xffffffff)^m; - - - }; - - - /** sets the output buffer crosstalk correction parameter - \param c output buffer crosstalk correction parameter to be set - \returns current value for the output buffer crosstalk correction parameter - - */ - double setXTalk(double c) {xtalk=c; return xtalk;} - - - /** gets the output buffer crosstalk parameter - \returns current value for the output buffer crosstalk correction parameter - */ - double getXTalk() {return xtalk;} - - void getChannelArray(double* data, char* buffer){ - for(int iy = 0; iy < ny; iy++){ - for(int ix = 0; ix < nx; ix++){ - data[iy*nx+ix] = getValue((char*)buffer,ix,iy); - //cprintf(BLUE,"%d,%d :%f\n",ix,iy,value); - } - } - } - - - int* decodeData(int *datain) { - - int dataBytes = numberofPacketsPerFrame * onepacketdataSize; - int nch = nx*ny; - int* dataout = new int [nch]; - char *ptr=(char*)datain; - char iptr; - - const int bytesize=8; - int ival=0; - int ipos=0, ichan=0, ibyte; - - switch (dynamicRange) { - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; //pick the right 4bit - dataout[ichan]=ival; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan { - - private: - const int nModules; - const int offset; - int iframe; - - -public: - - - - /** - Implements the slsReceiverData structure for the gotthard read out by a module i.e. using the slsReceiver - (1x1280 pixels, 2 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - gotthardDoubleModuleDataNew(int off=24*2, int nmod=2): slsDetectorData(1280*nmod, 1, nmod*(1280*2+off)), nModules(nmod), offset(off),iframe(0) { - - - - -#ifdef BCHIP074_BCHIP075 - cout << "This is a bchip074-bchip075 system " << endl; -#endif - - - uint16_t **dMask; - int **dMap; - int ix, iy; - int ypixels=1; - int xpixels=1280*nmod; - int imod, ipix; - dMask=new uint16_t*[1]; - dMap=new int*[1]; - dMap[0] = new int[1280*nmod]; - dMask[0] = new uint16_t[1280*nmod]; - - for(int ix=0; ix=128*4 && ibad<128*5) || (ibad>=9*128 && ibad<10*128) || (ibad>=(1280+128*4) && ibad=(1280+128*6))) - dataROIMask[0][ix]=0; -#endif - } - - setDataMap(dMap); - setDataMask(dMask); - - }; - - - /** - - Returns the frame number for the given dataset. - \param buff pointer to the dataset - \returns frame number - - */ - - - int getFrameNumber(char *buff){if (offset>=sizeof(sls_detector_header)) return ((sls_detector_header*)buff)->frameNumber; return iframe;};//*((int*)(buff+5))&0xffffff;}; - - - - /** - gets the packets number (last packet is labelled with 0 and is replaced with 40) - \param buff pointer to the memory - \returns packet number - - */ - - int getPacketNumber(char *buff){if (offset>=sizeof(sls_detector_header))return ((sls_detector_header*)buff)->packetNumber;}; - - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - virtual char *findNextFrame(char *data, int &ndata, int dsize){ - if (dsize=0) - fnum=ff; - - if (filebin.is_open()) { - if (filebin.read(data, dataSize) ){ - ff=getFrameNumber(data); - np=getPacketNumber(data); - return data; - } - } - return NULL; - - - - }; - - - - -}; - - - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/gotthardModuleData.h b/slsDetectorCalibration/dataStructures/gotthardModuleData.h deleted file mode 100644 index 3f674af57..000000000 --- a/slsDetectorCalibration/dataStructures/gotthardModuleData.h +++ /dev/null @@ -1,148 +0,0 @@ -#ifndef GOTTHARDMODULEDATA_H -#define GOTTHARDMODULEDATA_H -#include "slsReceiverData.h" - - - - - -#define FRAMEMASK 0xFFFFFFFE -#define PACKETMASK 1 -#define FRAMEOFFSET 0x1 - - -class gotthardModuleData : public slsReceiverData { -public: - - - - - /** - Implements the slsReceiverData structure for the gotthard read out by a module i.e. using the slsReceiver - (1x1280 pixels, 2 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - gotthardModuleData(double c=0): slsReceiverData(xpixels, ypixels, npackets, buffersize), xtalk(c) { - - uint16_t **dMask; - int **dMap; - int ix, iy; - int initial_offset = 2; - int offset = initial_offset; - - dMask=new uint16_t*[ypixels]; - dMap=new int*[ypixels]; - for (int i = 0; i < ypixels; i++) { - dMap[i] = new int[xpixels]; - dMask[i] = new uint16_t[xpixels]; - } - - for(ix=0; ix>FRAMEOFFSET); - }; - - - - /** - gets the packets number (last packet is labelled with 0 and is replaced with 40) - \param buff pointer to the memory - \returns packet number - - */ - - int getPacketNumber(char *buff){ - int np=(*(int*)buff); - //gotthards frame header must be incremented - ++np; - //packet index should be 1 or 2 - return ((np&PACKETMASK)+1); - }; - - - /** - returns the pixel value as double correcting for the output buffer crosstalk - \param data pointer to the memory - \param ix coordinate in the x direction - \param iy coordinate in the y direction - \returns channel value as double - - */ - double getValue(char *data, int ix, int iy=0) { - //check how it is for gotthard - if (xtalk==0) - return slsDetectorData::getValue(data, ix, iy); - else - return slsDetectorData::getValue(data, ix, iy)-xtalk*slsDetectorData::getValue(data, ix-1, iy); - }; - - - - /** sets the output buffer crosstalk correction parameter - \param c output buffer crosstalk correction parameter to be set - \returns current value for the output buffer crosstalk correction parameter - - */ - double setXTalk(double c) {xtalk=c; return xtalk;} - - - /** gets the output buffer crosstalk parameter - \returns current value for the output buffer crosstalk correction parameter - */ - double getXTalk() {return xtalk;} - - - - - - - -private: - - double xtalk; /** { - - private: - - int iframe; - const int offset; - - -public: - - - - /** - Implements the slsReceiverData structure for the gotthard read out by a module i.e. using the slsReceiver - (1x1280 pixels, 2 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - gotthardModuleDataNew(int off=24*2, int nch=1280): slsDetectorData(nch, 1, nch*2+off), offset(off) { - - uint16_t **dMask; - int **dMap; - int ix, iy; - int ypixels=1; - int xpixels=nch; - - dMask=new uint16_t*[1]; - dMap=new int*[1]; - dMap[0] = new int[nch]; - dMask[0] = new uint16_t[nch]; - - for(int ix=0; ix=sizeof(sls_detector_header)) return ((sls_detector_header*)buff)->frameNumber; return iframe;};//*((int*)(buff+5))&0xffffff;}; - - - - /** - gets the packets number (last packet is labelled with 0 and is replaced with 40) - \param buff pointer to the memory - \returns packet number - - */ - - int getPacketNumber(char *buff){if (offset>=sizeof(sls_detector_header))return ((sls_detector_header*)buff)->packetNumber;}; - - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - virtual char *findNextFrame(char *data, int &ndata, int dsize){ - if (dsize=0) - fnum=ff; - - if (filebin.is_open()) { - if (filebin.read(data, dataSize) ){ - ff=getFrameNumber(data); - np=getPacketNumber(data); - return data; - } - } - return NULL; - - - - }; - - - - -}; - - - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/gotthardShortModuleData.h b/slsDetectorCalibration/dataStructures/gotthardShortModuleData.h deleted file mode 100644 index 4d853c7b0..000000000 --- a/slsDetectorCalibration/dataStructures/gotthardShortModuleData.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef GOTTHARDSHORTMODULEDATA_H -#define GOTTHARDSHORTMODULEDATA_H -#include "slsReceiverData.h" - - - - - - -class gotthardShortModuleData : public slsReceiverData { -public: - - - - - /** - Implements the slsReceiverData structure for the gotthard short read out by a module i.e. using the slsReceiver - (1x256 pixels, 1 packet 256 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - gotthardShortModuleData(double c=0): slsReceiverData(xpixels, ypixels, npackets, buffersize), xtalk(c){ - - uint16_t **dMask; - int **dMap; - int ix, iy; - int offset = 2; - - dMask=new uint16_t*[ypixels]; - dMap=new int*[ypixels]; - for (int i = 0; i < ypixels; i++) { - dMap[i] = new int[xpixels]; - dMask[i] = new uint16_t[xpixels]; - } - - for(ix=0; ix::getValue(data, ix, iy); - else - return slsDetectorData::getValue(data, ix, iy)-xtalk*slsDetectorData::getValue(data, ix-1, iy); - }; - - - - /** sets the output buffer crosstalk correction parameter - \param c output buffer crosstalk correction parameter to be set - \returns current value for the output buffer crosstalk correction parameter - - */ - double setXTalk(double c) {xtalk=c; return xtalk;} - - - /** gets the output buffer crosstalk parameter - \returns current value for the output buffer crosstalk correction parameter - */ - double getXTalk() {return xtalk;} - - - - - - - -private: - - double xtalk; /**=0 && ix=0 && iy=0 && dataMap[iy][ix]8000) //exchange if gainBits==2 is returned! - d|=(1<<14); // gain bit 1 - if (*((uint16_t*)(data)+dataMap[iy][ix]+1)>8000) //exchange if gainBits==2 is returned! - d|=(1<<15); // gain bit 0 - - } - - } - return d^m; - }; - - /** - returns the pixel value as double correcting for the output buffer crosstalk - \param data pointer to the memory - \param ix coordinate in the x direction - \param iy coordinate in the y direction - \returns channel value as double - - */ - double getValue(char *data, int ix, int iy=0) { - // cout << "##" << (void*)data << " " << ix << " " < the gain bits are read out the wrong way around (i.e. GB0 and GB1 have to be reversed!) - \param data pointer to the memory - \param ix coordinate in the x direction - \param iy coordinate in the y direction - \returns gain bits as int - */ - int getGainBits(char *data, int ix, int iy=0) { - uint16_t d=getChannel(data, ix, iy); - return ((d&0xc000)>>14); - }; - //*/ - - - - - /** sets the output buffer crosstalk correction parameter - \param c output buffer crosstalk correction parameter to be set - \returns current value for the output buffer crosstalk correction parameter - - */ - double setXTalk(double c) {xtalk=c; return xtalk;} - - - /** gets the output buffer crosstalk parameter - \returns current value for the output buffer crosstalk correction parameter - */ - double getXTalk() {return xtalk;} - - - - - - - - private: - - double xtalk; /** { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - jungfrau10ModuleData(int ns=16384): slsDetectorData(256*4, 256*2, 256*256*8*2, NULL, NULL, NULL) , iframe(0), nadc(32), sc_width(64), sc_height(256) { - - - - int row, col; - - int isample; - int iadc; - int ix, iy; - - int ichip; - - // cout << sizeof(uint16_t) << endl; - - for (iadc=0; iadc=ny || col<0 || col>=nx) { - cout << "Wrong row, column " << row << " " << col << " " << iadc << " " << i << endl; - } else - dataMap[row][col]=(nadc*i+iadc)*2; - if (dataMap[row][col]<0 || dataMap[row][col]>=dataSize) - cout << "Error: pointer " << dataMap[row][col] << " out of range " << row << " " << col <<" " << iadc << " " << i << endl; - else { - xmap[nadc*i+iadc]=col; - ymap[nadc*i+iadc]=row; - - } - } - - } - - - - }; - - - - /** - - Returns the frame number for the given dataset. Purely virtual func. - \param buff pointer to the dataset - \returns frame number - - */ - - - int getFrameNumber(char *buff){(void)buff; return iframe;}; - - /** - - Returns the packet number for the given dataset. purely virtual func - \param buff pointer to the dataset - \returns packet number number - - - virtual int getPacketNumber(char *buff)=0; - - */ - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - char *findNextFrame(char *data, int &ndata, int dsize){ndata=dsize; setDataSize(dsize); return data;}; - - - /** - - Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! - \param filebin input file stream (binary) - \returns pointer to the begin of the last good frame, NULL if no frame is found or last frame is incomplete - - */ - char *readNextFrame(ifstream &filebin){ - // int afifo_length=0; - uint16_t *afifo_cont; - int ib=0; - if (filebin.is_open()) { - afifo_cont=new uint16_t[dataSize/2]; - while (filebin.read(((char*)afifo_cont)+ib,2)) { - ib+=2; - if (ib==dataSize) break; - } - if (ib>0) { - iframe++; - // cout << ib << "-" << endl; - return (char*)afifo_cont; - } else { - delete [] afifo_cont; - return NULL; - } - } - return NULL; - }; - - - - -}; - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/moench02Ctb10GbData.h b/slsDetectorCalibration/dataStructures/moench02Ctb10GbData.h deleted file mode 100644 index a36090496..000000000 --- a/slsDetectorCalibration/dataStructures/moench02Ctb10GbData.h +++ /dev/null @@ -1,246 +0,0 @@ -#ifndef MOENCH02CTB10GBDATA_H -#define MOENCH02CTB10GBDATA_H -#include -#include "slsDetectorData.h" -#include "slsReceiverData.h" - - -class moench02Ctb10GbData : public slsReceiverData { - - private: - - int iframe; - // int *xmap, *ymap; - int nadc; - int sc_width; - int sc_height; - - int maplength; - - - - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - moench02Ctb10GbData(int ns=6400): slsReceiverData(160, 160, 50, 8208) , nadc(4), sc_width(40), sc_height(160) { - - - int adc_nr[4]={120,0,80,40}; - int row, col; - - int isample; - int iadc; - int ix, iy; - int i; - int npackets=50; - maplength = 8208*npackets; - //this->setDataSize(maplength); - /* maplength=this->getDataSize()/2; */ - - for (int ip=0; ip=8208*npackets) { - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - - } - } - } - } - int ibyte; - int ii=0; - - for (int ipacket=0; ipacket=2 && iadc<=5){ - xmap[i]=adc_nr[iadc-2]+ix; - ymap[i]=iy; - }else{ - xmap[i]=-1; - ymap[i]=-1; - } - ii++; - } - }//end loop on bytes - }//end loop on packets - - iframe=0; - cout << "data struct created" << endl; - }; - - void getPixel(int ip, int &x, int &y) { - if(ip>=0 && ip0) { */ - /* iframe++; */ - /* //cout << ib << "-" << endl; */ - /* return (char*)afifo_cont; */ - /* } else { */ - /* delete [] afifo_cont; */ - /* return NULL; */ - /* } */ - /* } */ - /* return NULL; */ - /* }; */ - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { - char *data=new char[packetSize*nPackets]; - char *retval=0; - int nd; - np=0; - int pn; - char aa[8224]={0}; - char *packet=(char *)aa; - int fnum = -1; - if (ff>=0) - fnum=ff; - - if (filebin.is_open()) { - - - cout << "+"; - - while(filebin.read((char*)packet, 8208)){ - - pn=getPacketNumber(packet); - if (fnum<0) - fnum= getFrameNumber(packet); - - - if (fnum>=0) { - if (getFrameNumber(packet) !=fnum) { - - if (np==0){ - cout << "-"; - delete [] data; - return NULL; - } else - filebin.seekg(-8208,ios_base::cur); - return data; - } - - memcpy(data+(pn-1)*packetSize, packet, packetSize); - - np++; - if (np==nPackets) - break; - if (pn==nPackets) - break; - } - } - }else{ - cerr< { - - private: - - int iframe; - // int *xmap, *ymap; - int nadc; - int sc_width; - int sc_height; - - int maplength; - - - - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - moench02CtbData(int ns=6400): slsDetectorData(160, 160, ns*2*32, NULL, NULL) , nadc(32), sc_width(40), sc_height(160) { - - - int adc_off[4]={0,40,80,120}; - int adc_nr[4]={8,10,20,23}; - int row, col; - - int isample; - int iadc, iiadc; - int ix, iy; - maplength=this->getDataSize()/2; - //cout << maplength << endl; - - for (iiadc=0; iiadc<4; iiadc++) { - - iadc=adc_nr[iiadc]; - //cout << iiadc << endl; - for (int i=0; i=dataSize) { - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - - } - } - - for (int i=0; i=0){ - xmap[i]=adc_off[iadc]+ix; - ymap[i]=iy; - }else{ - xmap[i]=-1; - ymap[i]=-1; - } - } - iframe=0; - cout << "data struct created" << endl; - }; - - void getPixel(int ip, int &x, int &y) { - if(ip>=0 && ip0) { - iframe++; - //cout << ib/2 << "-" << endl; - //for (int i=0; i { - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - moench02ModuleData(double c=0): slsReceiverData(160, 160, 40, 1286), - xtalk(c) { - - - - - uint16_t **dMask; - int **dMap; - int ix, iy; - - - - dMask=new uint16_t*[160]; - dMap=new int*[160]; - for (int i = 0; i < 160; i++) { - dMap[i] = new int[160]; - dMask[i] = new uint16_t[160]; - } - - for (int isc=0; isc<4; isc++) { - for (int ip=0; ip<10; ip++) { - - for (int ir=0; ir<16; ir++) { - for (int ic=0; ic<40; ic++) { - - ix=isc*40+ic; - iy=ip*16+ir; - - dMap[iy][ix]=1286*(isc*10+ip)+2*ir*40+2*ic+4; - // cout << ix << " " << iy << " " << dMap[ix][iy] << endl; - } - } - } - } - - for (ix=0; ix<120; ix++) { - for (iy=0; iy<160; iy++) - dMask[iy][ix]=0x3fff; - } - for (ix=120; ix<160; ix++) { - for (iy=0; iy<160; iy++) - dMask[iy][ix]=0x0; - } - - - setDataMap(dMap); - setDataMask(dMask); - - - - - }; - - - - /** - gets the packets number (last packet is labelled with 0 and is replaced with 40) - \param buff pointer to the memory - \returns packet number - - */ - - int getPacketNumber(char *buff){ - int np=(*(int*)buff)&0xff; - if (np==0) - np=40; - return np; - }; - - - /** - returns the pixel value as double correcting for the output buffer crosstalk - \param data pointer to the memory - \param ix coordinate in the x direction - \param iy coordinate in the y direction - \returns channel value as double - - */ - double getValue(char *data, int ix, int iy=0) { - // cout << "##" << (void*)data << " " << ix << " " <::getValue(data, ix, iy); - else - return slsDetectorData::getValue(data, ix, iy)-xtalk*slsDetectorData::getValue(data, ix-1, iy); - }; - - - - /** sets the output buffer crosstalk correction parameter - \param c output buffer crosstalk correction parameter to be set - \returns current value for the output buffer crosstalk correction parameter - - */ - double setXTalk(double c) {xtalk=c; return xtalk;} - - - /** gets the output buffer crosstalk parameter - \returns current value for the output buffer crosstalk correction parameter - */ - double getXTalk() {return xtalk;} - - - - - - - - private: - - double xtalk; /** { - - protected: - - int iframe; - int nadc; - int sc_width; - int sc_height; - - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - // moench03Ctb10GbData(int ns=5000): slsDetectorData(400, 400, 8208*40, NULL, NULL) , nadc(32), sc_width(25), sc_height(200) { - moench03Ctb10GbData(int ns=5000): slsReceiverData(400, 400, 40, 8208), nadc(32), sc_width(25), sc_height(200) { - - int adc_nr[32]={200,225,250,275,300,325,350,375,\ - 0,25,50,75,100,125,150,175,\ - 175,150,125,100,75,50,25,0,\ - 375,350,325,300,275,250,225,200}; - int row, col; - - int isample; - int iadc; - int ix, iy; - - int npackets=40; - int i; - - - for (int ip=0; ip=8208*40) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - - int ipacket; - int ibyte; - int ii=0; - for (int ipacket=0; ipacket0) { */ -/* iframe++; */ -/* // cout << ib << "-" << endl; */ -/* return (char*)afifo_cont; */ -/* } else { */ -/* delete [] afifo_cont; */ -/* return NULL; */ -/* } */ -/* } */ -/* return NULL; */ -/* }; */ - - - virtual char *readNextFrame(ifstream &filebin, int& fnum, char *data=NULL) { - int dd=0; - if (data==NULL) { - data=new char[packetSize*nPackets]; - dd=1; - } - char *retval=0; - int np=0, nd; - fnum = -1; - int pn; - char aa[8224]; - char *packet=(char *)aa; - int place; - - if (filebin.is_open()) { - - - - place=filebin.tellg(); - while(filebin.read((char*)packet, 8208) && np=0) { - if (getFrameNumber(packet) !=fnum) { - cout << "-"<=0) { */ -/* if (getFrameNumber(packet) !=fnum) { */ - -/* if (np==0){ */ -/* delete [] data; */ -/* return NULL; */ -/* } else */ -/* return data; */ -/* } */ - -/* memcpy(data+(pn-1)*packetSize, packet, packetSize); */ -/* np++; */ - -/* } */ -/* } */ - -/* } */ - -/* if (np==0){ */ -/* delete [] data; */ -/* return NULL; */ -/* } */ - -/* }; */ - -int getPacketNumber(int x, int y) {return dataMap[y][x]/8208;}; - - -}; - - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/moench03Ctb10GbT1Data.h b/slsDetectorCalibration/dataStructures/moench03Ctb10GbT1Data.h deleted file mode 100644 index b1e1932c7..000000000 --- a/slsDetectorCalibration/dataStructures/moench03Ctb10GbT1Data.h +++ /dev/null @@ -1,284 +0,0 @@ -#ifndef MOENCH03CTB10GBT1DATA_H -#define MOENCH03CTB10GBT1DATA_H -#include "slsReceiverData.h" - - - -class moench03Ctb10GbT1Data : public slsReceiverData { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - moench03Ctb10GbT1Data(int ns=5000): slsReceiverData(400, 400, 40, 8208), nadc(32), sc_width(25), sc_height(200) { - - - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - int row, col; - - int isample; - int iadc; - int ix, iy; - - int npackets=40; - int i; - int adc4(0); - - for (int ip=0; ip=8208*40) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - - int ipacket; - int ibyte; - int ii=0; - for (int ipacket=0; ipacket0) { */ -/* iframe++; */ -/* // cout << ib << "-" << endl; */ -/* return (char*)afifo_cont; */ -/* } else { */ -/* delete [] afifo_cont; */ -/* return NULL; */ -/* } */ -/* } */ -/* return NULL; */ -/* }; */ - - - virtual char *readNextFrame(ifstream &filebin) { - int ff=-1, np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int &ff) { - int np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { - char *data=new char[packetSize*nPackets]; - char *d=readNextFrame(filebin, ff, np, data); - if (d==NULL) {delete [] data; data=NULL;} - return data; - - } - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np, char *data) { - char *retval=0; - int nd; - int fnum = -1; - np=0; - int pn; - char aa[8224]; - char *packet=(char *)aa; - // cout << packetSize*nPackets << endl; - if (ff>=0) - fnum=ff; - - if (filebin.is_open()) { - - - - - while(filebin.read((char*)packet, 8208) ){ - pn=getPacketNumber(packet); - - if (fnum<0) - fnum= getFrameNumber(packet); - - // cout << "fn: " << fnum << "\t pn: " << pn << endl; - if (fnum>=0) { - if (getFrameNumber(packet) !=fnum) { - - if (np==0){ - // delete [] data; - return NULL; - } else - filebin.seekg(-8208,ios_base::cur); - return data; - } - if (pn>nPackets) { - cout << "Bad packet number " << pn << endl; - } - - memcpy(data+(pn-1)*packetSize, packet, packetSize); - np++; - - if (np==nPackets) - break; - - if (pn==nPackets) - break; - - } - } - - } - - if (np==0){ - // delete [] data; - return NULL; - } - - ff=fnum; - return data; - - }; - - - - - - - - - - - - - - - - - - -int getPacketNumber(int x, int y) {return dataMap[y][x]/8208;}; - - -}; - - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/moench03CtbData.h b/slsDetectorCalibration/dataStructures/moench03CtbData.h deleted file mode 100644 index 66ae0cbda..000000000 --- a/slsDetectorCalibration/dataStructures/moench03CtbData.h +++ /dev/null @@ -1,157 +0,0 @@ -#ifndef MOENCH03CTBDATA_H -#define MOENCH03CTBDATA_H -#include "slsDetectorData.h" - - - -class moench03CtbData : public slsDetectorData { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - moench03CtbData(int ns=5000): slsDetectorData(400, 400, ns*2*32, NULL, NULL) , nadc(32), sc_width(25), sc_height(200) { - - - int row, col; - - int isample; - int iadc; - int ix, iy; - - int adc_nr[32]={200,225,250,275,300,325,350,375,\ - 0,25,50,75,100,125,150,175,\ - 175,150,125,100,75,50,25,0,\ - 375,350,325,300,275,250,225,200}; - - /* int adc_nr[32]={300,325,350,375,300,325,350,375, \ */ - /* 200,225,250,275,200,225,250,275,\ */ - /* 100,125,150,175,100,125,150,175,\ */ - /* 0,25,50,75,0,25,50,75}; */ - - - for (iadc=0; iadc=2*400*400) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - - } - } - for (int i=0; i0) { - iframe++; - // cout << ib << "-" << endl; - return (char*)afifo_cont; - } else { - delete [] afifo_cont; - return NULL; - } - } - return NULL; - }; - - - - -}; - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/moench03T1CtbData.h b/slsDetectorCalibration/dataStructures/moench03T1CtbData.h deleted file mode 100644 index 4a99d3746..000000000 --- a/slsDetectorCalibration/dataStructures/moench03T1CtbData.h +++ /dev/null @@ -1,158 +0,0 @@ -#ifndef MOENCH03T1CTBDATA_H -#define MOENCH03T1CTBDATA_H -#include "slsDetectorData.h" - - - -class moench03T1CtbData : public slsDetectorData { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - moench03T1CtbData(int ns=5000): slsDetectorData(400, 400, ns*2*32, NULL, NULL) , nadc(32), sc_width(25), sc_height(200) { - - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - int row, col; - - int isample; - int iadc; - int ix, iy; - - - - - - for (iadc=0; iadc=2*400*400) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - - } - } - int adc4; - for (int i=0; i0) { - iframe++; - // cout << ib << "-" << endl; - return (char*)afifo_cont; - } else { - delete [] afifo_cont; - return NULL; - } - } - return NULL; - }; - - - - -}; - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/moench03T1ReceiverData.h b/slsDetectorCalibration/dataStructures/moench03T1ReceiverData.h deleted file mode 100644 index 855bfb7c4..000000000 --- a/slsDetectorCalibration/dataStructures/moench03T1ReceiverData.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifndef MOENCH03T1ZMQDATA_H -#define MOENCH03T1ZMQDATA_H -#include "slsDetectorData.h" - - /** - @short structure for a Detector Packet or Image Header - @li frameNumber is the frame number - @li expLength is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) - @li packetNumber is the packet number - @li bunchId is the bunch id from beamline - @li timestamp is the time stamp with 10 MHz clock - @li modId is the unique module id (unique even for left, right, top, bottom) - @li xCoord is the x coordinate in the complete detector system - @li yCoord is the y coordinate in the complete detector system - @li zCoord is the z coordinate in the complete detector system - @li debug is for debugging purposes - @li roundRNumber is the round robin set number - @li detType is the detector type see :: detectorType - @li version is the version number of this structure format - */ - typedef struct { - uint64_t frameNumber; /**< is the frame number */ - uint32_t expLength; /**< is the subframe number (32 bit eiger) or real time exposure time in 100ns (others) */ - uint32_t packetNumber; /**< is the packet number */ - uint64_t bunchId; /**< is the bunch id from beamline */ - uint64_t timestamp; /**< is the time stamp with 10 MHz clock */ - uint16_t modId; /**< is the unique module id (unique even for left, right, top, bottom) */ - uint16_t xCoord; /**< is the x coordinate in the complete detector system */ - uint16_t yCoord; /**< is the y coordinate in the complete detector system */ - uint16_t zCoord; /**< is the z coordinate in the complete detector system */ - uint32_t debug; /**< is for debugging purposes */ - uint16_t roundRNumber; /**< is the round robin set number */ - uint8_t detType; /**< is the detector type see :: detectorType */ - uint8_t version; /**< is the version number of this structure format */ - } sls_detector_header; - - - - -class moench03T1ReceiverData : public slsDetectorData { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - const int nPackets; /**(400, 400, ps*npackets+sizeof(sls_detector_header)), packetSize(ps), nPackets(npackets) { - - int nadc=32; - int sc_width=25; - int sc_height=200; - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - int row, col; - - int isample; - int iadc; - int ix, iy; - - // int npackets=40; - int i; - int adc4(0); - - for (int ip=0; ip=8192*40) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - - int ipacket; - int ibyte; - int ii=0; - for (ibyte=0; ibyteframeNumber;};//*((int*)(buff+5))&0xffffff;}; - - /** - - Returns the packet number for the given dataset. purely virtual func - \param buff pointer to the dataset - \returns packet number number - - - - */ - int getPacketNumber(char *buff){((sls_detector_header*)buff)->packetNumber;}//((*(((int*)(buff+4))))&0xff)+1;}; - -/* /\** */ - -/* Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func */ -/* \param data pointer to the memory to be analyzed */ -/* \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot */ -/* \param dsize size of the memory slot to be analyzed */ -/* \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found */ - -/* *\/ */ -/* virtual char *findNextFrame(char *data, int &ndata, int dsize){ndata=dsize; setDataSize(dsize); return data;}; */ - - -/* /\** */ - -/* Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! */ -/* \param filebin input file stream (binary) */ -/* \returns pointer to the begin of the last good frame, NULL if no frame is found or last frame is incomplete */ - -/* *\/ */ -/* virtual char *readNextFrame(ifstream &filebin){ */ -/* // int afifo_length=0; */ -/* uint16_t *afifo_cont; */ -/* int ib=0; */ -/* if (filebin.is_open()) { */ -/* afifo_cont=new uint16_t[dataSize/2]; */ -/* while (filebin.read(((char*)afifo_cont)+ib,2)) { */ -/* ib+=2; */ -/* if (ib==dataSize) break; */ -/* } */ -/* if (ib>0) { */ -/* iframe++; */ -/* // cout << ib << "-" << endl; */ -/* return (char*)afifo_cont; */ -/* } else { */ -/* delete [] afifo_cont; */ -/* return NULL; */ -/* } */ -/* } */ -/* return NULL; */ -/* }; */ - - - virtual char *readNextFrame(ifstream &filebin) { - int ff=-1, np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int &ff) { - int np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { - char *data=new char[dataSize]; - char *d=readNextFrame(filebin, ff, np, data); - if (d==NULL) {delete [] data; data=NULL;} - return data; - } - - - - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np, char *data) { - char *retval=0; - int nd; - int fnum = -1; - np=0; - int pn; - - // cout << dataSize << endl; - if (ff>=0) - fnum=ff; - - if (filebin.is_open()) { - if (filebin.read(data, dataSize) ){ - ff=getFrameNumber(data); - np=getPacketNumber(data); - return data; - } - } - return NULL; - - - - }; - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - virtual char *findNextFrame(char *data, int &ndata, int dsize){ - if (dsize { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - const int nSamples; - - - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - moench03T1ReceiverDataNew(int ns=5000): slsDetectorData(400, 400, ns*2*32+sizeof(sls_detector_header)), nSamples(ns) { - - int nadc=32; - int sc_width=25; - int sc_height=200; - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - int row, col; - - int isample; - int iadc; - int ix, iy; - - int npackets=40; - int i; - int adc4(0); - - for (int ip=0; ip=nSamples*2*32) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - - int ipacket; - int ibyte; - int ii=0; - for (ibyte=0; ibyteframeNumber;};//*((int*)(buff+5))&0xffffff;}; - - /** - - Returns the packet number for the given dataset. purely virtual func - \param buff pointer to the dataset - \returns packet number number - - - - */ - int getPacketNumber(char *buff){return ((sls_detector_header*)buff)->packetNumber;}//((*(((int*)(buff+4))))&0xff)+1;}; - -/* /\** */ - -/* Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func */ -/* \param data pointer to the memory to be analyzed */ -/* \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot */ -/* \param dsize size of the memory slot to be analyzed */ -/* \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found */ - -/* *\/ */ -/* virtual char *findNextFrame(char *data, int &ndata, int dsize){ndata=dsize; setDataSize(dsize); return data;}; */ - - -/* /\** */ - -/* Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! */ -/* \param filebin input file stream (binary) */ -/* \returns pointer to the begin of the last good frame, NULL if no frame is found or last frame is incomplete */ - -/* *\/ */ -/* virtual char *readNextFrame(ifstream &filebin){ */ -/* // int afifo_length=0; */ -/* uint16_t *afifo_cont; */ -/* int ib=0; */ -/* if (filebin.is_open()) { */ -/* afifo_cont=new uint16_t[dataSize/2]; */ -/* while (filebin.read(((char*)afifo_cont)+ib,2)) { */ -/* ib+=2; */ -/* if (ib==dataSize) break; */ -/* } */ -/* if (ib>0) { */ -/* iframe++; */ -/* // cout << ib << "-" << endl; */ -/* return (char*)afifo_cont; */ -/* } else { */ -/* delete [] afifo_cont; */ -/* return NULL; */ -/* } */ -/* } */ -/* return NULL; */ -/* }; */ - - - virtual char *readNextFrame(ifstream &filebin) { - int ff=-1, np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int &ff) { - int np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { - char *data=new char[dataSize]; - char *d=readNextFrame(filebin, ff, np, data); - if (d==NULL) {delete [] data; data=NULL;} - return data; - } - - - - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np, char *data) { - char *retval=0; - int nd; - int fnum = -1; - np=0; - int pn; - - // cout << dataSize << endl; - if (ff>=0) - fnum=ff; - - if (filebin.is_open()) { - if (filebin.read(data, dataSize) ){ - ff=getFrameNumber(data); - np=getPacketNumber(data); - return data; - } - } - return NULL; - - - - }; - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - virtual char *findNextFrame(char *data, int &ndata, int dsize){ - if (dsize { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - const int nPackets; /**(400, 400, ps*npackets), packetSize(ps), nPackets(npackets) { - - int nadc=32; - int sc_width=25; - int sc_height=200; - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - int row, col; - - int isample; - int iadc; - int ix, iy; - - // int npackets=40; - int i; - int adc4(0); - - for (int ip=0; ip=8192*40) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - - int ipacket; - int ibyte; - int ii=0; - for (int ipacket=0; ipacket0) { */ -/* iframe++; */ -/* // cout << ib << "-" << endl; */ -/* return (char*)afifo_cont; */ -/* } else { */ -/* delete [] afifo_cont; */ -/* return NULL; */ -/* } */ -/* } */ -/* return NULL; */ -/* }; */ - - - virtual char *readNextFrame(ifstream &filebin) { - int ff=-1, np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int &ff) { - int np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { - char *data=new char[packetSize*nPackets]; - char *d=readNextFrame(filebin, ff, np, data); - if (d==NULL) {delete [] data; data=NULL;} - return data; - } - - - - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np, char *data) { - char *retval=0; - int nd; - int fnum = -1; - np=0; - int pn; - - - if (ff>=0) - fnum=ff; - - if (filebin.is_open()) { - if (filebin.read(data, packetSize*nPackets) ){ - iframe++; - ff=iframe; - return data; - } - } - return NULL; - - - - }; - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - virtual char *findNextFrame(char *data, int &ndata, int dsize){ - if (dsize { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - const int nSamples; - - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - moench03T1ZmqDataNew(int ns=5000): slsDetectorData(400, 400, ns*32*2), nSamples(ns) { - - int nadc=32; - int sc_width=25; - int sc_height=200; - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - int row, col; - - int isample; - int iadc; - int ix, iy; - - int npackets=40; - int i; - int adc4(0); - - for (int ip=0; ip=nSamples*2*32) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - - int ipacket; - int ibyte; - int ii=0; - for (int ipacket=0; ipacket0) { */ -/* iframe++; */ -/* // cout << ib << "-" << endl; */ -/* return (char*)afifo_cont; */ -/* } else { */ -/* delete [] afifo_cont; */ -/* return NULL; */ -/* } */ -/* } */ -/* return NULL; */ -/* }; */ - - - virtual char *readNextFrame(ifstream &filebin) { - int ff=-1, np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int &ff) { - int np=-1; - return readNextFrame(filebin, ff, np); - }; - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { - char *data=new char[32*2*nSamples]; - char *d=readNextFrame(filebin, ff, np, data); - if (d==NULL) {delete [] data; data=NULL;} - return data; - } - - - - - virtual char *readNextFrame(ifstream &filebin, int& ff, int &np, char *data) { - char *retval=0; - int nd; - int fnum = -1; - np=0; - int pn; - - - if (ff>=0) - fnum=ff; - - if (filebin.is_open()) { - if (filebin.read(data, 32*2*nSamples) ){ - iframe++; - ff=iframe; - return data; - } - } - return NULL; - - - - }; - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). purely virtual func - \param data pointer to the memory to be analyzed - \param ndata reference to the amount of data found for the frame, in case the frame is incomplete at the end of the memory slot - \param dsize size of the memory slot to be analyzed - \returns pointer to the beginning of the last good frame (might be incomplete if ndata smaller than dataSize), or NULL if no frame is found - - */ - virtual char *findNextFrame(char *data, int &ndata, int dsize){ - if (dsize<32*2*nSamples) ndata=dsize; - else ndata=32*2*nSamples; - return data; - - } - - - - - - - - - - - - - - - -int getPacketNumber(int x, int y) {return 0;}; - -}; - - - - -#endif diff --git a/slsDetectorCalibration/dataStructures/moench03TCtb10GbData.h b/slsDetectorCalibration/dataStructures/moench03TCtb10GbData.h deleted file mode 100644 index 989012991..000000000 --- a/slsDetectorCalibration/dataStructures/moench03TCtb10GbData.h +++ /dev/null @@ -1,285 +0,0 @@ -#ifndef MOENCH03TCTB10GBDATA_H -#define MOENCH03TCTB10GBDATA_H -#include "moench03Ctb10GbData.h" - - - -class moench03TCtb10GbData : public moench03Ctb10GbData { //slsReceiverData { - - - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - // moench03TCtb10GbData(int ns=5000): slsDetectorData(400, 400, 8208*40, NULL, NULL) , nadc(32), sc_width(25), sc_height(200) { - moench03TCtb10GbData(int ns=5000): moench03Ctb10GbData(ns) {//slsReceiverData(400, 400, 40, 8208), nadc(32), sc_width(25), sc_height(200) { - // cout <<"constructor"<< endl; - // nadc=32; - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - int row, col; - - int isample; - int iadc; - int ix, iy; - - int npackets=40; - int i; - int adc4(0); - - for (int ip=0; ip=8208*40) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - } - } - } - } - // cout <<"map"<< endl; - int ipacket; - int ibyte; - int ii=0; - for (int ipacket=0; ipacket0) { *\/ */ -/* /\* iframe++; *\/ */ -/* /\* // cout << ib << "-" << endl; *\/ */ -/* /\* return (char*)afifo_cont; *\/ */ -/* /\* } else { *\/ */ -/* /\* delete [] afifo_cont; *\/ */ -/* /\* return NULL; *\/ */ -/* /\* } *\/ */ -/* /\* } *\/ */ -/* /\* return NULL; *\/ */ -/* /\* }; *\/ */ - - -/* virtual char *readNextFrame(ifstream &filebin, int& ff, int &np) { */ -/* char *data=new char[packetSize*nPackets]; */ -/* char *retval=0; */ -/* int nd; */ -/* np=0; */ -/* int pn; */ -/* char aa[8224]={0}; */ -/* char *packet=(char *)aa; */ -/* int fnum = -1; */ - -/* if (ff>=0) */ -/* fnum=ff; */ - -/* if (filebin.is_open()) { */ - - -/* cout << "+"; */ - -/* while(filebin.read((char*)packet, 8208)){ */ - -/* pn=getPacketNumber(packet); */ - -/* if (fnum<0) */ -/* fnum= getFrameNumber(packet); */ - -/* if (fnum>=0) { */ -/* if (getFrameNumber(packet) !=fnum) { */ - -/* if (np==0){ */ -/* cout << "-"; */ -/* delete [] data; */ -/* return NULL; */ -/* } else */ -/* filebin.seekg(-8208,ios_base::cur); */ - -/* return data; */ -/* } */ - -/* memcpy(data+(pn-1)*packetSize, packet, packetSize); */ -/* np++; */ -/* if (np==nPackets) */ -/* break; */ -/* if (pn==nPackets) */ -/* break; */ -/* } */ -/* } */ - -/* } */ - -/* if (np==0){ */ -/* cout << "?"; */ -/* delete [] data; */ -/* return NULL; */ -/* }// else if (np { - - private: - - int iframe; - int nadc; - int sc_width; - int sc_height; - public: - - - - - /** - Implements the slsReceiverData structure for the moench02 prototype read out by a module i.e. using the slsReceiver - (160x160 pixels, 40 packets 1286 large etc.) - \param c crosstalk parameter for the output buffer - - */ - - - moench03TCtbData(int ns=5000): slsDetectorData(400, 400, ns*2*32, NULL, NULL) , nadc(32), sc_width(25), sc_height(200) { - - - int row, col; - - int isample; - int iadc; - int ix, iy; - - - - int adc_nr[32]={300,325,350,375,300,325,350,375, \ - 200,225,250,275,200,225,250,275,\ - 100,125,150,175,100,125,150,175,\ - 0,25,50,75,0,25,50,75}; - - - - /* int adc_nr[32]={200,225,250,275,300,325,350,375,\ */ - /* 0,25,50,75,100,125,150,175,\ */ - /* 175,150,125,100,75,50,25,0,\ */ - /* 375,350,325,300,275,250,225,200}; */ - - - for (iadc=0; iadc=2*400*400) - cout << "Error: pointer " << dataMap[row][col] << " out of range "<< endl; - - } - } - int adc4; - for (int i=0; i0) { - iframe++; - // cout << ib << "-" << endl; - return (char*)afifo_cont; - } else { - delete [] afifo_cont; - return NULL; - } - } - return NULL; - }; - - - - -}; - - - -#endif diff --git a/slsDetectorCalibration/doxy.config b/slsDetectorCalibration/doxy.config deleted file mode 100644 index 7f1241be0..000000000 --- a/slsDetectorCalibration/doxy.config +++ /dev/null @@ -1,85 +0,0 @@ -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - - - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = YES - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -INTERNAL_DOCS = NO - -SHOW_INCLUDE_FILES = NO - -SHOW_FILES = NO - -SHOW_NAMESPACES = NO - -COMPACT_LATEX = YES - -PAPER_TYPE = a4 - -PDF_HYPERLINKS = YES - -USE_PDFLATEX = YES - -LATEX_HIDE_INDICES = YES - -PREDEFINED = __cplusplus - -INPUT = MovingStat.h slsDetectorData.h slsReceiverData.h moench02ModuleData.h pedestalSubtraction.h commonModeSubtraction.h moenchCommonMode.h singlePhotonDetector.h energyCalibration.h moenchReadData.C single_photon_hit.h chiptestBoardData.h jungfrau02Data.h jungfrauReadData.C jungfrau02CommonMode.h -OUTPUT_DIRECTORY = docs - diff --git a/slsDetectorCalibration/energyCalibration.cpp b/slsDetectorCalibration/energyCalibration.cpp deleted file mode 100644 index 596d9a0e4..000000000 --- a/slsDetectorCalibration/energyCalibration.cpp +++ /dev/null @@ -1,534 +0,0 @@ -#include "energyCalibration.h" - -#ifdef __CINT -#define MYROOT -#endif - - -#ifdef MYROOT -#include -#include -#include -#include -#endif - -#include - -#define max(a,b) ((a) > (b) ? (a) : (b)) -#define min(a,b) ((a) < (b) ? (a) : (b)) -#define ELEM_SWAP(a,b) { register int t=(a);(a)=(b);(b)=t; } - - -using namespace std; - -#ifdef MYROOT - -Double_t energyCalibrationFunctions::pedestal(Double_t *x, Double_t *par) { - return par[0]-par[1]*sign*x[0]; -} - - -Double_t energyCalibrationFunctions::gaussChargeSharing(Double_t *x, Double_t *par) { - Double_t f, arg=0; - if (par[3]!=0) arg=sign*(x[0]-par[2])/par[3]; - f=TMath::Exp(-1*arg*arg/2.); - f=f+par[5]/2.*(TMath::Erfc(arg/(TMath::Sqrt(2.)))); - return par[4]*f+pedestal(x,par); -} - -Double_t energyCalibrationFunctions::gaussChargeSharingPixel(Double_t *x, Double_t *par) { - Double_t f; - if (par[3]<=0 || par[2]*(*x)<=0 || par[5]<0 || par[4]<=0) return 0; - - Double_t pp[3]; - - pp[0]=0; - pp[1]=par[2]; - pp[2]=par[3]; - - - f=(par[5]-par[6]*(TMath::Log(*x/par[2])))*erfBox(x,pp); - f+=par[4]*TMath::Gaus(*x, par[2], par[3], kTRUE); - return f+pedestal(x,par); -} - -Double_t energyCalibrationFunctions::erfBox(Double_t *z, Double_t *par) { - - - - Double_t m=par[0]; - Double_t M=par[1]; - - if (par[0]>par[1]) { - m=par[1]; - M=par[0]; - } - - if (m==M) - return 0; - - - if (par[2]<=0) { - if (*z>=m && *z<=M) - return 1./(M-m); - else - return 0; - - } - - return (TMath::Erfc((z[0]-M)/par[2])-TMath::Erfc((z[0]-m)/par[2]))*0.5/(M-m); - -} - - -// basic erf function -Double_t energyCalibrationFunctions::erfFunction(Double_t *x, Double_t *par) { - double arg=0; - if (par[1]!=0) arg=(par[0]-x[0])/par[1]; - return ((par[2]/2.*(1+TMath::Erf(sign*arg/(TMath::Sqrt(2)))))); -}; - - -Double_t energyCalibrationFunctions::erfFunctionChargeSharing(Double_t *x, Double_t *par) { - Double_t f; - - f=erfFunction(x, par+2)*(1+par[5]*(par[2]-x[0]))+par[0]-par[1]*x[0]*sign; - return f; -}; - - -Double_t energyCalibrationFunctions::erfFuncFluo(Double_t *x, Double_t *par) { - Double_t f; - f=erfFunctionChargeSharing(x, par)+erfFunction(x, par+6)*(1+par[9]*(par[6]-x[0])); - return f; -}; -#endif - -double energyCalibrationFunctions::median(double *x, int n){ - // sorts x into xmed array and returns median - // n is number of values already in the xmed array - double xmed[n]; - int k,i,j; - - for (i=0; i*(x+j)) - k++; - if (*(x+i)==*(x+j)) { - if (i>j) - k++; - } - } - xmed[k]=*(x+i); - } - k=n/2; - return xmed[k]; -} - - -int energyCalibrationFunctions::quick_select(int arr[], int n){ - int low, high ; - int median; - int middle, ll, hh; - - low = 0 ; high = n-1 ; median = (low + high) / 2; - for (;;) { - if (high <= low) /* One element only */ - return arr[median] ; - - if (high == low + 1) { /* Two elements only */ - if (arr[low] > arr[high]) - ELEM_SWAP(arr[low], arr[high]) ; - return arr[median] ; - } - - /* Find median of low, middle and high items; swap into position low */ - middle = (low + high) / 2; - if (arr[middle] > arr[high]) ELEM_SWAP(arr[middle], arr[high]) ; - if (arr[low] > arr[high]) ELEM_SWAP(arr[low], arr[high]) ; - if (arr[middle] > arr[low]) ELEM_SWAP(arr[middle], arr[low]) ; - - /* Swap low item (now in position middle) into position (low+1) */ - ELEM_SWAP(arr[middle], arr[low+1]) ; - - /* Nibble from each end towards middle, swapping items when stuck */ - ll = low + 1; - hh = high; - for (;;) { - do ll++; while (arr[low] > arr[ll]) ; - do hh--; while (arr[hh] > arr[low]) ; - - if (hh < ll) - break; - - ELEM_SWAP(arr[ll], arr[hh]) ; - } - - /* Swap middle item (in position low) back into correct position */ - ELEM_SWAP(arr[low], arr[hh]) ; - - /* Re-set active partition */ - if (hh <= median) - low = ll; - if (hh >= median) - high = hh - 1; - } -} - -int energyCalibrationFunctions::kth_smallest(int *a, int n, int k){ - register int i,j,l,m ; - register double x ; - - l=0 ; m=n-1 ; - while (lSetParNames("Background Offset","Background Slope","Inflection Point","Noise RMS", "Number of Photons","Charge Sharing Slope"); - - fspectrum=new TF1("fspectrum",funcs,&energyCalibrationFunctions::spectrum,0,1000,6,"energyCalibrationFunctions","spectrum"); - fspectrum->SetParNames("Background Pedestal","Background slope", "Peak position","Noise RMS", "Number of Photons","Charge Sharing Pedestal"); - - fspixel=new TF1("fspixel",funcs,&energyCalibrationFunctions::spectrumPixel,0,1000,7,"energyCalibrationFunctions","spectrumPixel"); - fspixel->SetParNames("Background Pedestal","Background slope", "Peak position","Noise RMS", "Number of Photons","Charge Sharing Pedestal","Corner"); - -#endif - - -} - - - -void energyCalibration::fixParameter(int ip, Double_t val){ - - fscurve->FixParameter(ip, val); - fspectrum->FixParameter(ip, val); -} - - -void energyCalibration::releaseParameter(int ip){ - - fscurve->ReleaseParameter(ip); - fspectrum->ReleaseParameter(ip); -} - - - - - - - -energyCalibration::~energyCalibration(){ -#ifdef MYROOT - delete fscurve; - delete fspectrum; -#endif - -} - -#ifdef MYROOT - - - - - -TH1F* energyCalibration::createMedianHistogram(TH2F* h2, int ch0, int nch, int direction) { - - if (h2==NULL || nch==0) - return NULL; - - double *x=new double[nch]; - TH1F *h1=NULL; - - double val=-1; - - if (direction==0) { - h1=new TH1F("median","Median",h2->GetYaxis()->GetNbins(),h2->GetYaxis()->GetXmin(),h2->GetYaxis()->GetXmax()); - for (int ib=0; ibGetXaxis()->GetNbins(); ib++) { - for (int ich=0; ichGetBinContent(ch0+ich+1,ib+1); - } - val=energyCalibrationFunctions::median(x, nch); - h1->SetBinContent(ib+1,val); - } - } else if (direction==1) { - h1=new TH1F("median","Median",h2->GetXaxis()->GetNbins(),h2->GetXaxis()->GetXmin(),h2->GetXaxis()->GetXmax()); - for (int ib=0; ibGetYaxis()->GetNbins(); ib++) { - for (int ich=0; ichGetBinContent(ib+1,ch0+ich+1); - } - val=energyCalibrationFunctions::median(x, nch); - h1->SetBinContent(ib+1,val); - } - } - delete [] x; - - return h1; - -} - - - - - - - - - - - - - - -void energyCalibration::setStartParameters(Double_t *par){ - bg_offset=par[0]; - bg_slope=par[1]; - flex=par[2]; - noise=par[3]; - ampl=par[4]; - cs_slope=par[5]; -} - - -void energyCalibration::getStartParameters(Double_t *par){ - par[0]=bg_offset; - par[1]=bg_slope; - par[2]=flex; - par[3]=noise; - par[4]=ampl; - par[5]=cs_slope; -} - -#endif -int energyCalibration::setChargeSharing(int p) { - if (p>=0) { - cs_flag=p; -#ifdef MYROOT - if (p) { - fscurve->ReleaseParameter(5); - fspectrum->ReleaseParameter(1); - } else { - fscurve->FixParameter(5,0); - fspectrum->FixParameter(1,0); - } -#endif - } - - return cs_flag; -} - - -#ifdef MYROOT -void energyCalibration::initFitFunction(TF1 *fun, TH1 *h1) { - - Double_t min=fit_min, max=fit_max; - - Double_t mypar[6]; - - if (max==-1) - max=h1->GetXaxis()->GetXmax(); - - if (min==-1) - min=h1->GetXaxis()->GetXmin(); - - - if (bg_offset==-1) - mypar[0]=0; - else - mypar[0]=bg_offset; - - - if (bg_slope==-1) - mypar[1]=0; - else - mypar[1]=bg_slope; - - - if (flex==-1) - mypar[2]=(min+max)/2.; - else - mypar[2]=flex; - - - if (noise==-1) - mypar[3]=0.1; - else - mypar[3]=noise; - - if (ampl==-1) - mypar[4]=h1->GetBinContent(h1->GetXaxis()->FindBin(0.5*(max+min))); - else - mypar[4]=ampl; - - if (cs_slope==-1) - mypar[5]=0; - else - mypar[5]=cs_slope; - - fun->SetParameters(mypar); - - fun->SetRange(min,max); - -} - - -TF1* energyCalibration::fitFunction(TF1 *fun, TH1 *h1, Double_t *mypar, Double_t *emypar) { - - - TF1* fitfun; - - char fname[100]; - - strcpy(fname, fun->GetName()); - - if (plot_flag) { - h1->Fit(fname,"R0Q"); - } else - h1->Fit(fname,"R0Q"); - - - fitfun= h1->GetFunction(fname); - fitfun->GetParameters(mypar); - for (int ip=0; ip<6; ip++) { - emypar[ip]=fitfun->GetParError(ip); - } - return fitfun; -} - -TF1* energyCalibration::fitSCurve(TH1 *h1, Double_t *mypar, Double_t *emypar) { - initFitFunction(fscurve,h1); - return fitFunction(fscurve, h1, mypar, emypar); -} - - - - - -TF1* energyCalibration::fitSpectrum(TH1 *h1, Double_t *mypar, Double_t *emypar) { - initFitFunction(fspectrum,h1); - return fitFunction(fspectrum, h1, mypar, emypar); -} - - - -TF1* energyCalibration::fitSpectrumPixel(TH1 *h1, Double_t *mypar, Double_t *emypar) { - initFitFunction(fspixel,h1); - return fitFunction(fspixel, h1, mypar, emypar); -} - - - -TGraphErrors* energyCalibration::linearCalibration(int nscan, Double_t *en, Double_t *een, Double_t *fl, Double_t *efl, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff) { - - TGraphErrors *gr; - - Double_t mypar[2]; - - gr = new TGraphErrors(nscan,en,fl,een,efl); - - if (plot_flag) { - gr->Fit("pol1"); - gr->SetMarkerStyle(20); - } else - gr->Fit("pol1","0Q"); - - TF1 *fitfun= gr->GetFunction("pol1"); - fitfun->GetParameters(mypar); - - egain=fitfun->GetParError(1); - eoff=fitfun->GetParError(0); - - gain=funcs->setScanSign()*mypar[1]; - - off=mypar[0]; - - return gr; -} - - -TGraphErrors* energyCalibration::calibrate(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff, int integral) { - - TH1F *h; - - Double_t mypar[6], emypar[6]; - Double_t fl[nscan], efl[nscan]; - - - for (int ien=0; ien -#include -class TH1F; -class TH2F; -class TGraphErrors; -#endif - - -using namespace std; - - - - -const double conven=1000./3.6; /**< electrons/keV */ -const double el=1.67E-4; /**< electron charge in fC */ - - - -/** - \mainpage Common Root library for SLS detectors data analysis - * - * \section intro_sec Introduction - We know very well s-curves etc. but at the end everybody uses different functions ;-). - - * \subsection mot_sec Motivation - It would be greate to use everybody the same functions... - -*/ - - -/** - * - * -@libdoc The energiCalibration class contains all the necessary functions for s-curve fitting and linear calibration of the threshold. - * - * @short Energy calibration functions - * @author Anna Bergamaschi - * @version 0.1alpha - - - */ - -/** - class containing all the possible energy calibration functions (scurves with and without charge sharing, gaussian spectrum with and without charge sharing, possibility of chosing the sign of the X-axis) - -*/ -class energyCalibrationFunctions { - - public: - - energyCalibrationFunctions(int s=-1) {setScanSign(s);}; - - /** sets scan sign - \param s can be 1 (energy and x-axis have the same direction) or -1 (energy and x-axis have opposite directions) otherwise gets - \returns current scan sign can be 1 (energy and x-axis have the same direction) or -1 (energy and x-axis have opposite directions) - */ - int setScanSign(int s=0) {if (s==1 || s==-1) sign=s; return sign;};; - - -#ifdef MYROOT - /** - Gaussian Function with charge sharing pedestal - par[0] is the absolute height of the background pedestal - par[1] is the slope of the background pedestal - */ - Double_t pedestal(Double_t *x, Double_t *par); - - /** - Gaussian Function with charge sharing pedestal - par[0] is the absolute height of the background pedestal - par[1] is the slope of the background pedestal - par[2] is the gaussian peak position - par[3] is the RMS of the gaussian (and of the pedestal) - par[4] is the height of the function - par[5] is the fractional height of the charge sharing pedestal (scales with par[3]) - */ - Double_t gaussChargeSharing(Double_t *x, Double_t *par); - /** - Gaussian Function with charge sharing pedestal - par[0] is the absolute height of the background pedestal - par[1] is the slope of the background pedestal - par[2] is the gaussian peak position - par[3] is the RMS of the gaussian (and of the pedestal) - par[4] is the height of the function - par[5] is the fractional height of the charge sharing pedestal (scales with par[3]) - */ - Double_t gaussChargeSharingPixel(Double_t *x, Double_t *par); - - /** - Basic erf function - par[0] is the inflection point - par[1] is the RMS - par[2] is the amplitude - */ -Double_t erfFunction(Double_t *x, Double_t *par) ; - Double_t erfBox(Double_t *z, Double_t *par); - /** Erf function with charge sharing slope - par[0] is the pedestal - par[1] is the slope of the pedestal - par[2] is the inflection point - par[3] is the RMS - par[4] is the amplitude - par[5] is the angual coefficient of the charge sharing slope (scales with par[3]) - */ -Double_t erfFunctionChargeSharing(Double_t *x, Double_t *par); - - /** Double Erf function with charge sharing slope - par[0] is the pedestal - par[1] is the slope of the pedestal - par[2] is the inflection point of the first energy - par[3] is the RMS of the first energy - par[4] is the amplitude of the first energy - par[5] is the angual coefficient of the charge sharing slope of the first energy (scales with par[3]) - par[6] is the inflection point of the second energy - par[7] is the RMS of the second energy - par[8] is the amplitude of the second energy - par[9] is the angual coefficient of the charge sharing slope of the second energy (scales with par[8]) - */ - -Double_t erfFuncFluo(Double_t *x, Double_t *par); - - - /** - static function Gaussian with charge sharing pedestal with the correct scan sign - par[0] is the absolute height of the background pedestal - par[1] is the slope of the pedestal - par[2] is the gaussian peak position - par[3] is the RMS of the gaussian (and of the pedestal) - par[4] is the height of the function - par[5] is the fractional height of the charge sharing pedestal (scales with par[4] - */ - Double_t spectrum(Double_t *x, Double_t *par); - - /** - static function Gaussian with charge sharing pedestal with the correct scan sign - par[0] is the absolute height of the background pedestal - par[1] is the slope of the pedestal - par[2] is the gaussian peak position - par[3] is the RMS of the gaussian (and of the pedestal) - par[4] is the height of the function - par[5] is the fractional height of the charge sharing pedestal (scales with par[4] - */ - Double_t spectrumPixel(Double_t *x, Double_t *par); - - - /** Erf function with charge sharing slope with the correct scan sign - par[0] is the pedestal - par[1] is the slope of the pedestal - par[2] is the inflection point - par[3] is the RMS - par[4] is the amplitude - par[5] is the angual coefficient of the charge sharing slope (scales with par[3]) - */ - Double_t scurve(Double_t *x, Double_t *par); - - - - /** Double Erf function with charge sharing slope - par[0] is the pedestal - par[1] is the slope of the pedestal - par[2] is the inflection point of the first energy - par[3] is the RMS of the first energy - par[4] is the amplitude of the first energy - par[5] is the angual coefficient of the charge sharing slope of the first energy (scales with par[3]) - par[6] is the inflection point of the second energy - par[7] is the RMS of the second energy - par[8] is the amplitude of the second energy - par[9] is the angual coefficient of the charge sharing slope of the second energy (scales with par[8]) - */ - Double_t scurveFluo(Double_t *x, Double_t *par); - -#endif - -/** Calculates the median of an array of n elements */ - static double median(double *x, int n); -/** Calculates the median of an array of n elements (swaps the arrays!)*/ - static int quick_select(int arr[], int n); -/** Calculates the median of an array of n elements (swaps the arrays!)*/ - static int kth_smallest(int *a, int n, int k); - - private: - int sign; - - -}; - -/** - class alowing the energy calibration of photon counting and anlogue detectors - -*/ - -class energyCalibration { - - - public: - /** - default constructor - creates the function with which the s-curves will be fitted - */ - energyCalibration(); - - /** - default destructor - deletes the function with which the s-curves will be fitted - */ - ~energyCalibration(); - - /** sets plot flag - \param p plot flag (-1 gets, 0 unsets, >0 plot) - \returns current plot flag - */ - int setPlotFlag(int p=-1) {if (p>=0) plot_flag=p; return plot_flag;}; - - /** sets scan sign - \param s can be 1 (energy and x-axis have the same direction) or -1 (energy and x-axis have opposite directions) otherwise gets - \returns current scan sign can be 1 (energy and x-axis have the same direction) or -1 (energy and x-axis have opposite directions) - */ - int setScanSign(int s=0) {return funcs->setScanSign(s);}; - - /** sets plot flag - \param p plot flag (-1 gets, 0 unsets, >0 plot) - \returns current plot flag - */ - int setChargeSharing(int p=-1); - - - void fixParameter(int ip, Double_t val); - - void releaseParameter(int ip); - -#ifdef MYROOT - - /** - Creates an histogram with the median of nchannels starting from a specified one. the direction on which it is mediated can be selected (defaults to x=0) - \param h2 2D histogram on which the median will be calculated - \param ch0 starting channel - \param nch number of channels to be mediated - \param direction can be either 0 (x, default) or 1 (y) - \returns a TH1F histogram with the X-axis as a clone of the h2 Y (if direction=0) or X (if direction=0) axis, and on the Y axis the median of the counts of the mediated channels f h2 - */ - static TH1F* createMedianHistogram(TH2F* h2, int ch0, int nch, int direction=0); - - - /** sets the s-curve fit range - \param mi minimum of the fit range (-1 is histogram x-min) - \param ma maximum of the fit range (-1 is histogram x-max) - */ - void setFitRange(Double_t mi, Double_t ma){fit_min=mi; fit_max=ma;}; - - /** gets the s-curve fit range - \param mi reference for minimum of the fit range (-1 is histogram x-min) - \param ma reference for maximum of the fit range (-1 is histogram x-max) - */ - void getFitRange(Double_t &mi, Double_t &ma){mi=fit_min; ma=fit_max;}; - - -/** set start parameters for the s-curve function - \param par parameters, -1 sets to auto-calculation - par[0] is the pedestal - par[1] is the slope of the pedestal - par[2] is the inflection point - par[3] is the RMS - par[4] is the amplitude - par[5] is the angual coefficient of the charge sharing slope (scales with par[3]) -- always positive - */ - void setStartParameters(Double_t *par); - -/** get start parameters for the s-curve function - \param par parameters, -1 means auto-calculated - par[0] is the pedestal - par[1] is the slope of the pedestal - par[2] is the inflection point - par[3] is the RMS - par[4] is the amplitude - par[5] is the angual coefficient of the charge sharing slope (scales with par[3]) -- always positive - */ - void getStartParameters(Double_t *par); - - /** - fits histogram with the s-curve function - \param h1 1d-histogram to be fitted - \param mypar pointer to fit parameters array - \param emypar pointer to fit parameter errors - \returns the fitted function - can be used e.g. to get the Chi2 or similar - */ - TF1 *fitSCurve(TH1 *h1, Double_t *mypar, Double_t *emypar); - - - /** - fits histogram with the spectrum - \param h1 1d-histogram to be fitted - \param mypar pointer to fit parameters array - \param emypar pointer to fit parameter errors - \returns the fitted function - can be used e.g. to get the Chi2 or similar - */ - TF1 *fitSpectrum(TH1 *h1, Double_t *mypar, Double_t *emypar); - - - /** - fits histogram with the spectrum - \param h1 1d-histogram to be fitted - \param mypar pointer to fit parameters array - \param emypar pointer to fit parameter errors - \returns the fitted function - can be used e.g. to get the Chi2 or similar - */ - TF1 *fitSpectrumPixel(TH1 *h1, Double_t *mypar, Double_t *emypar); - - - /** - calculates gain and offset for the set of inflection points - \param nscan number of energy scans - \param en array of energies (nscan long) - \param een array of errors on energies (nscan long) - can be NULL! - \param fl array of inflection points (nscan long) - \param efl array of errors on the inflection points (nscan long) - \param gain reference to gain resulting from the fit - \param off reference to offset resulting from the fit - \param egain reference to error on the gain resulting from the fit - \param eoff reference to the error on the offset resulting from the fit - \returns graph energy vs inflection point - */ - TGraphErrors* linearCalibration(int nscan, Double_t *en, Double_t *een, Double_t *fl, Double_t *efl, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff); - - /** - calculates gain and offset for the set of energy scans - \param nscan number of energy scans - \param en array of energies (nscan long) - \param een array of errors on energies (nscan long) - can be NULL! - \param h1 array of TH1 - \param gain reference to gain resulting from the fit - \param off reference to offset resulting from the fit - \param egain reference to error on the gain resulting from the fit - \param eoff reference to the error on the offset resulting from the fit - \returns graph energy vs inflection point - */ - TGraphErrors* calibrateScurves(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff){return calibrate(nscan, en, een, h1, gain, off, egain, eoff, 1);}; - - /** - calculates gain and offset for the set of energy spectra - \param nscan number of energy scans - \param en array of energies (nscan long) - \param een array of errors on energies (nscan long) - can be NULL! - \param h1 array of TH1 - \param gain reference to gain resulting from the fit - \param off reference to offset resulting from the fit - \param egain reference to error on the gain resulting from the fit - \param eoff reference to the error on the offset resulting from the fit - \returns graph energy vs peak - */ - TGraphErrors* calibrateSpectra(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff){return calibrate(nscan, en, een, h1, gain, off, egain, eoff, 0);}; - - -#endif - private: - -#ifdef MYROOT - /** - calculates gain and offset for the set of energies - \param nscan number of energy scans - \param en array of energies (nscan long) - \param een array of errors on energies (nscan long) - can be NULL! - \param h1 array of TH1 - \param gain reference to gain resulting from the fit - \param off reference to offset resulting from the fit - \param egain reference to error on the gain resulting from the fit - \param eoff reference to the error on the offset resulting from the fit - \param integral 1 is an s-curve set (default), 0 spectra - \returns graph energy vs peak/inflection point - */ - TGraphErrors* calibrate(int nscan, Double_t *en, Double_t *een, TH1F **h1, Double_t &gain, Double_t &off, Double_t &egain, Double_t &eoff, int integral=1); - - - /** - Initializes the start parameters and the range of the fit depending on the histogram characteristics and/or on the start parameters specified by the user - \param fun pointer to function to be initialized - \param h1 histogram from which to extract the range and start parameters, if not already specified by the user - -*/ - - void initFitFunction(TF1 *fun, TH1 *h1); - - - /** - Performs the fit according to the flags specified and returns the fitted function - \param fun function to fit - \param h1 histogram to fit - \param mypar pointer to fit parameters array - \param emypar pointer to fit parameter errors - \returns the fitted function - can be used e.g. to get the Chi2 or similar - */ - TF1 *fitFunction(TF1 *fun, TH1 *h1, Double_t *mypar, Double_t *emypar); - -#endif - -#ifdef MYROOT - Double_t fit_min; /**< minimum of the s-curve fitting range, -1 is histogram x-min */ - Double_t fit_max; /**< maximum of the s-curve fitting range, -1 is histogram x-max */ - - Double_t bg_offset; /**< start value for the background pedestal */ - Double_t bg_slope; /**< start value for the background slope */ - Double_t flex; /**< start value for the inflection point */ - Double_t noise; /**< start value for the noise */ - Double_t ampl; /**< start value for the number of photons */ - Double_t cs_slope; /**< start value for the charge sharing slope */ - - - TF1 *fscurve; /**< function with which the s-curve will be fitted */ - - TF1 *fspectrum; /**< function with which the spectrum will be fitted */ - - TF1 *fspixel; /**< function with which the spectrum will be fitted */ - -#endif - - energyCalibrationFunctions *funcs; - int plot_flag; /**< 0 does not plot, >0 plots (flags?) */ - - int cs_flag; /**< 0 functions without charge sharing contribution, >0 with charge sharing contribution */ - -}; - -#endif - - - - - - - - - - - - - - - - - - - diff --git a/slsDetectorCalibration/gotthardDoubleModuleCommonModeSubtractionNew.h b/slsDetectorCalibration/gotthardDoubleModuleCommonModeSubtractionNew.h deleted file mode 100644 index 2960cabd4..000000000 --- a/slsDetectorCalibration/gotthardDoubleModuleCommonModeSubtractionNew.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef GOTTHARDDOUBLECOMMONMODESUBTRACTION_H -#define GOTTHARDDOUBLECOMMONMODESUBTRACTION_H - - -#include "commonModeSubtractionNew.h" - -class gotthardDoubleModuleCommonModeSubtraction : public commonModeSubtraction { - - /** @short class to calculate the common mode of the pedestals based on an approximated moving average*/ - - public: - - /** constructor - \param nn number of samples for the moving average to calculate the average common mode - \param iroi number of regions on which one can calculate the common mode separately. Defaults to 1 i.e. whole detector - - */ - gotthardDoubleModuleCommonModeSubtraction(int ns=3) : commonModeSubtraction(2, ns) {}; - - /** - gets the common mode ROI for pixel ix, iy - */ - virtual int getROI(int ix, int iy){return ix%2;}; - - -}; - - - -#endif diff --git a/slsDetectorCalibration/gotthardExecutables/Makefile.onTheFly b/slsDetectorCalibration/gotthardExecutables/Makefile.onTheFly deleted file mode 100644 index da6e994ef..000000000 --- a/slsDetectorCalibration/gotthardExecutables/Makefile.onTheFly +++ /dev/null @@ -1,22 +0,0 @@ - -CBFLIBDIR=/afs/psi.ch/project/sls_det_software/CBFlib-0.9.5 -LIBRARYCBF=$(CBFLIBDIR)/lib/*.o ../tiffIO.cpp -ZMQLIB=../../slsReceiverSoftware/include -INCDIR=-I.. -I../../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ -I. -I../interpolations -I../dataStructures -LIBHDF5=-L$(CBFLIBDIR)/lib/ -lhdf5 -LDFLAG= -L/usr/lib64/ -lpthread -#-L../../bin -MAIN=gotthard25umZmqAnalysis.C - -#DESTDIR?=../bin - -all: gotthard25umOnTheFlyAnalysis gotthard25umZmq - -gotthard25umOnTheFlyAnalysis: $(MAIN) $(INCS) clean - g++ -o gotthard25umOnTheAnalysis $(MAIN) -lm -ltiff -lstdc++ $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) - -gotthard25umZmq: $(MAIN) $(INCS) clean - g++ -o gotthard25umZmq $(MAIN) -lm -ltiff -lstdc++ $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DZMQ -L$(ZMQLIB) -lzmq - -clean: - rm -f gotthard25umOnTheFlyAnalysis diff --git a/slsDetectorCalibration/gotthardExecutables/gotthard25umZmqAnalysis.C b/slsDetectorCalibration/gotthardExecutables/gotthard25umZmqAnalysis.C deleted file mode 100644 index 49987b07b..000000000 --- a/slsDetectorCalibration/gotthardExecutables/gotthard25umZmqAnalysis.C +++ /dev/null @@ -1,517 +0,0 @@ -#include "sls_receiver_defs.h" -//#ifdef ZMQ -#include "ZmqSocket.h" -//#endif -#include -#include -#include -#include -#include -#include -//#include -//#include -//#include -#include -#include - -//#define BCHIP074_BCHIP075 - -#include "gotthardModuleDataNew.h" -#include "gotthardDoubleModuleDataNew.h" -#include "gotthardDoubleModuleCommonModeSubtractionNew.h" - -#include "singlePhotonDetector.h" -//#include "interpolatingDetector.h" -//#include "linearInterpolation.h" -#include "multiThreadedAnalogDetector.h" - -#include - -#define NC 1280 -#define NR 1 - -//#include "tiffIO.h" - - - - - -#define SLS_DETECTOR_JSON_HEADER_VERSION 0x2 -int main(int argc, char *argv[]){ - //void *gotthardProcessFrame() { - - - - int fifosize=1000; - int nthreads=1; - int nph, nph1; - int etabins=550; - double etamin=-1, etamax=2; - int nsubpix=1; - float *etah=new float[etabins*etabins]; - int *heta, *himage; - int offset=48; - #ifdef ZMQ - offset=0; - #endif - #ifndef ZMQ - offset=48; - #endif - - //commonModeSubtraction *cm=NULL; - - gotthardDoubleModuleCommonModeSubtraction *cm=new gotthardDoubleModuleCommonModeSubtraction(); - gotthardModuleDataNew *decoder=new gotthardModuleDataNew(); - gotthardDoubleModuleDataNew *det=new gotthardDoubleModuleDataNew(offset); - singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, cm, 1000, 100); - // analogDetector *filter=new analogDetector(det, 1, cm, 1000); - // analogDetector *filter_nocm=new analogDetector(det, 1, NULL, 1000); - filter->setROI(0,2560,0,1); - char *buff;//[2*(48+1280*2)]; - char *buff0; - char *buff1; - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - mt->setFrameMode(eFrame); - // mt->setFrameMode(eFrame); - // mt->setFrameMode(ePedestal); - mt->StartThreads(); - mt->popFree(buff); - buff0=buff; - buff1=buff+offset*2+1280*2; - int photons[1280*2]; - int nf=0; - int ok=0; - std::time_t end_time; - //int16_t dout[1280*2]; - int iFrame=-1; - int np=-1; - nph=0; - nph1=0; - //int np; - int iph; - int data_ready=1; - int *image; - - - - int length; - int nnx, nny,nns; - int nix, niy,nis; - // infinite loop - int ix, iy, isx, isy; - - filter->getImageSize(nnx, nny,nns); - int16_t *dout=new int16_t [nnx*nny]; - - - -#ifdef ZMQ - if (argc < 3 ) { - cprintf(RED, "Help: %s [receive socket ip] [receive starting port number] [send_socket ip] [send starting port number]\n",argv[0]); - return EXIT_FAILURE; - } - - // receive parameters - bool send = false; - char* socketip=argv[1]; - uint32_t portnum = atoi(argv[2]); - int size = nnx*nny*2; - - // send parameters if any - char* socketip2 = 0; - uint32_t portnum2 = 0; - if (argc > 3) { - send = true; - socketip2 = argv[3]; - portnum2 = atoi(argv[4]); - } - cout << "\nrx socket ip : " << socketip << - "\nrx port num : " << portnum ; - if (send) { - cout << "\nsd socket ip : " << socketip2 << - "\nsd port num : " << portnum2; - } - cout << endl; - - - - // receive socket - ZmqSocket* zmqsocket0 = new ZmqSocket(socketip,portnum); - if (zmqsocket0->IsError()) { - cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", portnum, socketip); - delete zmqsocket0; - return EXIT_FAILURE; - } - - ZmqSocket* zmqsocket1 = new ZmqSocket(socketip,portnum+1); - if (zmqsocket1->IsError()) { - cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", portnum+1, socketip); - delete zmqsocket1; - delete zmqsocket0; - return EXIT_FAILURE; - } - - - zmqsocket0->Connect(); - printf("Zmq Client 0 at %s\n", zmqsocket0->GetZmqServerAddress()); - zmqsocket1->Connect(); - printf("Zmq Client 1 at %s\n", zmqsocket1->GetZmqServerAddress()); - - // send socket - ZmqSocket* zmqsocket2 = 0; - ZmqSocket* zmqsocket3 = 0; - if (send) { - zmqsocket2 = new ZmqSocket(portnum2, socketip2); - if (zmqsocket2->IsError()) { - bprintf(RED, "Error: Could not create Zmq socket server on port %d and ip %s\n", portnum2, socketip2); - delete zmqsocket2; - delete zmqsocket1; - delete zmqsocket0; - return EXIT_FAILURE; - } - - zmqsocket3 = new ZmqSocket(portnum2+1, socketip2); - if (zmqsocket3->IsError()) { - bprintf(RED, "Error: Could not create Zmq socket server on port %d and ip %s\n", portnum2+1, socketip2); - delete zmqsocket3; - delete zmqsocket2; - delete zmqsocket1; - delete zmqsocket0; - return EXIT_FAILURE; - } - - zmqsocket2->Connect(); - printf("Zmq Server 0 started at %s\n", zmqsocket2->GetZmqServerAddress()); - zmqsocket3->Connect(); - printf("Zmq Server 1 started at %s\n", zmqsocket3->GetZmqServerAddress()); - } - - - - - - - - uint64_t acqIndex1 = -1; - uint64_t frameIndex1 = -1; - uint32_t subframeIndex1 = -1; - uint64_t fileindex1 = -1; - string filename1 = ""; - - uint64_t acqIndex0 = -1; - uint64_t frameIndex0 = -1; - uint32_t subframeIndex0 = -1; - uint64_t fileindex0 = -1; - string filename0 = ""; - - - int eoa0=0; - int eoa1=0; - - - - - - #endif - - - - - - - - - - - - - char ofname[10000]; - char fn0[10000], fn1[10000]; - FILE *fout=NULL; - FILE *fclust=NULL; - for (int i=0; ireadNextFrame(filebin0, iFrame, np, buff0)) && (decoder->readNextFrame(filebin1, iFrame, np, buff1))) { -#endif - - - - - -#ifdef ZMQ - - int end_of_acquisition; - while(1) { - end_of_acquisition=0; - eoa0=0; - eoa1=0; - - // cout << "Receive header " << nf << endl; - if (!zmqsocket0->ReceiveHeader(0, acqIndex0, frameIndex0, subframeIndex0, filename0, fileindex0)) { - - // cout << "************************************************************************** packet0!*****************************"<< endl; - eoa0=1; - end_of_acquisition++; - } - if (!zmqsocket1->ReceiveHeader(0, acqIndex1, frameIndex1, subframeIndex1, filename1, fileindex1)) { - //cout << "************************************************************************** packet1!*****************************"<< endl; - eoa1=1; - end_of_acquisition++; - } - - - - - - // if ((!zmqsocket0->ReceiveHeader(0, acqIndex0, frameIndex0, subframeIndex0, filename0, fileindex0)) && (!zmqsocket1->ReceiveHeader(0, acqIndex1, frameIndex1, subframeIndex1, filename1, fileindex1))){ - if (end_of_acquisition==0) { - - if (acqIndex0!=acqIndex1) - cout << "different acquisition indexes " << acqIndex0 << " and " << acqIndex1 << endl; - if (frameIndex0!=frameIndex1) - cout << "different frame indexes " << frameIndex0 << " and " << frameIndex1 << endl; - - - while (frameIndex0ReceiveData(0, buff0, size/2); - if (!zmqsocket0->ReceiveHeader(0, acqIndex0, frameIndex0, subframeIndex0, filename0, fileindex0)) { - end_of_acquisition++; - eoa0=1; - break; - } - } - - while (frameIndex1ReceiveData(0, buff1, size/2); - if (!zmqsocket1->ReceiveHeader(0, acqIndex1, frameIndex1, subframeIndex1, filename1, fileindex1)) { - end_of_acquisition++; - eoa1=1; - break; - } - } - } - - - - if (eoa0!=eoa1) { - - while (eoa0<1) { - length = zmqsocket0->ReceiveData(0, buff0, size/2); - if (!zmqsocket0->ReceiveHeader(0, acqIndex0, frameIndex0, subframeIndex0, filename0, fileindex0)) { - end_of_acquisition++; - eoa0=1; - } - } - - - while (eoa1<1) { - length = zmqsocket1->ReceiveData(0, buff1, size/2); - if (!zmqsocket1->ReceiveHeader(0, acqIndex1, frameIndex1, subframeIndex1, filename1, fileindex1)) { - end_of_acquisition++; - eoa1=1; - } - } - } - - - - - - - if (end_of_acquisition) { - // cout << "************************************************************************** END OF FRAME" << end_of_acquisition << " !*****************************"<< endl; - // return 0; - - sprintf(ofname,"%s_%d.ph",fn0,irun); - while (mt->isBusy()) {;} - image=filter->getImage(); - if (image) { - fout=fopen(ofname,"w"); - cout << nf << "*****************" << endl; - for (int i=0; i<2560; i++) { - fprintf(fout,"%d %d\n",i,image[i]); - dout[i]=image[i]; - if (dout[i]<0) - dout[i]=0; - } - fclose(fout); - } - - - if (send) { - - zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fn0, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - zmqsocket3->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fn1, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - - zmqsocket2->SendData((char*)dout,size/2); - zmqsocket3->SendData(((char*)dout)+size/2,size/2); - // // cprintf(GREEN, "Sent Data\n"); - - - zmqsocket2->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - zmqsocket3->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - } - - - //mt->setFrameMode(eFrame); - filter->clearImage(); - // std::time(&end_time); - // cout << std::ctime(&end_time) << " " << nf << endl; - fclose(fclust); - fclust=NULL; - - - - continue; - } - - if (fclust==NULL) { - - strcpy(fn0,filename0.c_str()); - strcpy(fn1,filename1.c_str()); - sprintf(ofname,"%s_%d.clust",fn0,irun); - fclust=fopen(ofname,"w"); - while (mt->isBusy()) {;} - mt->setFilePointer(fclust); - } - - // strcpy(fn0,filename0.c_str()); - // strcpy(fn1,filename1.c_str()); - - // cout << "Receive data " << nf << endl; - length = zmqsocket0->ReceiveData(0, buff0, size/2); - length += zmqsocket1->ReceiveData(0, buff1, size/2); - - irun=fileindex0; - - - - // // if (nf>100) - // // mt->setFrameMode(eFrame); - // //filter->clearImage(); - - -#endif - - - mt->pushData(buff); - mt->nextThread(); - // cout << "==" << nf << endl; - - // while (mt->isBusy()) {;} - // image=filter->getImage(); - // if (image) { - // for (int i=0; i<2560; i++) { - // // if (i<512) - - // // fprintf(fout,"%d %d\n",i,image[i]); - // dout[i]=filter->subtractPedestal(buff,i,0,1);//image[i];//filter->getPedestal(i,0);// - // if (dout[i]<0) - // dout[i]=0; - // // cout << i << " " << image[i] << " " << dout[i] << endl; - // } - // } - - - // if (send) { - // strcpy(fname0,filename0.c_str()); - // strcpy(fname1,filename1.c_str()); - // // zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,16,fileindex,400,400,400*400, acqIndex,frameIndex,fname, acqIndex, 0,0,0,0,0,0,0,0,0,0,0,1); - // zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fname0, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - // zmqsocket3->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fname1, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - - // zmqsocket2->SendData((char*)dout,size/2); - // zmqsocket3->SendData(((char*)dout)+size/2,size/2); - // // cprintf(GREEN, "Sent Data\n"); - - - // // zmqsocket2->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - // // zmqsocket3->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - - // // cprintf(RED, "Received %d frames\n", nf); - - // } - - - mt->popFree(buff); - buff0=buff; - buff1=buff+offset*2+1280*2; - - - - nf++; - - - - -#ifndef ZMQ - - - - - while (mt->isBusy()) {;} - image=filter->getImage(); - if (image) { - fout=fopen(ofname,"w"); - //cout << nf << "*****************" << endl; - for (int i=0; i<512; i++) { - fprintf(fout,"%d %d\n",i,image[i]); - } - fclose(fout); - } - filter->clearImage(); - - - - iFrame=-1; - } - - filebin0.close(); - filebin1.close(); - } - else - cout << "Could not open file " << fname0<< " or " << fname1 << endl; -#endif - - } - return NULL; - - - -} diff --git a/slsDetectorCalibration/interpolatingDetector.h b/slsDetectorCalibration/interpolatingDetector.h deleted file mode 100644 index ded09d419..000000000 --- a/slsDetectorCalibration/interpolatingDetector.h +++ /dev/null @@ -1,653 +0,0 @@ -#ifndef INTERPOLATINGDETECTOR_H -#define INTERPOLATINGDETECTOR_H - - -#include "singlePhotonDetector.h" - -#include "slsInterpolation.h" - -//#define M015 - -#ifdef MYROOT1 -#include - -#endif - - -#include - -using namespace std; - - -class interpolatingDetector : public singlePhotonDetector { - - /** @short class to perform pedestal subtraction etc. and find single photon clusters for an analog detector */ - - public: - - - /** - - Constructor (no error checking if datasize and offsets are compatible!) - \param d detector data structure to be used - \param csize cluster size (should be an odd number). Defaults to 3 - \param nsigma number of rms to discriminate from the noise. Defaults to 5 - \param sign 1 if photons are positive, -1 if negative - \param cm common mode subtraction algorithm, if any. Defaults to NULL i.e. none - \param nped number of samples for pedestal averaging - \param nd number of dark frames to average as pedestals without photon discrimination at the beginning of the measurement - - - */ - - - interpolatingDetector(slsDetectorData *d, slsInterpolation *inte, - double nsigma=5, - int sign=1, - commonModeSubtraction *cm=NULL, - int nped=1000, - int nd=100, int nnx=-1, int nny=-1) : - singlePhotonDetector(d, 3,nsigma,sign, cm, nped, nd, nnx, nny) , interp(inte), id(0) { - //cout << "**"<< xmin << " " << xmax << " " << ymin << " " << ymax << endl; - -}; - - - - interpolatingDetector(interpolatingDetector *orig) : singlePhotonDetector(orig) { - interp=(orig->interp)->Clone(); - id=orig->id; - /* xmin=orig->xmin; */ - /* xmax=orig->xmax; */ - /* ymin=orig->ymin; */ - /* ymax=orig->ymax; */ - - } - - - virtual interpolatingDetector *Clone() { - return new interpolatingDetector(this); - } - - virtual int setId(int i) {id=i; interp->setId(id); return id;}; - - virtual void prepareInterpolation(int &ok) { - cout << "*"<< endl; -#ifdef SAVE_ALL - char tit[1000]; - sprintf(tit,"/scratch/ped_%d.tiff",id); - writePedestals(tit); - sprintf(tit,"/scratch/ped_rms_%d.tiff",id); - writePedestalRMS(tit); - if (gmap) { - sprintf(tit,"/scratch/gmap_%d.tiff",id); - writeGainMap(tit); - } -#endif - if (interp) - interp->prepareInterpolation(ok); - } - - - void clearImage() {if (interp) interp->clearInterpolatedImage(); else singlePhotonDetector::clearImage();}; - - int getImageSize(int &nnx, int &nny, int &ns) {if (interp) return interp->getImageSize(nnx, nny, ns); else return analogDetector::getImageSize(nnx, nny, ns);}; - #ifdef MYROOT1 - virtual TH2F *getImage() -#endif -#ifndef MYROOT1 - virtual int *getImage() -#endif - { - // cout << "image " << endl; - if (interp) - return interp->getInterpolatedImage(); - else - return analogDetector::getImage(); - //cout << "null " << endl; - } - -#ifdef MYROOT1 - virtual TH2F *addToInterpolatedImage(char *data, int *val, int &nph) -#endif -#ifndef MYROOT1 - virtual int *addToInterpolatedImage(char *data, int *val, int &nph) -#endif - { - nph=addFrame(data,val,0); - if (interp) - return interp->getInterpolatedImage(); - else - singlePhotonDetector::getImage(); - //return NULL; - }; - - -#ifdef MYROOT1 - virtual TH2F *addToFlatField(char *data, int *val, int &nph) -#endif -#ifndef MYROOT1 - virtual int *addToFlatField(char *data, int *val, int &nph) -#endif - { - nph=addFrame(data,val,1); - if (interp) - return interp->getFlatField(); - else - return NULL; - }; - - void *writeImage(const char * imgname) { - // cout << id << "=" << imgname<< endl; - if (interp) - interp->writeInterpolatedImage(imgname); - else - analogDetector::writeImage(imgname); - return NULL; - } - -int addFrame(char *data, int *ph=NULL, int ff=0) { - - - int nph=0; - double val[ny][nx]; - int cy=(clusterSizeY+1)/2; - int cs=(clusterSize+1)/2; - int ir, ic; - double rms; - double int_x,int_y, eta_x, eta_y; - double max=0, tl=0, tr=0, bl=0,br=0, *v, vv; - // cout << "********** Add frame "<< iframe << endl; - if (ph==NULL) - ph=image; - - if (iframerms=rms; - - - - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - - if ((iy+ir)>=iy && (iy+ir)=ix && (ix+ic)=0) - br+=*v; - if (ir>=0 && ic<=0) - tl+=*v; - if (ir>=0 && ic>=0) - tr+=*v; - if (*v>max) { - max=*v; - } - - - if (ir==0 && ic==0) { - if (*v<-nSigma*rms) - eventMask[iy][ix]=NEGATIVE_PEDESTAL; - } - - } - } - - if (bl>=br && bl>=tl && bl>=tr) { - (clusters+nph)->quad=BOTTOM_LEFT; - (clusters+nph)->quadTot=bl; - } else if (br>=bl && br>=tl && br>=tr) { - (clusters+nph)->quad=BOTTOM_RIGHT; - (clusters+nph)->quadTot=br; - } else if (tl>=br && tl>=bl && tl>=tr) { - (clusters+nph)->quad=TOP_LEFT; - (clusters+nph)->quadTot=tl; - } else if (tr>=bl && tr>=tl && tr>=br) { - (clusters+nph)->quad=TOP_RIGHT; - (clusters+nph)->quadTot=tr; - } - - if (max>nSigma*rms || tot>sqrt(clusterSizeY*clusterSize)*nSigma*rms || ((clusters+nph)->quadTot)>sqrt(cy*cs)*nSigma*rms) { - if (val[iy][ix]>=max) { - eventMask[iy][ix]=PHOTON_MAX; - (clusters+nph)->tot=tot; - (clusters+nph)->x=ix; - (clusters+nph)->y=iy; - (clusters+nph)->iframe=det->getFrameNumber(data); - (clusters+nph)->ped=getPedestal(ix,iy,0); - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - (clusters+nph)->set_data(val[iy+ir][ix+ic],ic,ir); - } - } - - - - - if (interp) { - if (ff) { - interp->addToFlatField((clusters+nph)->quadTot,(clusters+nph)->quad,(clusters+nph)->get_cluster(),eta_x, eta_y); - } else { - interp->getInterpolatedPosition(ix, iy, (clusters+nph)->quadTot,(clusters+nph)->quad,(clusters+nph)->get_cluster(),int_x, int_y); - interp->addToImage(int_x, int_y); - } - } else - image[ix+nx*iy]++; - - - - - - - - - - - nph++; - image[iy*nx+ix]++; - - } else { - eventMask[iy][ix]=PHOTON; - } - } else if (eventMask[iy][ix]==PEDESTAL) { - addToPedestal(data,ix,iy); - } - - - } - } - nphFrame=nph; - nphTot+=nph; - //cout << nphFrame << endl; - // cout <<"**********************************"<< endl; - writeClusters(); - return nphFrame; - -}; - - /********************************************************* - int addFrame(char *data, int ff=0) { - - double g=1; - - single_photon_hit *cl; - single_photon_hit clust; - if (clusters) - cl=clusters; - else - cl=&clust; - - - int ccs=clusterSize; - int ccy=clusterSizeY; - - double int_x,int_y, eta_x, eta_y; - int nph=0; - double rest[ny][nx]; - int cy=(clusterSizeY+1)/2; - int cs=(clusterSize+1)/2; - int ir, ic; - double cc[2][2]; - double max=0, tl=0, tr=0, bl=0,br=0, v, vv; - int xoff,yoff; - int skip=0; - // cout <<"fr"<< endl; - double tthr; - if (iframe=ymin && (iy+ir)=xmin && (ix+ic)set_data(rest[iy+ir][ix+ic], ic, ir); - - if (ir>=0 && ic>=0 ) - rest[iy+ir][ix+ic]=subtractPedestal(data,ix+ic,iy+ir); - - v=rest[iy+ir][ix+ic];//cluster->get_data(ic,ir); - tot+=v; - - if (ir<=0 && ic<=0) - bl+=v; - if (ir<=0 && ic>=0) - br+=v; - if (ir>=0 && ic<=0) - tl+=v; - if (ir>=0 && ic>=0) - tr+=v; - - if (v>max) { - max=v; - } - // if (ir==0 && ic==0) { - if (v>tthr) { - eventMask[iy][ix]=NEIGHBOUR; - } - //} - } - } - } - if (rest[iy][ix]<=-tthr) { - eventMask[iy][ix]=NEGATIVE_PEDESTAL; - //if (cluster->get_data(0,0)>=max) { - } else if (max>tthr || tot>sqrt(ccy*ccs)*tthr || quadTot>sqrt(cy*cs)*tthr) { - if (rest[iy][ix]>=max) { - if (bl>=br && bl>=tl && bl>=tr) { - cl->quad=BOTTOM_LEFT; - cl->quadTot=bl; - } else if (br>=bl && br>=tl && br>=tr) { - cl->quad=BOTTOM_RIGHT; - cl->quadTot=br; - } else if (tl>=br && tl>=bl && tl>=tr) { - cl->quad=TOP_LEFT; - cl->quadTot=tl; - } else if (tr>=bl && tr>=tl && tr>=br) { - cl->quad=TOP_RIGHT; - cl->quadTot=tr; - } - - - eventMask[iy][ix]=PHOTON_MAX; - cl->tot=tot; - cl->x=ix; - cl->y=iy; - cl->ped=getPedestal(ix,iy, 0); - cl->rms=getPedestalRMS(ix,iy); - - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - if ((iy+ir)>=ymin && (iy+ir)=xmin && (ix+ic)set_data(rest[iy+ir][ix+ic],ic,ir); - } - } - } - - - if (interp) { - if (ff) { -#ifdef M015 - if (iy>100) -#endif - interp->addToFlatField(cl->quadTot,cl->quad,cl->get_cluster(),eta_x, eta_y); - // if ((eta_x<0.1 || eta_x>0.9)&&(eta_y<0.1 || eta_y>0.9)) - // cout << ix << " " << iy << " " << eta_x <<" " << eta_y << endl; - - } else { - interp->getInterpolatedPosition(ix, iy, cl->quadTot,cl->quad,cl->get_cluster(),int_x, int_y); - interp->addToImage(int_x, int_y); - } - - } else - image[ix+nx*iy]++; - - nph++; - - if (clusters) cl=(clusters+nph); - - - // rest[iy][ix]-=tthr; - } else - eventMask[iy][ix]=PHOTON; - //else if (thr<=0 ) { - //addToPedestal(data,ix,iy); - // } - } - if (eventMask[iy][ix]==PEDESTAL) { - addToPedestal(data,ix,iy); - } - } - } - return nph; - } - - ******************************************/ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /* for (int ix=0; ixrms=getPedestalRMS(ix,iy); */ - /* //(clusters+nph)->rms=getPedestalRMS(ix,iy); */ - - /* // cout << iframe << " " << nph << " " << ix << " " << iy << endl; */ - /* if (ix==0 || iy==0) */ - /* val[iy][ix]=subtractPedestal(data,ix,iy); */ - - /* if (val[iy][ix]<-nSigma*cl->rms) { */ - /* eventMask[iy][ix]=NEGATIVE_PEDESTAL; */ - /* // cout << "neg ped" << endl; */ - /* } else { */ - /* for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { */ - /* for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { */ - - - /* if ((iy+ir)>=0 && (iy+ir)=0 && (ix+ic)=0 && ic>=0) { */ - /* val[iy+ir][ix+ic]=subtractPedestal(data,ix+ic,iy+ir); */ - /* eventMask[iy+ir][ix+ic]=PEDESTAL; */ - /* } */ - - /* // cout << ir << " " << ic << " " << val[iy+ir][ix+ic] << endl; */ - /* v=&(val[iy+ir][ix+ic]); */ - /* // if (skip==0) { */ - /* tot+=*v; */ - /* if (ir<=0 && ic<=0) */ - /* bl+=*v; */ - /* if (ir<=0 && ic>=0) */ - /* br+=*v; */ - /* if (ir>=0 && ic<=0) */ - /* tl+=*v; */ - /* if (ir>=0 && ic>=0) */ - /* tr+=*v; */ - /* if (*v>max) { */ - /* max=*v; */ - /* } */ - - /* } */ - /* } */ - /* } */ - - /* if (bl>=br && bl>=tl && bl>=tr) { */ - /* cl->quad=BOTTOM_LEFT; */ - /* cl->quadTot=bl; */ - /* } else if (br>=bl && br>=tl && br>=tr) { */ - /* cl->quad=BOTTOM_RIGHT; */ - /* cl->quadTot=br; */ - /* } else if (tl>=br && tl>=bl && tl>=tr) { */ - /* cl->quad=TOP_LEFT; */ - /* cl->quadTot=tl; */ - /* } else if (tr>=bl && tr>=tl && tr>=br) { */ - /* cl->quad=TOP_RIGHT; */ - /* cl->quadTot=tr; */ - /* } */ - - /* if (max>nSigma*cl->rms || tot>sqrt(clusterSizeY*clusterSize)*nSigma*cl->rms || (cl->quadTot)>sqrt(cy*cs)*nSigma*cl->rms) { */ - /* if (val[iy][ix]>=max) { */ - /* eventMask[iy][ix]=PHOTON_MAX; */ - /* cl->tot=tot; */ - /* cl->x=ix; */ - /* cl->y=iy; */ - /* cl->ped=getPedestal(ix,iy, 0); */ - - /* if (interp) { */ - /* if (ff) { */ - /* interp->addToFlatField(cl->quadTot,cl->quad,cl->get_cluster(),eta_x, eta_y); */ - /* // if ((eta_x<0.1 || eta_x>0.9)&&(eta_y<0.1 || eta_y>0.9)) */ - /* // cout << ix << " " << iy << " " << eta_x <<" " << eta_y << endl; */ - /* } else { */ - /* interp->getInterpolatedPosition(ix, iy, cl->quadTot,cl->quad,cl->get_cluster(),int_x, int_y); */ - /* interp->addToImage(int_x, int_y); */ - /* } */ - /* } else */ - /* image[ix+nx*iy]++; */ - - /* if (clusters) cl=(clusters+nph); */ - - /* nph++; */ - - /* } else { */ - /* eventMask[iy][ix]=PHOTON; */ - /* } */ - /* } else if (eventMask[iy][ix]==PEDESTAL) { */ - /* addToPedestal(data,ix,iy); */ - /* } */ - - /* } */ - /* } */ - /* } */ - /* return nph; */ - - /* }; */ - - - - - - - - - - virtual void processData(char *data, int *val=NULL) { - if (interp){ - switch(fMode) { - case ePedestal: - addToPedestal(data); - break; - case eFlat: - addFrame(data,val,1); - break; - default: - addFrame(data,val,0); - } - } else - singlePhotonDetector::processData(data,val); - - - }; - - virtual char *getInterpolation(){return (char*)interp;}; - - protected: - - - slsInterpolation *interp; - int id; -}; - - - - - -#endif diff --git a/slsDetectorCalibration/interpolations/.__afs3A48 b/slsDetectorCalibration/interpolations/.__afs3A48 deleted file mode 100755 index efa6b3d1690a42bc947def03b9f1c41b3bd1e613..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48795 zcmeHw3w)E+`TyINLgmsH1XtbEs8vw0YkGmgKogpj6bi()Kv6UeNlJrh6O$B*GOd(b ztkuq`^XE3#ZO%F8wz{c*bY6;}pu1S_Ox>)`OCl--Z#bv@f1h(nPu?bov+VQ#eLnve z(sQ2gdCv2k^PJ~g-@I?Gv{qH5r=@A~%Fxc$h%(IJh)E=rb%_W9lUAmU#@~~)Z!+G@ zp`>B4MO!%}Lr7)-=@^ZVU8LK$a$JVn#xORmTZA%Sy2#hNji>i+zh}%*g$D_Lt)S)$q!Qr*CAA9iMffbi=X`vY;v=sM5Lt=OMG{a#C*rH{ z@d&H|p;yG$i0~4GP53n9UT=L&qT#D}h{@Y#q@ zJ3gE7={x=HPycf9`_9MjYN#lmeaS^H4SpCpXU$)h&NtVb^z*k*`a$*&H;z92>?<4Y zcP_r;M*pEhH~lqzcg8bo?yi2T;J|mzI;-N7_G?S3FB?C5-?RI(ubO@E^57@8HW=rB z{||dAeqcK9nl~P5xbxXV51#tj^zEGovj5NcCHK95a>lOimR#T7mfxKAk3Zbmw7GiR zs^9PX>Ce17Zv4s5&w4TH`?TRF=dNzKGjNT=weY3v({4f9Y?Hg}>Z1&y9 z-F@ZHs!HkLj=iIz` z*5}{-^u6K-uF5>rc;fWGo;>!&Pab>`<^A}Ug{ucw?r=@Jcjufx{`2|`FE2c<@x#Ge z8)nY>(JP-md*6@G-0Jy*;gOfd9&__uxjX)uvEKE$&+y=ax(EMuY2CN}uxj)&m@Va% z0S`T7OibQ0LDMEBLX2|dB*)KB!T(VT{Hbxt<;+aMe@1q4{(HwK$7iI#uTG(NeG2}n z6ndXZfqx5DIyH&iPRLDO&X2|>$H%0w!^9MN&q{&&Q?yqv$}=%ZIqOr%c_W3K&r_81 zmnr1TNm1X|Qt;bTwAXi2l;^?}c0L<*H6*F;zf;Kha|(YrH3fca3OOd=$?Uv7g&kT_ z)c2Yc^?ELa-av|W$xWemT?+gEFom4&q$uZt6y@2GLXJCyoV!x+|04x|e~NawCq=!| zQuxEx6nd{qA?GaCF5|R%nh0^7P74EEnFvqSfYW4$E1d`0FR|#DsO4$(*BTgt?Cjc% zg#zK-I((GCyL9+fLVmYSz6lGQNzj`+lgpKQKSKE@YR79)A&2TuS2wfgIIV3Cr{$Rc z7#OJhy_a%aR7?95iy4Lsy>e~&6QQ?I=zW@J(;hDuuq##{&C1YNgJ<~(E>!dLPCzFlQRwdh4l6bIme1T*9v?< z;BY^7`Gp+}I{TlQ!`r2P3Fo^@RNy{=2WmKeyjYZGiSqP!8d!q#6AC9KnXhLu{~V|F zEaGyid7$k^doh0~NUOXkY1X1wwv6$A6xXGoUN~n?i4&&`awBx_*Zb+07vE z9EM^IpTe)+5aqG!%JYn9mwqc3aEq|Rzl40d&dw$={@8WpuN38M)7j@Dp*L5j_es&e zdIT=qR%;M)x^!}?Ct}a19T?mz^or_gw+sFr9sepJze}e#U*G{9o-M|)0paJH!AIAh zM7tPt_5CT*$*%^)K3bN)Q}|oJ%=53{fwmJNwO64ir}PJpsMmn5UNeQ=G+jBb7IO6M z{teMCCS5uAi}Lh|^87+59xuijO*hW$5c5TkPR@X^Pq!H7e~0{Z(Z+!4rRnOm3w}uU zF$jC^VchUr)~_dMlQ(bx?#Heb!VdcOEfVb;(8<>vj@3>6W=AOO42B&J&EakKhBZe6 z0wlRwofLKYyq9@2$AYzvYR_tKDC`NA`<$VWC!{$pSZpk;Eq6Arb%rXN0wq;`*Cp1q zdU(dtW?#~TvdR$U@VJNPu@o_^c9|+)FW6!np0Tvt=MQ;?<3?kJKj`u-4Y-}*B*`-? zUH)co!}=r{3oBuh<=$quf8FrZlA1;dFI0;<%jOJO-QKW2$nzv58VixS$kW_1&zUs2 z2+1{JXSgMlf`Rha`u)BX$wrY}>kWj47uh&-zDLw&zQ^C>2?y6(tGzXaj_NfvMz}y? zn;MI2JYim#T2E`(YG3GrYv_1pf`?nk?hkpxUVpRIJDiIoajqITly%LTVRB019JSuC z&qK;;QUios1r2^2MXni^V~U5CkFEDouha1)^_5I*{vGhE!U+ z%o_~1IDO_|(7C>8X+k}9XrG={t;N<3a*7s`}z2&j`;TWJn&B@JMFVkjEKxHO4DcL{ddR;E7h{v8cajZ)gGgf4`gPVnygKf$G94k3f5c|XllE=hOLo{ zYb%W9Mp~iTE8GB!99FlRNm^J8p+=)U=%?`zC97kLX0KdaBd0e^1@eXM;h@~ZP%dK` zR_1liRGe_sYk*Jy3&?N-SQp2&t{BqFn0VDtWUt$;g}ltV(7+c=%#MmpmP@0Q((%$m+=-Vr$&QdW~G{Nnb#k3tin31gf>{f*;t~-xqaAH6dSiz+MQyhOUnsk ziQJAZ^1EBGTVP)0bi0LLuptG8K~L~0P>A_Yyi?JJ*UNUehh4ckE+}j8hV9I-%s_T> z0FtHH3>Jkc*nT#c(gUsii8E;~~?V4F@ zW9u_%ROaStlTxcv^Ox0PSKQR%a~g}_dUmYdu^;pVc@xbPJ9}iLmNXU%os~`KCZg|P z+vueW>9v*W2AIUFv{CHJnpVLXtkuRDwTnCyuWSwl&`tb7eTK4{aL|L|1g+IGYv;8z zGr_c z4Tl>dWq!cv7ST}H?K=Bx5CtnfBXM8_%`=47{~ zAJD+9%`Y!^6c?ZqS5?j{cN7&A6_oOLT^;a}f>{Za(WsTz)tTp2I*bLyYKl1fp(81N z+$Ii{1TK!?7?rN!AdX!b;$Db6aU(E2et(4X@Ix;C)e_2wLoIftDmLJ>8jgmV4<||z+y&fZ8}`i16L>VOI)7Y zOF8pexEy)^LgLE>F3-s&eu=;}ac(K`4Fb>A;nxUUp6g2fE`b;7_-_=rJYSXkw+P&> zF~V*@7Ccz6XogA;f3_Y7+k$Nyj9?Li1xy9 zt9Ak7xrfARq$4YzhA-S_mL<$s^A`l ze?Y<4DEJ`-uUBwQ+;1W~T&Un#3NB2~Qgao&N#V~^@Kp+KQ1A)`pQhlO6}(WvtqNYI z;Ef7yQt;UdZc}je)}>v+7byI73NCIzu+(}5KUd*zRB)ey2Nc||;H?U-ez~Yk!7o+# zw<-8M1@BVuas|Ix!B1B3ZUvvF;5`aX_ju*~#_bB;uJHGXacnfODh1!G;PSh6l-#f2 zISPMN!Nt(YQV%J(N#WNz42&YZmne9af>$bdu7b<&!%=dcf;$y{gMu$t@M#LZQo#!q z{9*+!Q}Aj9H!1jc6x^oZE(NzMxIw||6ueHs>lOTT1#eVvF+{S|fP#x#TMTbiaJM3- zO~KbG_%;Q1D0r8Gi(6hS^=1VZw-6cLt>CqaoI4a;+)`tyePTSP@v2DS-y`^G4TK3j ze)TE1y1v@0;OZ)@U%}}+mGX)zc%}pq4k$SJsJsp-IA52ElxqwuLYVwMCjnUsF6Uap za~1p;0>qW4;A16-(4gSs6nvV3;}&WBDpc?Zaa7aF6dYfbh+ifJSNpY1!R1&&nd}NK zmQYMqoq|t_OV_k|1()9)q2xvdr|%QXE1=*@C5W(9!OvIlHU*!e;M){j{qAm;f`3Ed zzgfZa6ueu(k5}+J6#N7Q?@{n?D)@E6g46eq<#kBGPm>^pod!mc|L3z9|C6QQUIoupaQaS@yz&(M3<)AMDEL$b zpQhkvDtMuSFH!I^1wTu{O$u&TaGQdkt>AVApRV9_3Vx1)*DH8|f;TGow-r2~;Drj_ zs^CTiZ&UC#1>dINW(Dt3@L~nOS;0#byj#IHD)=1=UaH_d3NF5y!BV#?xH>QND!4_F zV{3mmD|#|U^5_Hf=OYsyA!y%~wR5oaXDbZa;OV#FZ_ddk#E51q$XNd%uG4QJnx>Oj zAEU1)nx>FgFQcy}nx>9e52H5{4INsno6(mMO;bXwi_t-%X)1`dF?tQrLz0Ib`gNl7h^}Y!OGF<}w4Kq<5KTj5%*5y?iKd}3R>tb|}Xd04YZH!(+Gz~?u0HaqCO-u1uJ)fG^E4|89k5a=|meCJ)3A6LSng$E+U$Sj+n;ivxuf4BR24F z*8W7(P!a2A^a(`M5E1KR^dzEbX%*{b^jM;)>&JQ+olZ1$`B*oj|Fs-6b?I0aqYn~I zOT1Vcqu(K#x^^tU=+}uZBf6f^FA+V9Xgi~yA)2;wF%zSoB$}4au|h^aN;EB9V+KY) zK=fRqa~b`6qR%B-WAvRw)6@|g_-t^H#tB%s5i|P$+RNfJUDq5SgE~`9(?oh%rg*8yU@JyiJc8OCvQR#iGOYn zL~2V>fba=mzZ}}Bq}kB_1Ef4L*iYlw6FYf{xBu~)C)0K|6v+G^>};Uxh-qjzP-D;< zcALhcS{<1ms>D?2j;93Gl;5btfJ(Hh#1|^zREZl@;yRUhR3$Q1qDv)CQ;9R;1h4*3 z{bQe@6DaoJ?LYVPYP6(A{?IWu4Vj}K{)@#+DIVqVtBB_n9)F19eLT+ick%d*gm35Z ziIn#)9&aJMo5z1e@f&#j7Zl&dL&J<(&Sa-CBiJQiu4bE^TFBRkC7X-c@?4M%&pbrez}EAyxAw&a@t zXf{NsU$O`d5E=l32=i!$1f46wESe#AkIJXy=oqf|jai8QkP6#5WfNuy=zR;2PVZAA zr}sMEfC1{3&vLyRFcX?1y-?i>)wa&emoaph?`PFsin2a@9;W8hHMT`8%peA;7ubeX znIGjM5kUeV6^h*o7Yt8(*Stf5cL=Vkdzu zaXdEH@;(R$y?2JD8K1C39(~vi$xCaZy`NA$O4Ct#<1>$t%SPWLNgXGiv6vhAea10& zKg-DlA$tq5N86EPe8%`O&v!57gJ~Y33?1iCesg4(EwVrQYc3)T+gKz0#wTR{@`U^? zBL8=ZJF-8rGaBOgx}e$|**lbPTtdFNyu1%D;^jS;XIh)2ywAdJL*>mB`X*3@j&mr# zDDP+BgRyp@J0+C&`w96U`;f}{YVzI2}75dQkhH@C6 zNHp#l37P76rejdZ=t`dHA*j)3I)FM2X*!K(x`8xJ<(Yn%B-4Wlncn|^6>kY;I!Gq! zoVy`OrmZX!YkA|x(fe7Z6Q5kj+u#A7@7L&#`VuZlP<9pNgAF4*!|O>hoRpBkE;7{d z3=`2rdJXTP)!n9>X@J=Xay!M?f?2LVFkVfBG{#0t(dgM=i@rsF%&1dW z^p69GehlH!iTKkMT}V+zzlM~q=&xZDEN{m!sSVJF1G-wBNawnXIfem3Mg(%$3FwFg!^e{*5 zu8ce$T?wVOPD{QWo=%g!&DN1I*tH!Tn|pIM{Tr(rEX6H&CqQR?T2*J}oMI-W4pNZ8 zY8Xh=>zNwwz zN1Gibp`51Z0@mAd(H>-=>kYh!FO%Lf6ys0$JUdvMZ$gOLEbnc|DcEyadibVFXoBgH z2`vF*R^=NYHwy~_CYQBiFS9o6XyBYxk^L~r4iXou#(WC@66Lk$A_D})+kW#{oEE_Q zTB#G5FEU?jcI>oujDZ2{g)pVPtTOUg>}qT#Y>}O4r0BEcNEj^_!cxlqLON+(M|%6A zv~XVgq4bE zijdw$ijdv_MM!TeMWAP5&kyoBesr}G&1}0?NuG_{JJW{ z>Z>}!`HfZ39H3r`KGcT7qA@piQNUb!Bd;X$>W$qDW{$n_4iSfMZ|o6qxcA2GB2FIO zE8^tgdqlh}`YqJ3GP0|(qry%)5b|z=NIe-Q7m-GacDRi0?S}28_Xe-27jlF29`;Uh{41JOJ zqu)nkv4OxAd6b$cBZkKN2^vq10~={8FYHF!T#^O<+Gr4Q3? zGl@9a%_iby(Kn#J5>sx+mOf?zs^ylw!WvnK_lr0TxFss$u;G>g5r-MK91?La&I!>dvH=i{Hvr=OqNdc&@diLV-T;Wl8vyZm10X)s0RM(t zVP=H2j%owk$kdE*1DGIm1iRsZsO*N+0Bdn3hIt;N=@`sN9~{hCQGs!~t^x!9ip*Ov z_e2l8Nh9xy@+`oaHvj>VaiQ+~7Rz2+_=*_*}<6AFy64f7!z zh7j^$2oVEGhi6#%FoXynh7jSy5F#exL9e%pVd%iygM(F(x8Q)$``%*n0z24kwQRy9#g@TX@x0Mm~gFek9y7V8f1V(+sRpu$-ZdiVf|j?K_Q+KN)Nd z6M5AVd0*KM*;q4Tj^~STz8iXML!VfH&AkCC(ePFIV3fNWEctEG%i#zZaBLl@l_|QY z87t0>QTcmSJ#s!l8=qPeeAy>>?%QAxJR!deR} zuiOb!aXXC`Q;27NhFfh^hg_;dgE?o~(|~ESLGis5htp&A^+|k3hGL%ccjN;2HsTXr zLmVOPEyZ4qZ^Y13G+L_jMVoD~%Z|klfut8gktg#v$onw4KWW>;mZ!b6?Gjul#>1#2 z6_yyVWsA#zVmm9u^4^Cbmsqe;6nSYM^)TWbr96CBn1M~<3bZ>mg{`MiFl7S;k$=Eu zsE*hYf{5M*n=RV>MtDANF}PASIK`&0eOExPE9JV3R^8pOH#W8p)6HzqgZ9E$6BZ!x zbuJarp1bcid>_B@HMCC0l$U3*hM#aDZh?|TD1^2*PQ~(+4u8>r)cjbEey<-Zn)r@v zf7Fa3(n{xk^5IR;P5$@a-jBTty?j5mk$KyzHn|_$_$rF0Yy#yvY@|l?_?40rxSg7lrA#zg4 zHZ!)!3qqeEY6R~i1MvOmHxR=vY-Ro&{H@Keqd{j^2a3wJW-Bcnmi#%Evr%e@UJubs z#7@hZuR&b&0#?}C{Cac~+6dL#aKOPWNx;5G&e`oz2Gj-i87(D0Nn~*-_ zKUJ``0j95wyoCMTbdqk1zKHgE4vmMDmW8g?(bk4LGqjP3 zE~mIV!YT_qq}WZxqJ>N0P< zjO`>W&-=n-(R)D0r-DmPgbx#PP)kYjd5!Ok=PG9mNM=sM7>1v*O$!3{$rw*bB^ z03~~)E_)fvJ{q0uAif90W)|co`g1`mna|c`{_G{vP3L;|GUh?1n&>A5tz>>5%tN)_ z8GRTu8M_heYr#&Ij=adK&cSPjKt;?ibz;^DF@+HG?V%iGL2Ag((yAeliLv1<$DrXm zAV@bzrMZNf1Zo;W(Sr4KL?WkTc94lqi=}Gx#8+sI`F8Y1gtTHia3(-`K651JL07%I4W89Ldvwm$ z2$nY;lW_BP94365YjT&Zb5#0ZKPJmfV9_*eH0?A1pt~bl$D&yNBVI4!w9{`CaXL^4 zh&UZ6w2C+#D71+acv*Bhs!$o(0gR4EsxWI|cf)k$2_DjA5OLBqO~gr8{EP(g zGJ%sWlZcZpn~0Z1d*KHEg)@>BOwCc>q96Plb1584*}26=;-u`y5ITZe^u-WYh1mve zy4xB#gnc?YEWMe)2i<_Et#0e+!}y&`O#ur&0b`Vddq=3+h?yWn#yZqVLG_ds zo$Y<2_w-Sr=%^xE`OM&;1(S{)-axm?E5JdAVaAWEI=TalMe;`W+aiyf2cNTbTy7HE9GS$# z9Gs|%L2rZ@##hy`JwXzde@xPgOcLM9BuM&gf+Q4~BoQAZ(f$2+`LWB%d?t_7K8~fQ zdGJN{Ee4u5`CcOawTPU~E0LYPK43L|EY1kyVV?E)cb`HAbNl0Iu%!jJe`&wL zZ;KXWRzktLsdT_aUmaKr>txUgdl6u;^6wAeyAC)^+V`t2mbfx=N|MBD_~zxEzYgsI zsAV1i&Gw(2r6C*=vO}zT0jw5)viASAF8k%6D?6~qLpy>Swq+X-1{4cG$?nr-pTo4% zp(zA>kQ3i`F}eWx`M!&7rXufSXN4{LItCxYFhwwqm^oaZ0P{mXa974*Y$Ed1O$2@M zVSn_cr^vHkjaD-cXWxa`EuixN(H25?zK{FCxb>^MAN)MKNzCsD%k}@5oUNnaHf;Sr z^*Goz+4_HTSA4wPd^3x(_5bE>5yzT*^Bp3NHTmWq5y$#}GcD-oSL>%jXas}FJ zY|aHndku7ErYleIkS>FWldfqZPPz(3oOG3mIO#HpIO(#9cv-ZT>B2m+xepynsM*V+ z+;L-unwx>2aiYF`|47TvnQ^1RvbOCyYkimMIhITvq|3cZHiD@ zx)WX&H9{zxN36NrKH_#5avF$(gifOf$}4V%AyOuUirZm8u(=>{um73G3HT3fI7}F? z*<5lUGC3dXx%hq-_q3w6KP7HG>Yn(jTaTghH0U2elbl3#pu4*xW0I#(QQQ*Y-o4v= ze=BTn-cCE4`)Oyxwl}eNuqjaMb96mv4vNGUq9bXxx1StQv)v4FhcO%6DRwV52V(zu zbUXNXl;ywB!GD1+FyhT(htLu9<}`>)-Yk~L0csR_J`KYb4em#6T;H&V40Y7U^(jov zQ6JZTyZb0K`w9ph!Db%|ar$QGLp!zk^nX!DG-+se`%t^ri3yTszSMP< z+>np41;mhxJ%MLr-B$C zdN;O@cz&aIH{JW!%)9BYwj1352d-3Sz5f4gG<%{#X`82E)hWA<^%Epzocx@5{n7&$va6gq8!?;$>a< z1oTsu=pb|xvQr!O7DV+8_7?Usc1KuK-YlxdmutHBnriZmoSOPhSE)n18B>z{rIi|2 zVkk4LS|7#_Sn#()&!N|e&Yqp{Zt`zM$cJV*$iRR+26SC;VFi5wMKdqX~R0a+Exp+YK7-(t*5&k z>rZ!U4Z@~cBW$QOI#-3XMt6hOxDG(0*67k2LolN6GR?dyXf*KyW(S2sB!EgXh4aN}=)rCYr8x=t|R&8h|tB~;tZ znp$TI_O^S)WN{{GRmp(&uCn*o(z|;R<8Pv8_K>d#H{flb)A2c%Iy7At!#Rej(yUVr zg&kH@DLl}_zkOH`K@dKz89d zc&Y2`*{NS=KV7_e`K;-TF%S;A;nL`YOs+wuo~5JDkc#4Zj*^P6BA?3iRrsgV>-$AT zzH&aDK`L$uxTL30*>7lJR|d{HG_9 zj{c%Z!~E)N2%J4zS~EU~Cr%(rkrETmjT9n9zr{IGIg{r#^$^S zVLc8cqD13N%Y^U5<>EL#fY6Sx3t{2YgM+;YyAbvx4B*C8ZkDF?BP>MNg&Ur22nTQv zcss&ed~qxnZ_d16VL!rL*n0rsG=$p6s1L$igmnlF2m=TU5q2XqAuNQw?FelM z0|@I8(uFT(u`BH|d$pFU&Qajhn_LVU7q+w_$GX8N#y(pxG4#K5Ad=i_@99n0@v$(1NgKg{Qm}SNWxFQ z6`7X=pAI}X32p(Nl>}c&7EFSNfgi$Sw$k?C!Y^5B+BJe-Z|BCkcK7@H>*=^qZ;u_YMxy zkRUIz+b-bSz^}(&0p1IK1o4abKLoHn2|gZ<(~|_J-<-Sy_|tJIyuIcC58O96D7q3$ zCHb|$vrryA?gNgWz#POYjN%vZZxa0D<0zN^Bj5(e-$S@1J2(B2>@4bw_W<7uoc+e7 zIXkyKePMQeMkpgY*PM-Ej$I`874VrbCgb)x%U_99JQ<>W2;2tzccVbe%g((fy)HX% zONKey&^{`oeN=WHWX=E`Ub z_Kf-2f!eXzc@@k|mT~E8;>7%M8kOfBd;&N!px;m(^*Rd0$}>N)JWHrN7Antz?7p;& z+%%NOlDa%(Z#Nua`_93^3FHuquFYs4b76K{+I8ujqpr!^GCJJ^tJ!4v$!<4*?`F(_ zc)I}}L8A8ciPq3q``ttGkp4WSv-U&%wq#hS{pM%ar$3Z!sF00F^4K*Wtd2pX4$BOZUnGRso{7PTYZX>aU}I3j$@lmfE$G z+Vz@Imh5R;GEs!~(etyr(=sy9q|~19zj%Ab?LqB%8}w!2X6CZ5*q)o9zYzC{={J=} z&F1A${c9fi7s?_0%R>Hjb>`vyi|kc`wZvgS#HS-1b)GDTmHf&|em+zV=2!Ex?HSLea&yvu5A?U<8G_}cV^Qa*_Ay-lwHf43 z8M8B>f1z|JunZ2S9eWCVU`ginnVS1{^p5UKkbrZ~CmVg1o{6F4#tebY{V6!E&dh`x z{wx#sF~PSj?HnY|&b)n`W zGZWvFo!L(UZ5f){BmZ>ec3l_a{vXjFT=*#U#3Km_G|2Q2@zk#Br({HM%H2nsPO4Dzu&_yqjrE86#$8%CUWaNKcWo{CEETZ|`rt+YCt!bq1TvHEo6nD@3?VgbgBGE5a=zyh((&i|{@XJ}$x+MEI5n zKNjKWVqT2nM0kb>XNa&ugv&(OAi}jG+#KsMVjZT{k=XBtZIgJUxdMTNKtP;4wVOsn>|4K`<(oJl`d zc4W-OXKGqOXnhlYToPe8$iqe%Yxajd1^Cg;f>kYEpZgrITVoXN95reM?)A;c$-{7v zr^sJ;WNdi zK?8oq&C}}g1n4KG@pI5x0o}w4p$I%!;{rR0AbpU=%I0kHx{%cmE%;NwRC6`>-8V?^ zH_`YPBFV}N2l&YOvWcY?$2y%Fs{yTxI`7K*GqYRJH>DQ6kgCf85FZ)&l6JX!U<>=dA z`VUXVmst=YnKFN)$loaP>)T78|4Ci`R*}C|8Eu0<+`#>FZ6WqJanHz zy<|Qaet<+Ze_yA8vG;ZIT=W%p^^)b5*r$k)ELs1(*BV&T-fLN)eOdc|0X9-m$l2q6 zWqx*M7)LoTk+N8{eUiErHqCe)r^ZM|k*Fh?9G!_6=k_1)4BN&2>_m{W@R4?t^`h>b zOn=~4Jpb8Kcqsqs^-DZin1RyCc~niOUq+SlVfToH95W~;^Q2QEYa#rQrV`!EX@!IfDN;0`CoSK%V#Q0zQ#uJz)nqUw)E8{&83sOd|im zj~~z_%d>#t98>=~QsB+NPthi5lg0W`o=;v0oa$SstM3m|$hn*0Xvg zziTVY|F;zU9|0#j4+y>TT>I=X$?IzZJ`w#rs_WNb;3UVc^Q&taf1YO7`Ts{uKJ<$5 z8O31NN$B9o?0h!E;Sa(O(M;^RNZ^4QPSZU*x-JJ!CxeBz$a)Y;)Lz?0ee%@p{jLcUyANWU^-s3Q4#|5*(@nf$9#;5Py%zwO>?V6~O| z4BR>lcE*OUJ(}h5WrK@XvuK>!*`* zsJ`R0ek<2U-^HM7roeM`^JxQcvO~A7JX;t)&#V6ZVG6t_1^z5>n%4%dHK<~=y}(It zuCBk+D-6gF4T4|#`SFM(YsWJgj&{`5YXxwU)2)+pV+uKU2|4vkcrod_7j*4R!T&OF zD*u4aPX>XL-hoa7%MX%W#b~T#^ZR+glhw=3aID9K|H%FRH7WRi44leSuWQE#Q}92X z0{>LV(R6Z7Mj?}x^NbYuOyJBu0bYOEFBYfZ_X8)pwdvaH9mWs;oWtd??_44JEi9Iew_VBsxsDn? zIl0}Y0%z@|yioL` zrv?7Dkl&+|KN{yZ$>eJ;d_CW>y2;<{2!)-&u;vPeL*W*@0mP*_9Obo3svT98HMI^0 zC`$shpj=6E`yH!&{#8z&gWbz{lHER3@k-Md- zX}#2AU2I`$Dyq$ktPV+$8W|tb!fqTfEr)qHp}^JJsyQyGDlWs*42R)!I0_xc(wSv; z;#=$VwRr3cU5vm}O1S^@6=cl%`ZCH2M?i*g1Y{JAfQ;f1kWrFa#{8-!^UPHaN9Ey~ zSGs|*c=a+*FoY-W${RhdOVFw{;i@u+!|P|aGKGJ~eJ$j7G&-BzxJ_wUjvJB<1rEpR z)>cOVBK*xxpEtbTv9?fiSXL}HFRCop9HJ~sDk^HMwT@czyeg}M9-~1Qzyos7wpe|R zp`@nKzs|ar;2M8%pe1Z|nN0JmD(98g)j5g_O7#2|BWGTy3MsA(nE@Z(yQ>yEe(P_;V3F7Dk!C*1wA28INpoX)zw#D>qV^>=kaiyQaut zb-TR@4<ZjmbOT@EuO-o%%=)p7B684B)$R5WjMUOcb!&`U_L#S_{sL9hr zWv6kPpcn1!}tX&k|WxTtCH zFv3W^TGW}9FuJ#4{gJdZf85JwrRVHiRj#UpC#hXa;*Z*;;8^;g%2|H^|S5G4>D5d2n4ef*wXL*#ggff2k?-4-EROBW@gWa5=Q` zIZN#}Y$WDGgB*#eUsFS>J(M~raGLFmW%E7Z70y;~=t#Pn`W(H_%KHE>#aA3VilB{L z)#-5J+fv@JeiU^3>`DAvt?HMzMq*)yW_e?=Xlnje2HyQ@3LU%$evL-{S_6=-VNndW z3*qxG%^RUFud(#Dga>kI22;jBU7GB2Y`F)eZVx&iO(PgHn(=)#<|j4bQWpW0E~~NF zvB-IEbMDd1oqfmj-NEy_2GR}m9@x{S>kH5(i4z9OWdtvVCHMFYIbBh75X%%{? zwc0qNc9DnTmCd05d%cC`Sg_Vn?OE*&;T;g=G`!(O8W>ZJ;(7lHSPBaxCb*;+6{3C+ zpP>)a$Bo4aqYU{cdPrGqg+JKT;&U2{Pz^h6eXx5AV#LrD+`>FsS9K#YyF5z+STxZB z4yD0pmY_y21|1j!{?LF$L%y*{eZz>DErw-ehO71aeKgLoMM22p47wWQEm?#tHDTin zha=pG*E2X)Io)uvPY26kux-c7LL8oEHsq0ybZ8Z>z)!vt9?(Vt+7xakgK6K-<8Qg!>RcGfEsYGAB(dP5#Q!0;wPRl~#f5;gu= z7`VL6Ax|(|>9$&{Yy7p2gd!Ep(p$|qGrsz^i*1P&Ycv#{Hm?Z8x}Q6!K6eQ@7nwZC z7Wu2K!%{CRbc6Yq5A;c98Tm#FHc+tdARn$h)OHicTVKL{m}Iubg!{3Bhs0T=` zYrVxor)9id*`}GFs9~+GIhHoB!=4k9L8zsPwo&EfI3y^fc8Ply?S{UzN;J-^E;S2F zMl0W(GIuMXdEHndC!IxpcMEo6!#%N(JU#A+y7^(o(q`3T`uH%& rw8YnGbz+@HbAmG8EoT#+s5i6He^hU_!^dCG~y)m8SVc98QYtl diff --git a/slsDetectorCalibration/interpolations/eta2InterpolationBase.h b/slsDetectorCalibration/interpolations/eta2InterpolationBase.h deleted file mode 100644 index 55ed32e2a..000000000 --- a/slsDetectorCalibration/interpolations/eta2InterpolationBase.h +++ /dev/null @@ -1,436 +0,0 @@ -#ifndef ETA2_INTERPOLATION_BASE_H -#define ETA2_INTERPOLATION_BASE_H - -#ifdef MYROOT1 -#include -#include -#include -#include -#endif - -#include "etaInterpolationBase.h" - -class eta2InterpolationBase : public virtual etaInterpolationBase { - - public: - eta2InterpolationBase(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationBase(nx,ny, ns, nb, emin, emax) { - // cout << "e2ib " << nb << " " << emin << " " << emax << endl; - - if (nbeta<=0) { - nbeta=nSubPixels*10; - } - if (etamin>=etamax) { - etamin=-1; - etamax=2; - cout << ":" <2) - calcEta(totquad, sDum, etax, etay); - getInterpolatedPosition(x,y,etax,etay,corner,int_x,int_y); - - return; - }; - - - virtual void getInterpolatedPosition(int x, int y, double *data, double &int_x, double &int_y) - { - double sDum[2][2]; - double tot, totquad; - double etax,etay; - - int corner; - corner=calcQuad(data, tot, totquad, sDum); - if (nSubPixels>2) - calcEta(totquad, sDum, etax, etay); - getInterpolatedPosition(x,y,etax,etay,corner,int_x,int_y); - - return; - }; - - - - - - - - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,double *cl,double &int_x, double &int_y) { - - double cc[2][2]; - double *cluster[3]; - int xoff, yoff; - cluster[0]=cl; - cluster[1]=cl+3; - cluster[2]=cl+6; - - switch (quad) { - case BOTTOM_LEFT: - xoff=0; - yoff=0; - break; - case BOTTOM_RIGHT: - xoff=1; - yoff=0; - break; - case TOP_LEFT: - xoff=0; - yoff=1; - break; - case TOP_RIGHT: - xoff=1; - yoff=1; - break; - default: - ; - } - double etax, etay; - if (nSubPixels>2) { - cc[0][0]=cluster[yoff][xoff]; - cc[1][0]=cluster[yoff+1][xoff]; - cc[0][1]=cluster[yoff][xoff+1]; - cc[1][1]=cluster[yoff+1][xoff+1]; - calcEta(totquad,cc,etax,etay); - } - return getInterpolatedPosition(x,y,etax, etay,quad,int_x,int_y); - - } - - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,int *cl,double &int_x, double &int_y) { - - double cc[2][2]; - int *cluster[3]; - int xoff, yoff; - cluster[0]=cl; - cluster[1]=cl+3; - cluster[2]=cl+6; - - switch (quad) { - case BOTTOM_LEFT: - xoff=0; - yoff=0; - break; - case BOTTOM_RIGHT: - xoff=1; - yoff=0; - break; - case TOP_LEFT: - xoff=0; - yoff=1; - break; - case TOP_RIGHT: - xoff=1; - yoff=1; - break; - default: - ; - } - double etax, etay; - if (nSubPixels>2) { - cc[0][0]=cluster[yoff][xoff]; - cc[1][0]=cluster[yoff+1][xoff]; - cc[0][1]=cluster[yoff][xoff+1]; - cc[1][1]=cluster[yoff+1][xoff+1]; - calcEta(totquad,cc,etax,etay); - } - return getInterpolatedPosition(x,y,etax, etay,quad,int_x,int_y); - - } - - - - - - - virtual void getInterpolatedPosition(int x, int y, double etax, double etay, int corner, double &int_x, double &int_y) - { - - - double xpos_eta=0,ypos_eta=0; - double dX,dY; - int ex,ey; - switch (corner) - { - case TOP_LEFT: - dX=-1.; - dY=0; - break; - case TOP_RIGHT: - ; - dX=0; - dY=0; - break; - case BOTTOM_LEFT: - dX=-1.; - dY=-1.; - break; - case BOTTOM_RIGHT: - dX=0; - dY=-1.; - break; - default: - cout << "bad quadrant" << endl; - dX=0.; - dY=0.; - } - - - if (nSubPixels>2) { - -#ifdef MYROOT1 - xpos_eta=(hhx->GetBinContent(hhx->GetXaxis()->FindBin(etax),hhy->GetYaxis()->FindBin(etay)))/((double)nSubPixels); - ypos_eta=(hhy->GetBinContent(hhx->GetXaxis()->FindBin(etax),hhy->GetYaxis()->FindBin(etay)))/((double)nSubPixels); -#endif -#ifndef MYROOT1 - ex=(etax-etamin)/etastep; - ey=(etay-etamin)/etastep; - if (ex<0) { - cout << "x*"<< ex << endl; - ex=0; - } - if (ex>=nbeta) { - cout << "x?"<< ex << endl; - ex=nbeta-1; - - } - if (ey<0) { - cout << "y*"<< ey << endl; - ey=0; - } - if (ey>=nbeta) { - cout << "y?"<< ey << endl; - ey=nbeta-1; - - } - - - - xpos_eta=(((double)hhx[(ey*nbeta+ex)]))+dX ;///((double)nSubPixels); - ypos_eta=(((double)hhy[(ey*nbeta+ex)]))+dY ;///((double)nSubPixels); - //else - //return 0; - -#endif - } else { - xpos_eta=0.5*dX+0.25; - ypos_eta=0.5*dY+0.25; - } - - int_x=((double)x) + xpos_eta+0.5; - int_y=((double)y) + ypos_eta+0.5; - - - } - - - - virtual int addToFlatField(double totquad,int quad,int *cl,double &etax, double &etay) { - double cc[2][2]; - int *cluster[3]; - int xoff, yoff; - cluster[0]=cl; - cluster[1]=cl+3; - cluster[2]=cl+6; - - switch (quad) { - case BOTTOM_LEFT: - xoff=0; - yoff=0; - break; - case BOTTOM_RIGHT: - xoff=1; - yoff=0; - break; - case TOP_LEFT: - xoff=0; - yoff=1; - break; - case TOP_RIGHT: - xoff=1; - yoff=1; - break; - default: - ; - } - cc[0][0]=cluster[yoff][xoff]; - cc[1][0]=cluster[yoff+1][xoff]; - cc[0][1]=cluster[yoff][xoff+1]; - cc[1][1]=cluster[yoff+1][xoff+1]; - - /* cout << cl[0] << " " << cl[1] << " " << cl[2] << endl; */ - /* cout << cl[3] << " " << cl[4] << " " << cl[5] << endl; */ - /* cout << cl[6] << " " << cl[7] << " " << cl[8] << endl; */ - /* cout <<"******"<Fill(etax,etay); -#endif -#ifndef MYROOT1 - int ex,ey; - ex=(etax-etamin)/etastep; - ey=(etay-etamin)/etastep; - if (ey=0 && ey>=0) - heta[ey*nbeta+ex]++; -#endif - return 0; - }; - -/* protected: */ - -/* #ifdef MYROOT1 */ -/* TH2D *heta; */ -/* TH2D *hhx; */ -/* TH2D *hhy; */ -/* #endif */ -/* #ifndef MYROOT1 */ -/* int *heta; */ -/* float *hhx; */ -/* float *hhy; */ -/* #endif */ -/* int nbeta; */ -/* double etamin, etamax, etastep; */ - -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/eta3InterpolationBase.h b/slsDetectorCalibration/interpolations/eta3InterpolationBase.h deleted file mode 100644 index 7264dd95e..000000000 --- a/slsDetectorCalibration/interpolations/eta3InterpolationBase.h +++ /dev/null @@ -1,294 +0,0 @@ -#ifndef ETA3_INTERPOLATION_BASE_H -#define ETA3_INTERPOLATION_BASE_H - -#ifdef MYROOT1 -#include -#include -#include -#include -#endif - -#include "etaInterpolationBase.h" - -class eta3InterpolationBase : public virtual etaInterpolationBase { - - public: - eta3InterpolationBase(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationBase(nx, ny, ns, nb, emin, emax) { - // cout << "e3ib " << nb << " " << emin << " " << emax << endl; - if (nbeta<=0) { - nbeta=nSubPixels*10; - } - if (etamin>=etamax) { - etamin=-1; - etamax=1; - } - - etastep=(etamax-etamin)/nbeta; -#ifdef MYROOT1 - delete heta; - delete hhx; - delete hhy; - heta=new TH2D("heta","heta",nbeta,etamin,etamax,nbeta,etamin,etamax); - hhx=new TH2D("hhx","hhx",nbeta,etamin,etamax,nbeta,etamin,etamax); - hhy=new TH2D("hhy","hhy",nbeta,etamin,etamax,nbeta,etamin,etamax); -#endif -#ifndef MYROOT1 - delete [] heta; - delete [] hhx; - delete [] hhy; - - heta=new int[nbeta*nbeta]; - hhx=new float[nbeta*nbeta]; - hhy=new float[nbeta*nbeta]; - -#endif - // cout << nbeta << " " << etamin << " " << etamax << endl; -}; - - eta3InterpolationBase(eta3InterpolationBase *orig): etaInterpolationBase(orig){ }; - - virtual eta3InterpolationBase* Clone()=0; - - - - - // virtual void prepareInterpolation(int &ok){}; - - - ////////////////////////////////////////////////////////////////////////////// - //////////// /*It return position hit for the event in input */ ////////////// - virtual void getInterpolatedPosition(int x, int y, int *data, double &int_x, double &int_y) - { - double tot, totquad; - double etax,etay; - - int corner=calcEta3(data,etax,etay, totquad); - - getInterpolatedPosition(x,y,etax,etay,corner,int_x,int_y); - - return; - }; - - - virtual void getInterpolatedPosition(int x, int y, double *data, double &int_x, double &int_y) - { - double sDum[2][2]; - double tot, totquad; - double etax,etay; - - int corner=calcEta3(data,etax,etay, totquad); - - getInterpolatedPosition(x,y,etax,etay,corner,int_x,int_y); - - return; - }; - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,double *cl,double &int_x, double &int_y) { - - - double etax, etay; - if (nSubPixels>2) { - calcEta3(cl,etax,etay, totquad); - } - return getInterpolatedPosition(x,y,etax, etay,quad,int_x,int_y); - - } - - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,int *cl,double &int_x, double &int_y) { - - - double etax, etay; - if (nSubPixels>2) { - calcEta3(cl,etax,etay, totquad); - } - return getInterpolatedPosition(x,y,etax, etay,quad,int_x,int_y); - - } - - - - virtual void getInterpolatedPosition(int x, int y, double etax, double etay, int corner, double &int_x, double &int_y) - { - - - double xpos_eta=0,ypos_eta=0; - int ex,ey; - - if (nSubPixels>2) { - -#ifdef MYROOT1 - xpos_eta=(hhx->GetBinContent(hhx->GetXaxis()->FindBin(etax),hhy->GetYaxis()->FindBin(etay)))/((double)nSubPixels); - ypos_eta=(hhy->GetBinContent(hhx->GetXaxis()->FindBin(etax),hhy->GetYaxis()->FindBin(etay)))/((double)nSubPixels); -#endif -#ifndef MYROOT1 - ex=(etax-etamin)/etastep; - ey=(etay-etamin)/etastep; - if (ex<0) { - /* cout << etax << " " << etamin << " "; */ - /* cout << "3x*"<< ex << endl; */ - ex=0; - } - if (ex>=nbeta) { - /* cout << etax << " " << etamin << " "; */ - /* cout << "3x?"<< ex << endl; */ - ex=nbeta-1; - } - if (ey<0) { - /* cout << etay << " " << etamin << " "; */ - /* cout << "3y*"<< ey << endl; */ - ey=0; - } - if (ey>=nbeta) { - /* cout << etay << " " << etamin << " "; */ - /* cout << "3y?"<< ey << endl; */ - ey=nbeta-1; - - } - xpos_eta=(((double)hhx[(ey*nbeta+ex)]));///((double)nSubPixels); - ypos_eta=(((double)hhy[(ey*nbeta+ex)]));///((double)nSubPixels); - -#endif - - } else { - switch (corner) { - case BOTTOM_LEFT: - xpos_eta=-0.25; - ypos_eta=-0.25; - break; - case BOTTOM_RIGHT: - xpos_eta=0.25; - ypos_eta=-0.25; - break; - case TOP_LEFT: - xpos_eta=-0.25; - ypos_eta=0.25; - break; - case TOP_RIGHT: - xpos_eta=0.25; - ypos_eta=0.25; - break; - default: - xpos_eta=0; - ypos_eta=0; - } - - } - int_x=((double)x) + xpos_eta; - int_y=((double)y) + ypos_eta; - // int_x=5. + xpos_eta; - // int_y=5. + ypos_eta; - - - } - - - - - - -/* ///////////////////////////////////////////////////////////////////////////////////////////////// */ -/* virtual void getPositionETA3(int x, int y, double *data, double &int_x, double &int_y) */ -/* { */ -/* double sDum[2][2]; */ -/* double tot, totquad; */ -/* double eta3x,eta3y; */ -/* double ex,ey; */ - -/* calcQuad(data, tot, totquad, sDum); */ -/* calcEta3(data,eta3x, eta3y,tot); */ - -/* double xpos_eta,ypos_eta; */ - -/* #ifdef MYROOT1 */ -/* xpos_eta=((hhx->GetBinContent(hhx->GetXaxis()->FindBin(eta3x),hhy->GetYaxis()->FindBin(eta3y))))/((double)nSubPixels); */ -/* ypos_eta=((hhy->GetBinContent(hhx->GetXaxis()->FindBin(eta3x),hhy->GetYaxis()->FindBin(eta3y))))/((double)nSubPixels); */ - -/* #endif */ -/* #ifndef MYROOT1 */ -/* ex=(eta3x-etamin)/etastep; */ -/* ey=(eta3y-etamin)/etastep; */ - -/* if (ex<0) ex=0; */ -/* if (ex>=nbeta) ex=nbeta-1; */ -/* if (ey<0) ey=0; */ -/* if (ey>=nbeta) ey=nbeta-1; */ - -/* xpos_eta=(((double)hhx[(int)(ey*nbeta+ex)]))/((double)nSubPixels); */ -/* ypos_eta=(((double)hhy[(int)(ey*nbeta+ex)]))/((double)nSubPixels); */ -/* #endif */ - -/* int_x=((double)x) + xpos_eta; */ -/* int_y=((double)y) + ypos_eta; */ - -/* return; */ -/* }; */ - - virtual int addToFlatField(double totquad,int quad,int *cl,double &etax, double &etay) { - - calcEta3(cl, etax, etay, totquad); - return addToFlatField(etax,etay); - } - - virtual int addToFlatField(double totquad,int quad,double *cl,double &etax, double &etay) { - - - calcEta3(cl, etax, etay, totquad); - return addToFlatField(etax,etay); - } - - - - ////////////////////////////////////////////////////////////////////////////////////// - virtual int addToFlatField(double *cluster, double &etax, double &etay){ - double totquad; - calcEta3(cluster, etax, etay, totquad); - return addToFlatField(etax,etay); - - }; - - virtual int addToFlatField(int *cluster, double &etax, double &etay){ - - double totquad; - - calcEta3(cluster, etax, etay, totquad); - return addToFlatField(etax,etay); - - }; - - - virtual int addToFlatField(double etax, double etay){ -#ifdef MYROOT1 - heta->Fill(etax,etay); -#endif -#ifndef MYROOT1 - int ex,ey; - ex=(etax-etamin)/etastep; - ey=(etay-etamin)/etastep; - if (ey=0 && ey>=0) - heta[ey*nbeta+ex]++; -#endif - return 0; - }; - - -/* protected: */ - -/* #ifdef MYROOT1 */ -/* TH2D *heta; */ -/* TH2D *hhx; */ -/* TH2D *hhy; */ -/* #endif */ -/* #ifndef MYROOT1 */ -/* int *heta; */ -/* float *hhx; */ -/* float *hhy; */ -/* #endif */ -/* int nbeta; */ -/* double etamin, etamax, etastep; */ - -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/etaInterpolationAdaptiveBins.h b/slsDetectorCalibration/interpolations/etaInterpolationAdaptiveBins.h deleted file mode 100644 index 3a785f8f2..000000000 --- a/slsDetectorCalibration/interpolations/etaInterpolationAdaptiveBins.h +++ /dev/null @@ -1,281 +0,0 @@ -#ifndef ETA_INTERPOLATION_ADAPTIVEBINS_H -#define ETA_INTERPOLATION_ADAPTIVEBINS_H - - -#include "tiffIO.h" -//#include "etaInterpolationBase.h" -#include "etaInterpolationPosXY.h" - -class etaInterpolationAdaptiveBins : public etaInterpolationPosXY { - - private: - double calcDiff(double avg, float *hx, float *hy) { - double p_tot=0; - double diff=0; - double bsize=1./nSubPixels; - - for (int ipx=0; ipx=((ipx)*bsize) && hx[ibx+iby*nbeta]<((ipx+1)*bsize) && hy[ibx+iby*nbeta]>=((ipy)*bsize) && hy[ibx+iby*nbeta]<((ipy+1)*bsize)) { - p_tot+=heta[ibx+iby*nbeta]; - } - } - } - - cout << p_tot << " \t "; - - - - diff+=(p_tot-avg)*(p_tot-avg); - - } - cout << "\n"; - } - return diff; - } - - void iterate(float *newhhx, float *newhhy) { - - double bsize=1./nSubPixels; - - double hy[nbeta]; //profile y - double hx[nbeta]; //profile x - double hix[nbeta]; //integral of projection x - double hiy[nbeta]; //integral of projection y - - double tot_eta_x=0; - double tot_eta_y=0; - for (int ipy=0; ipy=((ipy)*bsize) && hhy[ibx+iby*nbeta]<=((ipy+1)*bsize)) { - hx[ibx]+=heta[ibx+iby*nbeta]; - tot_eta_x+=heta[ibx+iby*nbeta]; - } - - - if (hhx[ibx+iby*nbeta]>=((ipy)*bsize) && hhx[ibx+iby*nbeta]<=((ipy+1)*bsize)) { - hy[iby]+=heta[ibx+iby*nbeta]; - tot_eta_y+=heta[ibx+iby*nbeta]; - } - } - } - - - hix[0]=hx[0]; - hiy[0]=hy[0]; - for (int ib=1; ib=((ipy)*bsize) && hhy[ibx+iby*nbeta]<=((ipy+1)*bsize)) { - newhhx[ibx+iby*nbeta]=hix[ibx]/((double)tot_eta_x); - if (newhhx[ibx+iby*nbeta]>1) cout << "***"<< ibx << " " << iby << newhhx[ibx+iby*nbeta] << endl; - // if (ipy==3 && ibx==10) cout << newhhx[ibx+iby*nbeta] << " " << hix[ibx] << " " << ibx+iby*nbeta << endl; - } - if (hhx[ibx+iby*nbeta]>=((ipy)*bsize) && hhx[ibx+iby*nbeta]<=((ipy+1)*bsize)) { - newhhy[ibx+iby*nbeta]=hiy[iby]/((double)tot_eta_y); - if (newhhy[ibx+iby*nbeta]>1) cout << "***"<< ibx << " " << iby << newhhy[ibx+iby*nbeta] << endl; - // if (ipy==3 && iby==10) cout << newhhy[ibx+iby*nbeta] << " " << hiy[iby] << " " << ibx+iby*nbeta << endl; - } - } - } - } - - - } - - - public: - etaInterpolationAdaptiveBins(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationPosXY(nx,ny,ns, nb, emin,emax){}; - - etaInterpolationAdaptiveBins(etaInterpolationAdaptiveBins *orig): etaInterpolationPosXY(orig){}; - - virtual etaInterpolationAdaptiveBins* Clone() { - - return new etaInterpolationAdaptiveBins(this); - - }; - - - - virtual void prepareInterpolation(int &ok) - { - ok=1; - cout << "Adaptive bins" << endl; - - ///*Eta Distribution Rebinning*/// - double bsize=1./nSubPixels; //precision - // cout<<"nPixelsX = "<1 || etah[ii]<0 ) cout << "***"<< ii << etah[ii] << endl; */ -/* } */ -/* sprintf(tit,"/scratch/neweta_hhy_%d.tiff",iint); */ -/* WriteToTiff(etah, tit, etabins, etabins); */ -/* #endif */ - if (new_diff -#include -#include -#include -#endif - -#include "slsInterpolation.h" -#include "tiffIO.h" - -class etaInterpolationBase : public slsInterpolation { - - public: - - etaInterpolationBase(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : slsInterpolation(nx,ny,ns), hhx(NULL), hhy(NULL), heta(NULL), nbeta(nb), etamin(emin), etamax(emax) { - // cout << "eb " << nb << " " << emin << " " << emax << endl; - // cout << nb << " " << etamin << " " << etamax << endl; - if (nbeta<=0) { - cout << "aaa:" <=etamax) { - cout << "aaa:" <nbeta; - etamin=orig->etamin; - etamax=orig->etamax; - - etastep=(etamax-etamin)/nbeta; -#ifdef MYROOT1 - heta=(TH2D*)(orig->heta)->Clone("heta"); - hhx=(TH2D*)(orig->hhx)->Clone("hhx"); - hhy=(TH2D*)(orig->hhy)->Clone("hhy"); -#endif - -#ifndef MYROOT1 - heta=new int[nbeta*nbeta]; - memcpy(heta,orig->heta,nbeta*nbeta*sizeof(int)); - hhx=new float[nbeta*nbeta]; - memcpy(hhx,orig->hhx,nbeta*nbeta*sizeof(float)); - hhy=new float[nbeta*nbeta]; - memcpy(hhy,orig->hhy,nbeta*nbeta*sizeof(float)); - -#endif - - - }; - - virtual etaInterpolationBase* Clone()=0;/*{ - return new etaInterpolationBase(this); - }; - */ - - - -#ifdef MYROOT1 - TH2D *setEta(TH2D *h, int nb=-1, double emin=1, double emax=0) - { - if (h) { heta=h; - nbeta=heta->GetNbinsX(); - etamin=heta->GetXaxis()->GetXmin(); - etamax=heta->GetXaxis()->GetXmax(); - etastep=(etamax-etamin)/nbeta; - } - return heta; - }; - TH2D *setFlatField(TH2D *h, int nb=-1, double emin=1, double emax=0) - { - return setEta(h, nb, emin, emax); - }; - - TH2D *getFlatField(){return setEta(NULL);}; -#endif - -#ifndef MYROOT1 - int *setEta(int *h, int nb=-1, double emin=1, double emax=0) - { - if (h) { - if (heta) delete [] heta; - heta=h; - nbeta=nb; - if (nb<=0) nbeta=nSubPixels*10; - etamin=emin; - etamax=emax; - if (etamin>=etamax) { - etamin=-1; - etamax=2; - } - etastep=(etamax-etamin)/nbeta; - } - return heta; - }; - - int *setFlatField(int *h, int nb=-1, double emin=1, double emax=0) - { - return setEta(h, nb, emin, emax); - }; - int *getFlatField(){return setEta(NULL);}; - - int *getFlatField(int &nb, double &emin, double &emax){ - nb=nbeta; - //cout << "igff* ff has " << nb << " bins " << endl; - emin=etamin; - emax=etamax; - return getFlatField(); - }; - - - void *writeFlatField(const char * imgname) { - float *gm=NULL; - gm=new float[nbeta*nbeta]; - for (int ix=0; ix=1) etamax=emax; - if (emin<=0) etamin=emin; - - if (etamin>=etamax) { - etamin=-1; - etamax=2; - } - - etastep=(etamax-etamin)/nbeta; - uint32 nnx; - uint32 nny; - float *gm=ReadFromTiff(imgname, nnx, nny); - if (nnx!=nny) { - cout << "different number of bins in x " << nnx << " and y " << nny<< " !"<< endl; - cout << "Aborting read"<< endl; - return 0; - } - nbeta=nnx; - if (gm) { - if (heta) { - delete [] heta; - delete [] hhx; - delete [] hhy; - } - - heta=new int[nbeta*nbeta]; - hhx=new float[nbeta*nbeta]; - hhy=new float[nbeta*nbeta]; - - for (int ix=0; ixScale((double)nSubPixels); - return hhx; - }; - - TH2D *gethhy() - { - hhy->Scale((double)nSubPixels); - return hhy; - }; -#endif - -#ifndef MYROOT1 -float *gethhx() - { - // hhx->Scale((double)nSubPixels); - return hhx; - }; - - float *gethhy() - { - // hhy->Scale((double)nSubPixels); - return hhy; - }; -#endif - - ////////////////////////////////////////////////////////////////////////////// - //////////// /*It return position hit for the event in input */ ////////////// - /* virtual void getInterpolatedPosition(int x, int y, int *data, double &int_x, double &int_y)=0; */ - /* virtual void getInterpolatedPosition(int x, int y, double *data, double &int_x, double &int_y)=0; */ - /* virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,double *cl,double &int_x, double &int_y)=0; */ - /* virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,int *cl,double &int_x, double &int_y)=0; */ - /* virtual void getInterpolatedPosition(int x, int y, double etax, double etay, int corner, double &int_x, double &int_y)=0; */ - - - /* virtual int addToFlatField(double totquad,int quad,int *cl,double &etax, double &etay)=0; */ - /* virtual int addToFlatField(double totquad,int quad,double *cl,double &etax, double &etay)=0; */ - /* virtual int addToFlatField(double *cluster, double &etax, double &etay)=0; */ - /* virtual int addToFlatField(int *cluster, double &etax, double &etay)=0; */ - - virtual int addToFlatField(double etax, double etay){ -#ifdef MYROOT1 - heta->Fill(etax,etay); -#endif -#ifndef MYROOT1 - int ex,ey; - ex=(etax-etamin)/etastep; - ey=(etay-etamin)/etastep; - if (ey=0 && ey>=0) - heta[ey*nbeta+ex]++; -#endif - return 0; - }; - - - // virtual void prepareInterpolation(int &ok)=0; - - protected: - -#ifdef MYROOT1 - TH2D *heta; - TH2D *hhx; - TH2D *hhy; -#endif -#ifndef MYROOT1 - int *heta; - float *hhx; - float *hhy; -#endif - int nbeta; - double etamin, etamax, etastep; - -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/etaInterpolationGlobal.h b/slsDetectorCalibration/interpolations/etaInterpolationGlobal.h deleted file mode 100644 index 615b7c04b..000000000 --- a/slsDetectorCalibration/interpolations/etaInterpolationGlobal.h +++ /dev/null @@ -1,85 +0,0 @@ -#ifndef ETA_INTERPOLATION_GLOBAL_H -#define ETA_INTERPOLATION_GLOBAL_H - - -#include "etaInterpolationBase.h" - -class etaInterpolationGlobal : public etaInterpolationBase{ - public: - globalEtaInterpolation(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationBase(nx,ny,ns, nb, emin,emax){}; - - - - virtual void prepareInterpolation(int &ok) - { - ok=1; -#ifdef MYROOT1 - if (hhx) delete hhx; - if (hhy) delete hhy; - - hhx=new TH2D("hhx","hhx",heta->GetNbinsX(),heta->GetXaxis()->GetXmin(),heta->GetXaxis()->GetXmax(), heta->GetNbinsY(),heta->GetYaxis()->GetXmin(),heta->GetYaxis()->GetXmax()); - hhy=new TH2D("hhy","hhy",heta->GetNbinsX(),heta->GetXaxis()->GetXmin(),heta->GetXaxis()->GetXmax(), heta->GetNbinsY(),heta->GetYaxis()->GetXmin(),heta->GetYaxis()->GetXmax()); - -#endif - - - ///*Eta Distribution Rebinning*/// - double bsize=1./nSubPixels; //precision - // cout<<"nPixelsX = "<(ib+1)*tot_eta*bsize) ib++; - for (int iby=0; ibySetBinContent(ibx+1,iby+1,ib); -#endif -#ifndef MYROOT1 - hhx[ibx+iby*nbeta]=ib; -#endif - } - } - ib=0; - for (int iby=0; iby(ib+1)*tot_eta*bsize) ib++; - for (int ibx=0; ibxSetBinContent(ibx+1,iby+1,ib); -#endif -#ifndef MYROOT1 - hhy[ibx+iby*nbeta]=ib; -#endif - } - } - - return ; - }; - -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/etaInterpolationPosXY.h b/slsDetectorCalibration/interpolations/etaInterpolationPosXY.h deleted file mode 100644 index 7730771cd..000000000 --- a/slsDetectorCalibration/interpolations/etaInterpolationPosXY.h +++ /dev/null @@ -1,173 +0,0 @@ -#ifndef ETA_INTERPOLATION_POSXY_H -#define ETA_INTERPOLATION_POSXY_H - - -//#include "tiffIO.h" -#include "etaInterpolationBase.h" -#include "eta2InterpolationBase.h" -#include "eta3InterpolationBase.h" - -class etaInterpolationPosXY : public virtual etaInterpolationBase{ - public: - etaInterpolationPosXY(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationBase(nx,ny,ns, nb, emin,emax){ - // cout << "epxy " << nb << " " << emin << " " << emax << endl; cout << nbeta << " " << etamin << " " << etamax << endl; - }; - - etaInterpolationPosXY(etaInterpolationPosXY *orig): etaInterpolationBase(orig) {}; - - virtual etaInterpolationPosXY* Clone()=0; /* { */ - - /* return new etaInterpolationPosXY(this); */ - - /* }; */ - - virtual void prepareInterpolation(int &ok) - { - ok=1; -#ifdef MYROOT1 - if (hhx) delete hhx; - if (hhy) delete hhy; - - hhx=new TH2D("hhx","hhx",heta->GetNbinsX(),heta->GetXaxis()->GetXmin(),heta->GetXaxis()->GetXmax(), heta->GetNbinsY(),heta->GetYaxis()->GetXmin(),heta->GetYaxis()->GetXmax()); - hhy=new TH2D("hhy","hhy",heta->GetNbinsX(),heta->GetXaxis()->GetXmin(),heta->GetXaxis()->GetXmax(), heta->GetNbinsY(),heta->GetYaxis()->GetXmin(),heta->GetYaxis()->GetXmax()); - -#endif - - - ///*Eta Distribution Rebinning*/// - double bsize=1./nSubPixels; //precision - // cout<<"nPixelsX = "<(ii+1)*tot_eta_x*bsize) - { - //ii++; - // cout << ib << " x " << ibx << " " << tot_eta_x << " " << (ii)*tot_eta_x*bsize << " " << ii << endl; - // } -#ifdef MYROOT1 - hhx->SetBinContent(ibx+1,ib+1,ii); -#endif -#ifndef MYROOT1 - hhx[ibx+ib*nbeta]=hix[ibx]/((float)tot_eta_x);//ii; -#endif - } - } - /* if (ii!=(nSubPixels-1)) */ - /* cout << ib << " x " << tot_eta_x << " " << (ii+1)*tot_eta_x*bsize << " " << ii << " " << hix[nbeta-1]<< endl; */ - - ii=0; - - for (int ibx=0; ibx(ii+1)*tot_eta_y*bsize) - { - //ii++; - //cout << ib << " y " << ibx << " " << tot_eta_y << " "<< (ii)*tot_eta_y*bsize << " " << ii << endl; - //} -#ifdef MYROOT1 - hhy->SetBinContent(ib+1,ibx+1,ii); -#endif -#ifndef MYROOT1 - hhy[ib+ibx*nbeta]=hiy[ibx]/((float)tot_eta_y);//ii; -#endif - } - } - /* if (ii!=(nSubPixels-1)) */ - /* cout << ib << " y " << tot_eta_y << " " << (ii+1)*tot_eta_y*bsize << " " << ii << " " << hiy[nbeta-1]<< endl; */ - - // cout << "y " << nbeta << " " << (ii+1)*tot_eta_x*bsize << " " << ii << endl; - - } - -#ifdef SAVE_ALL - char tit[10000]; - - float *etah=new float[nbeta*nbeta]; - int etabins=nbeta; - - for (int ii=0; ii -#include -//#include -#include // std::abs - -#define PI 3.14159265 -#define TWOPI 2.*PI - -using namespace std; - -class etaInterpolationRandomBins : public etaInterpolationPosXY { - - private: - double calcDiff(double avg, float *hx, float *hy) { - double p_tot=0; - double diff=0; - double bsize=1./nSubPixels; - - for (int ipx=0; ipx=((ipx)*bsize) && hx[ibx+iby*nbeta]<((ipx+1)*bsize) && hy[ibx+iby*nbeta]>=((ipy)*bsize) && hy[ibx+iby*nbeta]<((ipy+1)*bsize)) { - p_tot+=heta[ibx+iby*nbeta]; - } - } - } - - // cout << p_tot << " \t "; - - - - diff+=(p_tot-avg)*(p_tot-avg); - - } - // cout << "\n"; - } - return diff; - } - - double iterate(float *newhhx, float *newhhy, double avg) { - - double bsize=1./nSubPixels; - - double hy[nbeta]; //profile y - double hx[nbeta]; //profile x - double hix[nbeta]; //integral of projection x - double hiy[nbeta]; //integral of projection y - - double tot_eta_x=0; - double tot_eta_y=0; - - int p0; - int vx[(nSubPixels+1)*(nSubPixels+1)], vy[(nSubPixels+1)*(nSubPixels+1)]; - - int arrx[nSubPixels+1], arry[nSubPixels+1]; - - int bad=1; - - - int isby, isbx; - int ii=0; - - - // using default comparison (operator <): - // std::sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33 - - for (isby=0; isby<(nSubPixels+1)/2+1; isby++) { - - for (isbx=0; isbx<(nSubPixels+1)/2+1; isbx++) { - p0=isby*(nSubPixels+1)+isbx; - // for (int iv=0; iv<(nSubPixels+1)*(nSubPixels+1); iv++) { - if (isbx==0) { - vy[p0]=isby*nbeta/nSubPixels; - vx[p0]=0; - } else if ( isby==0 ) { - vy[p0]=0; - vx[p0]=isbx*nbeta/nSubPixels; - } - else { - vy[p0]=rand()%(nbeta/2); - vx[p0]=rand()%(nbeta/2); - if (nSubPixels%2==0 && isbx==nSubPixels/2) - vx[p0]=nbeta/2; - if (nSubPixels%2==0 && isby==nSubPixels/2 ) - vy[p0]=nbeta/2; - } - // cout << "(" << vx[p0] << " , " << vy[p0] << " ) \t" ; - // } - } - //cout << endl; - } - // cout << "rand" << endl; - - - while (bad) { - - for (isby=0; isby<(nSubPixels+1)/2+1; isby++) { - - - for (isbx=0; isbx<(nSubPixels+1)/2+1; isbx++) { - arrx[isbx]=vx[isby*(nSubPixels+1)+isbx]; - arry[isbx]=vy[isbx*(nSubPixels+1)+isby]; - //cout << isbx << " " << arrx[isbx] << " " << isby << " " << arry[isbx] << endl; - } - - sort(arrx,arrx+(nSubPixels+1)/2+1); - sort(arry,arry+(nSubPixels+1)/2+1); - - // cout << "*****"<< endl; - // cout << endl; - - for (int isbx=0; isbx<(nSubPixels+1)/2+1; isbx++) { - vx[isby*(nSubPixels+1)+isbx]=arrx[isbx]; - vy[isbx*(nSubPixels+1)+isby]=arry[isbx]; - - - vx[(nSubPixels-isby)*(nSubPixels+1)+(nSubPixels-isbx)]=nbeta-arrx[isbx]; - vy[(nSubPixels-isbx)*(nSubPixels+1)+(nSubPixels-isby)]=nbeta-arry[isbx]; - - vx[isby*(nSubPixels+1)+(nSubPixels-isbx)]=nbeta-arrx[isbx]; - vy[isbx*(nSubPixels+1)+(nSubPixels-isby)]=arry[isbx]; - - - vx[(nSubPixels-isby)*(nSubPixels+1)+(isbx)]=arrx[isbx]; - vy[(nSubPixels-isbx)*(nSubPixels+1)+(isby)]=nbeta-arry[isbx]; - - - } - - - - } - - /* for (isby=0; isbynSubPixels-1) isbx=nSubPixels-1; */ - - /* if (iby==0) */ - /* isby=0; */ - /* else */ - /* isby= (newhhx[ibx+(iby-1)*nbeta])/bsize-1; */ - - /* if (isby<0) isbx=0; */ - /* if (isby>nSubPixels-1) isby=nSubPixels-1; */ - /* // cout << isbx << " " << isby << endl; */ - - for (isby=0; isby PI) - dtheta -= TWOPI; - while (dtheta < -PI) - dtheta += TWOPI; - - angle += dtheta; - } - - if (abs((double)angle) < PI) - in_quad=0; - else - in_quad=1; - - if (in_quad) { - newhhx[ibx+iby*nbeta]=bsize*((double)isbx); - newhhy[ibx+iby*nbeta]=bsize*((double)isby); - break; - } - - - - - } - if (in_quad) break; - } - - } - } - - // cout << "hist" << endl; - return calcDiff(avg, newhhx, newhhy); - } - - - public: - etaInterpolationRandomBins(int nx=400, int ny=400, int ns=25, int nb=-1, double emin=1, double emax=0) : etaInterpolationPosXY(nx,ny,ns, nb, emin,emax){}; - - etaInterpolationRandomBins(etaInterpolationRandomBins *orig): etaInterpolationPosXY(orig){}; - - virtual etaInterpolationRandomBins* Clone() { - - return new etaInterpolationRandomBins(this); - - }; - - - - virtual void prepareInterpolation(int &ok) - { - ok=1; - cout << "Adaptive bins" << endl; - - ///*Eta Distribution Rebinning*/// - double bsize=1./nSubPixels; //precision - // cout<<"nPixelsX = "<1 || etah[ii]<0 ) cout << "***"<< ii << etah[ii] << endl; */ -/* } */ -/* sprintf(tit,"/scratch/randeta_hhx_%d.tiff",iint); */ -/* WriteToTiff(etah, tit, etabins, etabins); */ - -/* for (int ii=0; ii1 || etah[ii]<0 ) cout << "***"<< ii << etah[ii] << endl; */ -/* } */ -/* sprintf(tit,"/scratch/randeta_hhy_%d.tiff",iint); */ -/* WriteToTiff(etah, tit, etabins, etabins); */ -/* #endif */ - - if (new_diff -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "EtaVEL.h" -#include "EtaVEL.cpp" -/* -Zum erstellen der correction map ist createGainAndEtaFile(...) in EVELAlg.C der entry point. -Zum erstellen des HR images ist createImage(...) der entry point. -*/ -int etabins = 25; -int nEtas = 25; -Double_t dum[3][3]; -Int_t x,y,f,q; - -int counter[5]; -int remoteCounter[5]; - -//TH2D *sum = new TH2D("sum","sum",3,-0.1,2.1,3,-0.1,2.1); -//TH2F *subPos = new TH2F("subPos","subPos", 100, -1.,1. ,100, -1.,1.); -TH2D *subPosAEta = new TH2D("subPosAEta","subPosAEta", 50, -.5,1.5 ,50, -.5,1.5); -TH2D *subPosBEta = new TH2D("subPosBEta","subPosBEta", 50, -.5,1.5 ,50, -.5,1.5); - - - -TH1D *cE = new TH1D("clusterEnergy","clusterEnergy",400, 0.,4000.); -//TH1D *cES = new TH1D("clusterEnergyS","clusterEnergyS",400, 0.,4000.); - - -TH2D *cES3vs2 = new TH2D("clusterEnergy3vs2","clusterEnergy3vs2",800, 0.,8000.,600,0.,6000.); -TH2D *cES3vs2S = new TH2D("clusterEnergy3vs2S","clusterEnergy3vs2S",800, 0.,8000.,600,0.,6000.); - -double th = 0.99; -double sigmas = 1.0; - -TH2D *imgRLR = new TH2D("imgRLR","imgRLR",160,0.0,160.0 ,160 ,0.0,160.0); -TH2D *imgLR = new TH2D("imgLR","imgLR",160*2,0.0,160.0 ,160*2 ,0.0,160.0); - -TH2D *clusHist= new TH2D("clusHist","clusHist",3,-0.5,2.5,3,-0.5,2.5); -TH2D *clusHistC= new TH2D("clusHistC","clusHistC",3,-0.5,2.5,3,-0.5,2.5); - -int **imgArray; - -int findShape(Double_t cluster[3][3], double sDum[2][2]){ - int corner = -1; - - double sum = cluster[0][0] + cluster[1][0] + cluster[2][0] + cluster[0][1] + cluster[1][1] + cluster[2][1] + cluster[0][2] + cluster[1][2] + cluster[2][2]; - - double sumTL = cluster[0][0] + cluster[1][0] + cluster[0][1] + cluster[1][1]; //2 ->BL - double sumTR = cluster[1][0] + cluster[2][0] + cluster[2][1] + cluster[1][1]; //0 ->TL - double sumBL = cluster[0][1] + cluster[0][2] + cluster[1][2] + cluster[1][1]; //3 ->BR - double sumBR = cluster[1][2] + cluster[2][1] + cluster[2][2] + cluster[1][1]; //1 ->TR - double sumMax = 0; - - - //double **sDum = subCluster; - Double_t ssDum[2][2]; - - // if(sumTL >= sumMax){ - sDum[0][0] = cluster[0][0]; sDum[1][0] = cluster[1][0]; - sDum[0][1] = cluster[0][1]; sDum[1][1] = cluster[1][1]; - - ssDum[0][0] = cluster[0][0]; ssDum[1][0] = cluster[0][1]; - ssDum[0][1] = cluster[1][0]; ssDum[1][1] = cluster[1][1]; - - corner = 2; - sumMax=sumTL; - // } - - if(sumTR >= sumMax){ - sDum[0][0] = cluster[1][0]; sDum[1][0] = cluster[2][0]; - sDum[0][1] = cluster[1][1]; sDum[1][1] = cluster[2][1]; - - ssDum[0][0] = cluster[2][0]; ssDum[1][0] = cluster[2][1]; - ssDum[0][1] = cluster[1][0]; ssDum[1][1] = cluster[1][1]; - - corner = 0; - sumMax=sumTR; - } - - if(sumBL >= sumMax){ - sDum[0][0] = cluster[0][1]; sDum[1][0] = cluster[1][1]; - sDum[0][1] = cluster[0][2]; sDum[1][1] = cluster[1][2]; - - ssDum[0][0] = cluster[0][2]; ssDum[1][0] = cluster[0][1]; - ssDum[0][1] = cluster[1][2]; ssDum[1][1] = cluster[1][1]; - - corner = 3; - sumMax=sumBL; - } - - if(sumBR >= sumMax){ - sDum[0][0] = cluster[1][1]; sDum[1][0] = cluster[2][1]; - sDum[0][1] = cluster[1][2]; sDum[1][1] = cluster[2][2]; - - ssDum[0][0] = cluster[2][2]; ssDum[1][0] = cluster[2][1]; - ssDum[0][1] = cluster[1][2]; ssDum[1][1] = cluster[1][1]; - - corner = 1; - sumMax=sumBR; - } - - switch(corner){ - case 0: - cES3vs2->Fill(sum,sumTR); break; - case 1: - cES3vs2->Fill(sum,sumBR); break; - case 2: - cES3vs2->Fill(sum,sumTL); break; - case 3: - cES3vs2->Fill(sum,sumBL); break; - } - - counter[corner]++; - remoteCounter[q]++; - - // cout << "local corner is: " << corner << " remote corner is: " << q << endl; - - return corner; -} - - - - -int placePhoton( TH2D *img, double subCluster[2][2], int cX, int cY, int corner, double *sX, double *sY, double *scX, double *scY){ - double tot = subCluster[0][0] + subCluster[0][1] + subCluster[1][0] + subCluster[1][1]; - double t = subCluster[1][0] + subCluster[1][1]; - double r = subCluster[0][1] + subCluster[1][1]; - - double xHitC = r/tot; - double yHitC = t/tot; - - imgRLR->Fill(cX,cY); - - cE->Fill(tot); - - double dX, dY; - - //before looking at annas code - /* if(corner == 0){ dX=-1.; dY=-1.; } - if(corner == 1){ dX=-1.; dY=+1.; } - if(corner == 2){ dX=+1.; dY=-1.; } - if(corner == 3){ dX=+1.; dY=+1.; }*/ - - if(corner == 0){ dX=-1.; dY=+1.; } //top left - if(corner == 1){ dX=+1.; dY=+1.; } //top right - if(corner == 2){ dX=-1.; dY=-1.; } //bottom left - if(corner == 3){ dX=+1.; dY=-1.; } //bottom right - - imgLR->Fill(cX+0.25*dX,cY+0.25*dY); - - double posX = ((double)cX) + 0.5*dX + xHitC; - double posY = ((double)cY) + 0.5*dY + yHitC; - - subPosBEta->Fill(xHitC ,yHitC); - if(img){ - img->Fill(posX,posY); - } - - if(xHitC < 0.02&& yHitC < 0.02){ - - cES3vs2S->Fill(dum[0][0]+dum[0][1]+dum[0][2]+dum[1][0]+dum[1][1]+dum[1][2]+dum[2][0]+dum[2][1]+dum[2][2],subCluster[0][0]+subCluster[0][1]+subCluster[1][0]+subCluster[1][1]); - } - - - if(sX && sY && scX && scY){ - *sX = xHitC; //0.5 + 0.5*dX + xHitC; - *sY = yHitC; //0.5 + 0.5*dY + yHitC; - *scX = ((double)cX) + 0.5*dX; - *scY = ((double)cY) + 0.5*dY; - } - return 1; -} - - - -void placePhotonCorr(TH2D *img, EtaVEL *e,double sX, double sY, double scX, double scY){ - int bin = e->findBin(sX,sY); - if(bin <= 0) return; - double subX = ((double)(e->getXBin(bin))+.5)/((double)e->getNPixels()); - double subY = ((double)(e->getYBin(bin))+.5)/((double)e->getNPixels()); - - if(img!=NULL){ - img->Fill(scX+ subX , scY+ subY); - } - subPosAEta->Fill(subX,subY); - - int iscx = scX; - int iscy = scY; - if(iscx >=nx || iscx<0 || iscy >=ny || iscy<0) return; - //cout << iscx*e->getNPixels()+e->getXBin(bin) << " " << iscy*e->getNPixels()+e->getXBin(bin) << endl; - if(img==NULL) return; - imgArray[iscx*e->getNPixels()+e->getXBin(bin)][iscy*e->getNPixels()+e->getYBin(bin)]++; -} - -void gainCorrection(Double_t corrected[3][3], TH2D *gainMap){ - - for(int xx = 0; xx < 3; xx++) - for(int yy = 0; yy < 3; yy++){ - if(gainMap && gainMap->GetBinContent(x+xx+2,y+yy+2) != 0){ - corrected[xx][yy] = dum[xx][yy] / gainMap->GetBinContent(x+xx+2,y+yy+2); - clusHistC->Fill(xx,yy,corrected[xx][yy]); - } - else - corrected[xx][yy] = dum[xx][yy]; - - clusHist->Fill(xx,yy,dum[xx][yy]); - } -} - - -EtaVEL *plotEtaDensity(TChain* tree2, TEntryList *el, EtaVEL *oldEta = NULL, TH2D **img = NULL, TH2D *gainMap=NULL, int nPixels=25) { - - - - EtaVEL *newEta = new EtaVEL(25,-0.02,1.02); - - Long64_t listEntries=el->GetN(); - Long64_t treeEntry; - Long64_t chainEntry; - - Int_t treenum=0; - tree2->SetEntryList(el); - - double gainCorrC[3][3]; - double subCluster[2][2]; - double sX, sY, scX, scY; - - cout << "Events: " << listEntries << endl; - if(oldEta == NULL){ cout << "Old Eta is NULL " << endl; } - for(int i = 0; i<4; i++){ counter[i] = 0; remoteCounter[i] = 0; } - - for (Long64_t il =0; ilGetEntryAndTree(il,treenum); - - chainEntry = treeEntry+tree2->GetTreeOffset()[treenum]; - if (tree2->GetEntry(chainEntry)) { - - gainCorrection(gainCorrC,gainMap); - //cout << gainCorrC[1][1] << endl; - - //finds corner - int corner = findShape(gainCorrC,subCluster); - - int validEvent; - - - if(img){ - validEvent = placePhoton(img[0],subCluster,x,y, corner, &sX, &sY, &scX, &scY); - }else{ - //calc etaX, etaY - validEvent = placePhoton(NULL,subCluster,x,y, corner, &sX, &sY, &scX, &scY); - } - - //fill etavel - newEta->fill(sX,sY); - - - - - if(oldEta && img && img[1]){ - placePhotonCorr(img[1],oldEta, sX,sY, scX, scY); - }else{ - placePhotonCorr(NULL,newEta,sX,sY,scX,scY); - } - - - } - //cout << il << endl; - int ssize = 500000; - if(il % ssize == 0 && il != 0 && oldEta==NULL){ - - cout << " -------------- "<< endl; - newEta->updatePixelPos(); - - - //newEta->resolveSelfIntersect(); - char tit[1000]; - /* TFile *ff = new TFile("/scratch/Spider.root","UPDATE"); - sprintf(tit,"subPosAEta%i",newEta->getIt()); subPosAEta->SetName(tit); - subPosAEta->Write(); subPosAEta->Reset(); - sprintf(tit,"subPosBEta%i",newEta->getIt()); subPosBEta->SetName(tit); - subPosBEta->Write(); subPosBEta->Reset(); - sprintf(tit,"Eta%i",newEta->getIt()); newEta->Write(tit); - ff->Close(); */ - //il = 0; - } - - if(il % ssize == ssize-1){ - double prog = (double)il/(double)listEntries*100.; - cout << prog << "%" << endl; - //if(prog > 19.) return newEta; - if(newEta->converged == 1){ cout << "converged ... " << endl; return newEta; } - } - - } - - cout << "local corners: " ; - for(int i = 0; i<4; i++) cout << i << ": " << counter[i] << " || " ; - cout << endl; - - //cout << "remote corners: " ; - //for(int i = 0; i<4; i++) cout << i << ": " << remoteCounter[i] << " || " ; - //cout << endl; - - return newEta; -} - - - - -TChain *openTree(char *tname, char *fname,double lEc, double hEc, double rms=5., char *chainName=">>thischan"){ - TChain *tree2; - // TH1D **etaDI; - char cut[1000]; - - tree2=new TChain(tname); - tree2->Add(fname); - tree2->Print(); - - //sprintf(cut,"(x<=40) && (data[%d][%d]>%f*rms) && Sum$(data)<%f && Sum$(data)>%f",1,1,rms, hEc, lEc); - // sprintf(cut,"(x<=40) && (data[%d][%d]>%f*rms)",1,1,rms);// && Sum$(data)<%f && Sum$(data)>%f",1,1,rms, hEc, lEc); - sprintf(cut,"(x<=40) && Sum$(data)<%f && Sum$(data)>%f", hEc, lEc); - // sprintf(cut,""); - cout << cut << endl; - - tree2->Draw(chainName, cut, "entrylist"); - - - tree2->SetBranchAddress("iFrame",&f); - tree2->SetBranchAddress("x",&x); - tree2->SetBranchAddress("y",&y); - tree2->SetBranchAddress("data",dum); - //tree2->SetBranchAddress("q",&q); - - cout << "openTree : end" << endl; - return tree2; -} - -EtaVEL *etaDensity(char *tname, char *fname, double lEc = 1000, double hEc=3000, TH2D *gainMap=NULL, int nPixels=25) { - /** open tree and make selection */ - TChain *tree2 = openTree(tname,fname,lEc,hEc); - TEntryList *elist = (TEntryList*)gDirectory->Get("thischan"); - if(elist == NULL) { cout << "could not open tree " << endl; return NULL; } - - EtaVEL *etaDen = plotEtaDensity(tree2,elist,NULL,NULL,gainMap,nPixels); - - - //etaDen->Draw("colz"); - cout << "done" << endl; - - return etaDen; -} - -void interpolate(char *tname, char *fname, EtaVEL *etaDI, double lEc = 1000, double hEc=3000, TH2D *gainMap=NULL) { - - TChain *tree2 = openTree(tname,fname,lEc,hEc,5.,">>intChain"); - TEntryList *elist = (TEntryList*)gDirectory->Get("intChain"); - if(elist == NULL) { cout << "could not open tree " << endl; return; } - - double nPixels = (double)etaDI->getNPixels(); - - TH2D **img = new TH2D*[3]; - img[0] = new TH2D("img","img",nPixels*160,0.0,160.0 ,nPixels*160 ,0.0,160.0); - img[1] = new TH2D("imgE","imgE",nPixels*160,0.0,160.0 ,nPixels*160 ,0.0,160.0); - - int inPixels = etaDI->getNPixels(); - - imgArray = new int*[inPixels*160]; - for(int i = 0; i < inPixels*160; i++){ - imgArray[i] = new int[inPixels*160]; - for(int j = 0; j < inPixels*160; j++){ - imgArray[i][j] = 0; - } - } - - cout << "starting" << endl; - plotEtaDensity(tree2,elist, etaDI,img,gainMap); - - //img->Draw("colz"); -} - - -TH2D *createGainMap(char *tname, char *fname, double lEc = 0,double hEc=10000){ - char name[100]; - TH1D *avgSpec3 = new TH1D("avgSpec3", "avgSpec3",hEc/20,0,hEc); - TH1D ***specs3 = new TH1D**[160]; - TH1D ***specs1 = new TH1D**[160]; - for(int xx = 0; xx < 160; xx++){ - specs3[xx] = new TH1D*[160]; - specs1[xx] = new TH1D*[160]; - for(int yy = 0; yy < 160; yy++){ - sprintf(name,"S3x%iy%i",xx,yy); - specs3[xx][yy] = new TH1D(name,name,hEc/20,0,hEc); - sprintf(name,"S1x%iy%i",xx,yy); - specs1[xx][yy] = new TH1D(name,name,hEc/20,0,hEc); - } - } - - - TChain *tree2 = openTree(tname,fname,0,hEc,5.,">>gainChan"); - TEntryList *elist = (TEntryList*)gDirectory->Get("gainChan"); - if(elist == NULL) { cout << "could not open tree " << endl; return NULL; } - - Long64_t listEntries=elist->GetN(); - Long64_t treeEntry; - Long64_t chainEntry; - - Int_t treenum=0; - tree2->SetEntryList(elist); - - cout << "Events: " << listEntries << endl; - for(int i = 0; i<4; i++) counter[i] = 0; - for (Long64_t il =0; ilGetEntryAndTree(il,treenum); - chainEntry = treeEntry+tree2->GetTreeOffset()[treenum]; - - if (tree2->GetEntry(chainEntry)) { - double sum = 0; - for(int xx = 0; xx < 3; xx++) - for(int yy = 0; yy < 3; yy++) - sum += dum[xx][yy]; - specs3[x][y]->Fill(sum); - specs1[x][y]->Fill(dum[1][1]); - avgSpec3->Fill(sum); - } - } - - TH2D *gainMap3 = new TH2D("gainMap3","gainMap3",160,-0.5,160.-0.5,160,-.5,160.-.5); - TH2D *gainMap1 = new TH2D("gainMap1","gainMap1",160,-0.5,160.-0.5,160,-.5,160.-.5); - for(int xx = 0; xx < 160; xx++){ - for(int yy = 0; yy < 160; yy++){ - TF1 *gf3 = new TF1("gf3","gaus", lEc, hEc); - specs3[xx][yy]->Fit(gf3,"Q"); - double e3 = gf3->GetParameter(1); - gainMap3->Fill(xx,yy,e3); - - TF1 *gf1 = new TF1("gf1","gaus", lEc, hEc); - specs1[xx][yy]->Fit(gf1,"Q"); - double e1 = gf1->GetParameter(1); - gainMap1->Fill(xx,yy,e1); - - } - } - - return gainMap3; -} - -void writeMatlab2DHisto(int xx, int yy,char *outFileName){ - ofstream outFile; - outFile.open (outFileName); - - cout << "create matlab file with " << xx << " xbins and " << yy << " ybins" << endl; - - for(int y = 0; y < yy; y++){ - for(int x = 0; x < xx; x++){ - outFile << imgArray[x][y] << "\t"; - } - outFile << endl; - } - - outFile.close(); -} - -//COMPLETE STUFF - -void createImage(char *tdir, char *tname, char *ftname, char *ifname = NULL, int useGM=0, double lEth=-1., double hEth=-1.){ - imgRLR->Reset(); - imgLR->Reset(); - - char fname[1000]; - char inFName[1000]; - char outFName[1000]; - char moutFName[1000]; - if(ifname == NULL){ - sprintf(fname,"%s/%s_*.root",tdir,tname); - }else{ - sprintf(fname,"%s",ifname); - } - - if(useGM) sprintf(inFName,"%s/%s-PlotsWGMVEL.root",tdir,ftname); - else sprintf(inFName,"%s/%s-PlotsVEL.root",tdir,ftname); - - sprintf(outFName,"%s/%s-ImgVEL.root",tdir,tname); - sprintf(moutFName,"%s/%s-ImgVEL.mf",tdir,tname); - - TFile *inFile = new TFile(inFName,"READ"); - - cout << "Image Tree File Name: " << fname << endl; - cout << "Eta File Name: " << inFName << endl; - cout << "Out File Name: " << outFName << endl; - cout << "Matlab Out File Name: " << moutFName << endl; - - TH2D *gm = NULL; - if(useGM){ - cout << "Load gain map" << endl; - gm = (TH2D *)gDirectory->Get("gainMap"); - if(gm == NULL){ cout << "can not find gainMap in file" << endl; return; } - } - - cout << "Load eta" << endl; - EtaVEL *ee = (EtaVEL *)gDirectory->Get("etaDist"); - - cout << "Select Energy BW" << endl; - TH1D *spec = (TH1D *)gDirectory->Get("avgSpec3"); - if(spec == NULL){ cout << "can not find avgSpec3" << endl; return; } - - TF1 *gf3 = new TF1("gf3","gaus", 0, 10000); - spec->Fit(gf3,"Q"); - double avgE = gf3->GetParameter(1); - double sigE = gf3->GetParameter(2); - cout << "avgE: " << avgE << " sigE: " << sigE << endl; - cout << endl; - - if(lEth == -1.) lEth = avgE-5.*sigE; - if(hEth == -1.) hEth = avgE+5.*sigE; - cout << lEth << " < E < " << hEth << " (eV)" << endl; - - cout << "start with interpolation" << endl; - interpolate( tname, fname, ee,lEth,hEth ,gm); - - - TH2D *img = (TH2D *)gDirectory->Get("img"); - if(img == NULL){ cout << "could not find 2d-histogram: img " << endl; return; } - - - TH2D *imgE = (TH2D *)gDirectory->Get("imgE"); - if(imgE == NULL){ cout << "could not find 2d-histogram: imgE " << endl; return; } - - - //TH2D *imgEOM = (TH2D *)gDirectory->Get("imgEOM"); - //if(imgEOM == NULL){ cout << "could not find 2d-histogram: imgEOM " << endl; return; } - - TFile *outFile = new TFile(outFName,"UPDATE"); - imgLR->Write(); - imgRLR->Write(); - imgE->Write(); - //imgEOM->Write(); - img->Write(); - outFile->Close(); - inFile->Close(); - cout << "writing matlab file: " << moutFName << endl; - writeMatlab2DHisto(160*ee->getNPixels(),160*ee->getNPixels(),moutFName); - cout << "Done : " << outFName << endl; - -} - -/** - \par tdir input tree directory - \par tname input tree name - \par ifname input file name if different than tdir/tname_*.root - \par useGM use gain map - \par maxExpEinEv spectrum maximum - \par nPixels sub-pixels bins - \par lEth low threshold - \par hEth high threshold - - */ - - -EtaVEL *createGainAndEtaFile(char *tdir, char *tname, char *ifname=NULL, int useGM=0, double maxExpEinEv=25000., int nPixels =25, double lEth=-1., double hEth=-1.){ - char fname[1000]; - char outFName[1000]; - - - if(ifname == NULL){ - sprintf(fname,"%s/%s_*.root",tdir,tname); - }else{ - sprintf(fname,"%s",ifname); - } - - if(useGM) sprintf(outFName,"%s/%s-PlotsWGVEL.root",tdir,tname); - else sprintf(outFName,"%s/%s-PlotsVEL.root",tdir,tname); - - - cout << "Tree File Name: " << fname << endl; - cout << "Output File Name: " << outFName << endl; - - /** creates gain map and 3x3 spectrum */ - cout << "Creating gain map: " << endl; - TH2D *gm = createGainMap(tname,fname,0,maxExpEinEv/10.); - gm->SetName("gainMap"); - - - /** gets average 3x3 spectrum and fits it with a gaus */ - TH1D *spec = (TH1D *)gDirectory->Get("avgSpec3"); - if(spec == NULL){ cout << "can not find avgSpec3" << endl; return NULL; } - TF1 *gf3 = new TF1("gf3","gaus", 0, maxExpEinEv/10.); - spec->Fit(gf3,"Q"); - double avgE = gf3->GetParameter(1); - double sigE = gf3->GetParameter(2); - cout << "avgE: " << avgE << " sigE: " << sigE << endl; - cout << endl; - - - /** sets high and low threshold if not given by the user */ - if(lEth == -1.) lEth = avgE-5.*sigE; - if(hEth == -1.) hEth = avgE+5.*sigE; - cout << lEth << " < E < " << hEth << " (eV)" << endl; - - - - - cout << "calculating eta stuff" << endl; - - EtaVEL *newEta; - if(useGM) newEta = etaDensity(tname,fname,lEth,hEth,gm,nPixels); - else newEta = etaDensity(tname,fname,lEth,hEth,NULL,nPixels); - - cout << "writing to file " << outFName << endl; - - TFile *outFile = new TFile(outFName,"UPDATE"); - - newEta->Write("etaDist"); - - gm->Write(); - spec->Write(); - subPosAEta->Write(); - cES3vs2->Write(); - - outFile->Close(); - cout << "Done : " << outFName << endl; - return newEta; -} - -void exportSpec(char *tdir, char *tname){ - char tfname[1000]; - char ofname[1000]; - char cleanName[1000]; - - for(int p = 0; p < strlen(tname);p++){ - cleanName[p+1] = '\0'; - cleanName[p] = tname[p]; - - if(tname[p] == '-') cleanName[p] = '_'; - } - - sprintf(tfname,"%s/%s-PlotsVEL.root",tdir,tname); - sprintf(ofname,"%s/%s_SpecVEL.m",tdir,cleanName); - TFile *tf = new TFile(tfname); - TH1D *spec = (TH1D *)gDirectory->Get("avgSpec3"); - - ofstream outFile; - outFile.open (ofname); - - if(outFile.fail()){ - cout << "Could not open file : " << ofname << endl; - return; - } - - cout << "create matlab file with with spec " << ofname << endl; - - - outFile << cleanName << " = [ " << endl; - for(int i = 0; i < spec->GetNbinsX(); i++){ - outFile << i << " " << spec->GetBinCenter(i) << " " << spec->GetBinContent(i) << " ; " << endl; - } - - outFile << " ] ; " << endl; - - outFile.close(); -} diff --git a/slsDetectorCalibration/interpolations/etaVEL/EtaVEL.cpp b/slsDetectorCalibration/interpolations/etaVEL/EtaVEL.cpp deleted file mode 100644 index 922c91d4f..000000000 --- a/slsDetectorCalibration/interpolations/etaVEL/EtaVEL.cpp +++ /dev/null @@ -1,679 +0,0 @@ -#include "EtaVEL.h" -#include - - -// ClassImp(EtaVEL); - -// double Median(const TH1D * histo1) { - -// int numBins = histo1->GetXaxis()->GetNbins(); -// Double_t *x = new Double_t[numBins]; -// Double_t* y = new Double_t[numBins]; -// for (int i = 0; i < numBins; i++) { -// x[i] = histo1->GetBinCenter(i); -// y[i] = histo1->GetBinContent(i); -// } -// return TMath::Median(numBins, x, y); -// } - - -double *EtaVEL::getPixelCorners(int x, int y){ - double tlX,tlY,trX,trY,blX,blY,brX,brY; - tlX = xPPos[getCorner(x,y+1)]; - tlY = yPPos[getCorner(x,y+1)]; - trX = xPPos[getCorner(x+1,y+1)]; - trY = yPPos[getCorner(x+1,y+1)]; - blX = xPPos[getCorner(x,y)]; - blY = yPPos[getCorner(x,y)]; - brX = xPPos[getCorner(x+1,y)]; - brY = yPPos[getCorner(x+1,y)]; - - //cout << "gPC: TL: " << getCorner(x,y+1) << " TR: " << getCorner(x+1,y+1) << " BL " << getCorner(x,y) << " BR " << getCorner(x+1,y) << endl; - - double *c = new double[8]; - c[0] = tlX; c[1] = trX; c[2] = brX; c[3] = blX; - c[4] = tlY; c[5] = trY; c[6] = brY; c[7] = blY; - return c; -} - - -int EtaVEL::findBin(double xx, double yy){ - - double tlX,tlY,trX,trY,blX,blY,brX,brY; - /********Added by anna ******/ - // if (xxmax) xx=max-1E-6; - // if (yymax) yy=max-1E-6; - /**************/ - - - int bin = -1; - for(int x = 0; x < nPixels; x++){ - for(int y = 0; y < nPixels; y++){ - double *c = getPixelCorners(x,y); - tlX = c[0]; trX = c[1]; brX = c[2]; blX = c[3]; - tlY = c[4]; trY = c[5]; brY = c[6]; blY = c[7]; - - ///if(y == 0){ - // cout << "x: " << x << " blY " << blY << " brY " << brY << endl; - //} - - int out = 0; - - double tb = 0; - double bb = 0; - double lb = 0; - double rb = 0; - - if((trX-tlX)>0.) - tb = (trY - tlY)/(trX-tlX); - - if((brX-blX)>0.) - bb = (brY - blY)/(brX-blX); - - if((tlY-blY)>0.) - lb = (tlX - blX)/(tlY-blY); - - if((trY-brY)>0.) - rb = (trX - brX)/(trY-brY); - - double ty = tlY + tb * (xx - tlX); - double by = blY + bb * (xx - blX); - - double lx = blX + lb * (yy - blY); - double rx = brX + rb * (yy - brY); - - - - - if(yy >= ty) out++; - if(yy < by) out++; - if(xx < lx) out++; - if(xx >= rx) out++; - - //cout << "ty " << ty << endl; - //cout << "by " << by << endl; - //cout << "lx " << lx << endl; - //cout << "rx " << rx << endl; - - //double dist = (xx - xPPos[getBin(x,y)]) * (xx - xPPos[getBin(x,y)]) + (yy - yPPos[getBin(x,y)]) * (yy - yPPos[getBin(x,y)]); - //cout << "x " << x << " y " << y << " out " << out << " ty " << ty << endl; - //cout << "tl " << tlX << "/" << tlY << " tr " << trX << "/" << trY << endl; - //cout << "bl " << blX << "/" << blY << " br " << brX << "/" << brY << endl; - - //cout << " tb " << tb << endl; - - - delete[] c; - if(out == 0){ return getBin(x,y); } - } - } - - return -1; -} - -void EtaVEL::createLogEntry(){ - if(it >= nIterations){ - cerr << "log full" << endl; - } - log[it].itN = it; - log[it].xPos = new double[nPixels*nPixels+1]; - log[it].yPos = new double[nPixels*nPixels+1]; - log[it].binCont = new double[nPixels*nPixels+1]; - for(int x = 0; x < nPixels; x++) - for(int y = 0; y < nPixels; y++){ - log[it].xPos[getBin(x,y)] = xPPos[getBin(x,y)]; - log[it].yPos[getBin(x,y)] = yPPos[getBin(x,y)]; - log[it].binCont[getBin(x,y)] = binCont[getBin(x,y)]; - } - it++; -} - -void EtaVEL::updatePixelCorner(){ - double w = 20; - int rows = (nPixels+1)*(nPixels+1) + 4 + 4 * 4;//(4*(nPixels+1))-4; - int cols = (nPixels+1)*(nPixels+1); - - double *rVx = new double[rows]; - double *rVy = new double[rows]; - - double *posMat = new double[rows*cols]; - for(int i = 0 ; i < rows*cols; i++) posMat[i] = 0; - int boundaryPoint = 0; - - cout << "linear sys stuff" << endl; - - double minELength = 100000000000000; int minX=-1, minY=-1; - - for(int y = 0; y < nPixels+1; y++){ - for(int x = 0; x < nPixels+1; x++){ - double bx = 0, by = 0; - - //boundary conditions - - if((x == 0 && y % 5 == 0) || - (x == nPixels && y % 5 == 0) || - (y == 0 && x % 5 == 0) || - (y == nPixels && x % 5 == 0)){ - - bx = xPPos[getCorner(x,y)]; - //cout << "bP " << boundaryPoint << " bx " << bx << endl; - by = yPPos[getCorner(x,y)]; - rVx[(nPixels+1)*(nPixels+1) + boundaryPoint] = bx*w; - rVy[(nPixels+1)*(nPixels+1) + boundaryPoint] = by*w; - posMat[(nPixels+1)*(nPixels+1)*cols + boundaryPoint * cols + getCorner(x,y)-1] = w; - boundaryPoint++; - } - - double tot = 4 - (x == 0) - (y == 0) - (x == nPixels) - (y == nPixels); - //cout << "totW: " << tot << endl; - //tot = 4.; - double eLength = 0; - if(x != 0) eLength += edgeL[getEdgeX(x-1,y)]; - if(y != 0) eLength += edgeL[getEdgeY(x,y-1)]; - if(x != nPixels) eLength += edgeL[getEdgeX(x,y)]; - if(y != nPixels) eLength += edgeL[getEdgeY(x,y)]; - - /*cout << "Corner X:" <Print(); - k->SetMatrixArray(posMat); - // k->Print(); - - - //solve linear system - - Bool_t ok; - TDecompSVD *s = new TDecompSVD(*k); - s->Solve(*fx); - s->Solve(*fy); - - double *fxA = fx->GetMatrixArray(); - double *fyA = fy->GetMatrixArray(); - - - for(int y = 0; y < nPixels+1; y++){ - for(int x = 0; x < nPixels+1; x++){ - //do not update boundaries - - if(!(x == 0 || - x == nPixels|| - y == 0 || - y == nPixels)){ - xPPos[getCorner(x,y)] = fxA[getCorner(x,y)-1]; - yPPos[getCorner(x,y)] = fyA[getCorner(x,y)-1]; - } - } - } -} - -void EtaVEL::updatePixelPos(){ - double xMov, yMov, d1Mov, d2Mov; - createLogEntry(); - double *chMap = getChangeMap(); - int ch =0; - - cout << "update edge lengths" << endl; - for(int x = 0; x < nPixels; x++) - for(int y = 0; y < nPixels; y++){ - - - /*cout << "Pixel X:" < 0. & totCont > 0.){ - dd=sqrt(r/avg); - /**Added by Anna */ - if (dd>2.) dd=1.5; - if (dd<0.5) dd=0.75; - chMap[getBin(x,y)] = dd; - /** */ - //if( chMap[getBin(x,y)] < 1.){ chMap[getBin(x,y)] = 1/1.2; } - //if( chMap[getBin(x,y)] > 1.){ chMap[getBin(x,y)] = 1.2; } - //if( chMap[getBin(x,y)] < 1/1.2){ chMap[getBin(x,y)] = 1/1.2; } - //if( chMap[getBin(x,y)] > 1.2){ chMap[getBin(x,y)] = 1.2; } - }else if(totCont > 0.){ - chMap[getBin(x,y)] =0.5; //1/1.2; - }else{ - chMap[getBin(x,y)] = 1.; - } - - //if(r < avg + 2*acc && r > avg - 2*acc){ totInRange++;}// chMap[getBin(x,y)] = 1.; } - - /** Commente away by Anna - if(converged == 0 && r < med+20*acc){ chMap[getBin(x,y)] = 1.; } - if(converged == 2 && r < med+20*acc && r > med-03*acc){ chMap[getBin(x,y)] = 1.; } - if(r < med+03*acc){ totInRange03s++; } - if(r < med+07*acc){ totInRange07s++; } - if(r < med+12*acc){ totInRange12s++; } - if(r < med+20*acc){ totInRange20s++; } - if(r < med+25*acc){ totInRange25s++; } - */ - - //cout << "x " << x << " y " << y << " r " << r << " ch " << chMap[getBin(x,y)] << endl; - // if(r - avg > acc){ totOffAcc += r-avg;} - //if(r - avg < -acc){ totOffAcc += avg-r;} - totOffAcc += (avg-r)*(avg-r); - chi_sq+=(avg-r)*(avg-r)/r; - //cout << " x " << x << " y " << y << " bC " << binCont[x*nPixels+y] << " r " << r << endl; - - if(r > maxC){ maxC = r; maxX = x; maxY = y; } - if(r < minC){minC = r; minX = x; minY = y; } - - } - } - // cout << "totInBins " << totInBins << " zero Bin " << binCont[0] << endl; - cout << "AvgOffAcc: " << sqrt(totOffAcc/(double)(nPixels*nPixels)) << endl; - cout << "***********Reduced Chi Square: " << chi_sq/((double)(nPixels*nPixels)) << endl; - // cout << "totInRange03 (<" << med+03*acc << "): " << totInRange03s << endl; - // cout << "totInRange07 (<" << med+07*acc << "): " << totInRange07s << endl; - // cout << "totInRange12 (<" << med+12*acc << "): " << totInRange12s << endl; - // cout << "totInRange20 (<" << med+20*acc << "): " << totInRange20s << endl; - // cout << "totInRange25 (<" << med+25*acc << "): " << totInRange25s << endl; - double maxSig = (maxC - avg)*(maxC - avg) / avg;//acc; - double minSig = (avg - minC)*(avg - minC) / avg;//acc; - cout << "Max Pixel X: " << maxX << " Y: " << maxY << " P# " << getBin(maxX,maxY) << " count: " << maxC << " sig: "<< maxSig << endl; - cout << "Min Pixel X: " << minX << " Y: " << minY << " P# " << getBin(minX,minY) << " count: " << minC << " sig: "<< minSig << endl; - - // if(maxSig <= 25){ converged = 2; cout << "reached first converstion step!!!" << endl; } - //if(minSig <= 7 && converged == 2) { converged = 1; } - if (chi_sq<3) converged=2; - if (chi_sq<1) converged=1; - cout << "Conversion step "<< converged << endl; - return chMap; -} - -TH2D *EtaVEL::getContent(int it, int changeType){ - TH2D *cont = new TH2D("cont","cont",nPixels,min,max,nPixels,min,max); - double *chMap = NULL; - if(changeType ==1) chMap = getChangeMap(); - double *szMap = getSizeMap(); - for(int x = 0; x < nPixels; x++) - for(int y = 0; y < nPixels; y++){ - if(changeType ==2 ){ - cont->SetBinContent(x+1,y+1,szMap[getBin(x,y)]); - } - if(changeType ==1 ){ - cont->SetBinContent(x+1,y+1,chMap[getBin(x,y)]); - } - if(changeType ==0 ){ - if(it == -1){ - cont->SetBinContent(x+1,y+1,binCont[getBin(x,y)]); - //cout << "x " << x << " y " << y << " cont " << binCont[getBin(x,y)] << endl; - } - else{cont->SetBinContent(x+1,y+1,log[it].binCont[getBin(x,y)]);} - } - } - return cont; -} - -TH1D *EtaVEL::getCounts(){ - TH1D *ch = new TH1D("ch","ch",500,0,totCont/(nPixels*nPixels)*4); - for(int x = 0; x < nPixels; x++) - for(int y = 0; y < nPixels; y++){ - ch->Fill(binCont[getBin(x,y)]); - } - return ch; - -} - -void EtaVEL::printGrid(){ - - double *colSum = new double[nPixels+1]; - double *rowSum = new double[nPixels+1]; - - for(int i = 0; i < nPixels+1; i++){ - colSum[i] = 0.; - rowSum[i] = 0.; - for(int j = 0; j < nPixels; j++){ - rowSum[i] += edgeL[getEdgeX(j,i)]; - colSum[i] += edgeL[getEdgeY(i,j)]; - } - } - - cout << endl; - - cout.precision(3); cout << fixed; - cout << " "; - for(int x = 0; x < nPixels+1; x++){ - cout << setw(2) << x << " (" << colSum[x] << ") "; - } - cout << endl; - for(int y = 0; y < nPixels+1; y++){ - cout << setw(2) << y << " "; - for(int x = 0; x < nPixels+1; x++){ - cout << "(" << xPPos[getCorner(x,y)] << "/" << yPPos[getCorner(x,y)] << ") " ; - if(x < nPixels) cout << " -- " << edgeL[getEdgeX(x,y)]/rowSum[y]*(max-min) << " -- "; - } - cout << " | " << rowSum[y] << endl; - - if(y < nPixels){ - cout << " "; - for(int x = 0; x < nPixels+1; x++){ - cout << edgeL[getEdgeY(x,y)]/colSum[x]*(max-min) << " "; - } - cout << endl; - } - - } - delete[] colSum; - delete[] rowSum; - -} - -TMultiGraph *EtaVEL::plotPixelBorder(int plotCenters){ - TMultiGraph *mg = new TMultiGraph(); - double cx[5], cy[5]; - for(int x = 0; x < nPixels; x++) - for(int y = 0; y < nPixels; y++){ - double *c = getPixelCorners(x,y); - cx[0]=c[0]; cx[1]=c[1]; cx[2]=c[2]; cx[3]=c[3]; cx[4]=c[0]; - cy[0]=c[4]; cy[1]=c[5]; cy[2]=c[6]; cy[3]=c[7]; cy[4]=c[4]; - - - TGraph *g = new TGraph(5,cx,cy); - mg->Add(g); - if(plotCenters){ - g = new TGraph(1,&(xPPos[getBin(x,y)]),&(yPPos[getBin(x,y)])); - mg->Add(g); - } - delete[] c; - } - return mg; -} - -TMultiGraph *EtaVEL::plotLog(int stepSize, int maxIt){ - int mIt; - TMultiGraph *mg = new TMultiGraph(); - double **xposl = new double*[nPixels*nPixels+1]; - double **yposl = new double*[nPixels*nPixels+1]; - if(maxIt==-1){ mIt = it; } else{ mIt = maxIt; }; - cout << "mIt " << mIt << " steps " << mIt/stepSize << endl; - for(int x = 0; x < nPixels; x++){ - for(int y = 0; y < nPixels; y++){ - xposl[getBin(x,y)] = new double[mIt/stepSize]; - yposl[getBin(x,y)] = new double[mIt/stepSize]; - for(int i = 0; i < mIt/stepSize; i++){ - xposl[getBin(x,y)][i] = log[i*stepSize].xPos[getBin(x,y)]; - yposl[getBin(x,y)][i] = log[i*stepSize].yPos[getBin(x,y)]; - } - TGraph *g = new TGraph(mIt/stepSize,xposl[getBin(x,y)],yposl[getBin(x,y)]); - g->SetLineColor((x*y % 9) + 1); - - if(x == 0) g->SetLineColor(2); - if(y == 0) g->SetLineColor(3); - if(x == nPixels-1) g->SetLineColor(4); - if(y == nPixels-1) g->SetLineColor(5); - mg->Add(g); - } - } - return mg; -} - -void EtaVEL::serialize(ostream &o){ - // b.WriteVersion(EtaVEL::IsA()); - char del = '|'; - o << min << del; - o << max << del; - o << ds << del; - o << nPixels << del; - o << it << del; - o << totCont << del; - for(int i = 0; i < (nPixels+1)*(nPixels+1)+1; i++){ - o << xPPos[i] << del; - o << yPPos[i] << del; - } - for(int i = 0; i < nPixels*nPixels+1; i++){ - o << binCont[i] << del; - } - - for(int i = 0; i < it; i++){ - o << log[i].itN << del; - for(int j = 0; j < (nPixels+1)*(nPixels+1)+1; j++){ - o << log[i].xPos[j] << del; - o << log[i].yPos[j] << del; - } - for(int j = 0; j < nPixels*nPixels+1; j++){ - o << log[i].binCont[j] << del; - } - } -} - -void EtaVEL::deserialize(istream &is){ - delete[] xPPos; - delete[] yPPos; - delete[] binCont; - - char del; - - is >> min >> del; - is >> max >> del; - is >> ds >> del; - is >> nPixels >> del; - is >> it >> del; - is >> totCont >> del; - - xPPos = new double[(nPixels+1)*(nPixels+1)+1]; - yPPos = new double[(nPixels+1)*(nPixels+1)+1]; - binCont = new double[nPixels*nPixels+1]; - - cout << "d"; - - for(int i = 0; i < (nPixels+1)*(nPixels+1)+1; i++){ - is >> xPPos[i] >> del; - is >> yPPos[i] >> del; - } - - cout << "d"; - - for(int i = 0; i < nPixels*nPixels+1; i++){ - is >> binCont[i] >> del; - } - - cout << "d"; - - for(int i = 0; i < it; i++){ - is >> log[i].itN >> del; - log[i].xPos = new double[(nPixels+1)*(nPixels+1)+1]; - log[i].yPos = new double[(nPixels+1)*(nPixels+1)+1]; - log[i].binCont = new double[nPixels*nPixels+1]; - - for(int j = 0; j < (nPixels+1)*(nPixels+1)+1; j++){ - is >> log[i].xPos[j] >> del; - is >> log[i].yPos[j] >> del; - } - for(int j = 0; j < nPixels*nPixels+1; j++){ - is >> log[i].binCont[j] >> del; - } - cout << "d"; - } - cout << endl; -} - -void EtaVEL::Streamer(TBuffer &b){ - if (b.IsReading()) { - Version_t v = b.ReadVersion(); - - delete[] xPPos; - delete[] yPPos; - delete[] binCont; - - b >> min; - b >> max; - b >> ds; - b >> nPixels; - b >> it; - b >> totCont; - - xPPos = new double[(nPixels+1)*(nPixels+1)+1]; - yPPos = new double[(nPixels+1)*(nPixels+1)+1]; - binCont = new double[nPixels*nPixels+1]; - - for(int i = 0; i < (nPixels+1)*(nPixels+1)+1; i++){ - b >> xPPos[i]; - b >> yPPos[i]; - } - for(int i = 0; i < nPixels*nPixels+1; i++){ - b >> binCont[i]; - } - - for(int i = 0; i < it; i++){ - b >> log[i].itN; - log[i].xPos = new double[(nPixels+1)*(nPixels+1)+1]; - log[i].yPos = new double[(nPixels+1)*(nPixels+1)+1]; - log[i].binCont = new double[nPixels*nPixels+1]; - - for(int j = 0; j < (nPixels+1)*(nPixels+1)+1; j++){ - b >> log[i].xPos[j]; - b >> log[i].yPos[j]; - } - for(int j = 0; j < nPixels*nPixels+1; j++){ - b >> log[i].binCont[j]; - } - } - - } else { - b.WriteVersion(EtaVEL::IsA()); - b << min; - b << max; - b << ds; - b << nPixels; - b << it; - b << totCont; - for(int i = 0; i < (nPixels+1)*(nPixels+1)+1; i++){ - b << xPPos[i]; - b << yPPos[i]; - } - for(int i = 0; i < nPixels*nPixels+1; i++){ - b << binCont[i]; - } - - for(int i = 0; i < it; i++){ - b << log[i].itN; - for(int j = 0; j < (nPixels+1)*(nPixels+1)+1; j++){ - b << log[i].xPos[j]; - b << log[i].yPos[j]; - } - for(int j = 0; j < nPixels*nPixels+1; j++){ - b << log[i].binCont[j]; - } - } - } -} - diff --git a/slsDetectorCalibration/interpolations/etaVEL/EtaVEL.h b/slsDetectorCalibration/interpolations/etaVEL/EtaVEL.h deleted file mode 100644 index 5c73d8a83..000000000 --- a/slsDetectorCalibration/interpolations/etaVEL/EtaVEL.h +++ /dev/null @@ -1,164 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -//#include - - -#include -#include -#include - -#include -#include - -using namespace std; - -#ifndef ETAVPS -#define ETAVPS - -typedef struct { - int itN; - double *xPos; - double *yPos; - double *binCont; -} itLog; - - - -class EtaVEL : public TObject{ - - public: - EtaVEL(int numberOfPixels = 25, double minn=0., double maxx=1., int nnx=160, int nny=160) : nPixels(numberOfPixels), min(minn), max(maxx), converged(0), nx(nnx), ny(nny), chi_sq(0){ - //acc = 0.02; - ds = 0.005; - - init(); - } - void init(){ - double pOffset = (max-min)/(double)nPixels; - xPPos = new double[(nPixels+1)*(nPixels+1)+1]; - yPPos = new double[(nPixels+1)*(nPixels+1)+1]; - binCont = new double[nPixels*nPixels+1]; - totCont = 0.; - edgeL = new double[2*nPixels*(nPixels+1)+1]; - - for(int ii = 0; ii < 2*nPixels*(nPixels+1)+1; ii++){ - edgeL[ii] = 1.0; - //cout << "ii " << ii << endl; - } - - for(int x = 0; x < nPixels+1; x++){ - for(int y = 0; y < nPixels+1; y++){ - xPPos[getCorner(x,y)] = min + (double)x * pOffset; - yPPos[getCorner(x,y)] = min + (double)y * pOffset; - - if(x < nPixels && y < nPixels) binCont[getBin(x,y)] = 0; - } - } - // edgeL[1] = 3.0; - updatePixelCorner(); - it = 0; - - log = new itLog[nIterations]; - } - - void fill(double x, double y, double amount = 1.){ - totCont+=amount; - int bin = findBin(x,y); - if(bin < 0) { - //cout << "can not find bin x: " << x << " y: " << y << endl; - totCont-=amount; - } - binCont[bin]+=amount; - - } - - int getBin(int x, int y){ - if(x < 0 || x >= nPixels || y < 0 || y >= nPixels){ - //cout << "getBin: out of bounds : x " << x << " y " << y << endl; - return 0; - } - return y*nPixels+x+1; - } - - int getXBin(int bin){ - return (bin-1)%nPixels; - } - - int getYBin(int bin){ - return (bin-1)/nPixels; - } - - int getCorner(int x, int y){ - return y*(nPixels+1)+x+1; - } - - int getEdgeX(int x,int row){ - int ret = row*nPixels+x+1; - //cout << "| edge X x " << x << " row " << row << ": "<< ret << " | "; - return ret; - } - - int getEdgeY(int col, int y){ - int ret = nPixels*(nPixels+1)+col*nPixels+y+1; - //cout << "| edge Y col " << col << " y " << y << ": "<< ret << " | "; - return ret; - } - - - int getIt(){ return it; }; - - int getNPixels(){ return nPixels; } - double *getXPPos(){ return xPPos; } - double *getYPPos(){ return yPPos; } - - void updatePixelCorner(); - double *getPixelCorners(int x, int y); - int findBin(double xx, double yy); - void createLogEntry(); - - void updatePixelPos(); - double *getSizeMap(); - double *getChangeMap(); - TH2D *getContent(int it=-1, int changeType = 0); - TMultiGraph *plotPixelBorder(int plotCenters=0); - TMultiGraph *plotLog(int stepSize=1, int maxIt=-1); - void printGrid(); - TH1D *getCounts(); - - void serialize(ostream &o); - void deserialize(istream &is); - - int converged ; - double getChiSq(){return chi_sq;}; - - private: - itLog *log; - int it; - const static int nIterations =10000; - int nx, ny; - int nPixels; - double *xPPos; - double *yPPos; - double *binCont; - double totCont; - double *edgeL; - // double acc; - double ds; - double min,max; - double chi_sq; - - ClassDefNV(EtaVEL,1); - #pragma link C++ class EtaVEL-; -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/etaVEL/EtaVELTr.py b/slsDetectorCalibration/interpolations/etaVEL/EtaVELTr.py deleted file mode 100644 index ebb152737..000000000 --- a/slsDetectorCalibration/interpolations/etaVEL/EtaVELTr.py +++ /dev/null @@ -1,393 +0,0 @@ -import numpy as np -import math - -maxf = 2 -minf = 0.5 - -class EtaVELTr: - def __init__(self, numberOfPixels = 25, minn=0., maxx=1.): - self.nPixels = numberOfPixels - self.nCorners = self.nPixels + 1 - self.minEta = minn - self.maxEta = maxx - #self.corners = [] - self.edgesX = [] - self.edgesY = [] - self.edgesE = [] - self.edgesF = [] - self.edgesG = [] - self.edgesH = [] - self.counts = [] - self.pOffset = (self.maxEta-self.minEta)/self.nPixels - - self.cPosX = [] - self.cPosY = [] - self.zPosX = [] - self.zPosY = [] - - self.sqSums = [] - self.cIteration = 0 - self.bSqSum = 0 - - self.initGrid() - #self.calculatePixelCorners() - self.update() - - def initGrid(self): - dd = 1 / math.sqrt(2) - - #self.corners = [ [self.minEta + x * pOffset, self.minEta + y * pOffset] for y in range(self.nPixels)] for x in range(self.nPixels) - self.cPosX = [ [self.minEta + x * self.pOffset for x in range(self.nCorners)] for y in range(self.nCorners) ] - self.cPosY = [ [self.minEta + y * self.pOffset for x in range(self.nCorners)] for y in range(self.nCorners) ] - self.counts = [ [ [0,0,0,0] for x in range(self.nPixels) ] for y in range(self.nPixels) ] - self.edgesX = [ [ 1 for x in range(self.nCorners) ] for y in range(self.nCorners + 1) ] - self.edgesY = [ [ 1 for x in range(self.nCorners+1) ] for y in range(self.nCorners) ] - self.edgesE = [ [ dd for x in range(self.nPixels) ] for y in range(self.nPixels) ] - self.edgesF = [ [ dd for x in range(self.nPixels) ] for y in range(self.nPixels) ] - self.edgesG = [ [ dd for x in range(self.nPixels) ] for y in range(self.nPixels) ] - self.edgesH = [ [ dd for x in range(self.nPixels) ] for y in range(self.nPixels) ] - - - - def update(self): - self.normalizeEdgeLengths() - self.calculateEdgeLengths2() - self.calculatePixelCorners2() - conv = False - out = 0 - outList = [] - tot = self.nPixels*self.nPixels*4 - sqSum = 0 - avg = self.getAvgCounts() - avgPS = self.getAvgCounts() + 1*math.sqrt(self.getAvgCounts()) - avgMS = self.getAvgCounts() - 1*math.sqrt(self.getAvgCounts()) - for y in range(self.nPixels): - for x in range(self.nPixels): - for t in range(4): - sqSum += (avg -self.counts[y][x][t]) * (avg -self.counts[y][x][t]) - if self.counts[y][x][t] > avgPS or self.counts[y][x][t] < avgMS: - - out += 1 - outList.append([y,x,t,self.counts[y][x][t]]) - - outList = sorted(outList,key=lambda t: abs(self.counts[t[0]][t[1]][t[2]]/self.getAvgCounts())) - self.counts = [ [ [0,0,0,0] for x in range(self.nPixels) ] for y in range(self.nPixels) ] - print("There are {} of {} triangles out of 1 std ({} %)".format(out,tot,out/tot*100)) - print("Total Sq Err: {}".format(sqSum)) - - self.sqSums.append(sqSum) - - if len(self.sqSums) > 2 and np.diff(self.sqSums)[-1] > 0: - print("converged after {} steps: sqSums {} diff(sqSums) {}".format(self.cIteration,self.sqSums,np.diff(self.sqSums))) - conv = True - self.bSqSum = self.sqSums[-2] - - self.cIteration += 1 - return [conv,outList,sqSum] - - def normalizeEdgeLengths(self): - sumL = 0 - sumL += sum(map(sum,zip(*self.edgesX))) - sumL += sum(map(sum,zip(*self.edgesY))) - sumL += sum(map(sum,zip(*self.edgesE))) - sumL += sum(map(sum,zip(*self.edgesF))) - sumL += sum(map(sum,zip(*self.edgesG))) - sumL += sum(map(sum,zip(*self.edgesH))) - avgL = sumL/(4*self.nPixels*self.nPixels+2*self.nCorners*(self.nCorners+1)) - print("total Sum is {} avg: {}".format(sumL,avgL)) - self.edgesX = [ [ x/avgL for x in y ] for y in self.edgesX ] - self.edgesY = [ [ x/avgL for x in y ] for y in self.edgesY ] - self.edgesE = [ [ x/avgL for x in y ] for y in self.edgesE ] - self.edgesF = [ [ x/avgL for x in y ] for y in self.edgesF ] - self.edgesG = [ [ x/avgL for x in y ] for y in self.edgesG ] - self.edgesH = [ [ x/avgL for x in y ] for y in self.edgesH ] - - def _shapeF(self,f): - f = (f - 1) * 0.6 + 1 - if f > maxf: - return maxf - if f < minf: - return minf - return f - - def calculateEdgeLengths2(self): - if self.getTotalCounts() == 0: - return - avg = self.getAvgCounts() - - for y in range(self.nPixels): - for x in range(self.nPixels): - for t in range(4): - pc = self.counts[y][x][t] - if pc == 0: - f = maxf - else: - f = math.sqrt(avg/pc) - if pc > avg-math.sqrt(avg) and pc < avg+math.sqrt(avg): - f = 1. - sf = self._shapeF(f) - if t == 0: - self.edgesX[y][x] = self.edgesX[y][x] / sf - self.edgesE[y][x] = self.edgesE[y][x] / sf - self.edgesF[y][x] = self.edgesF[y][x] / sf - if t == 1: - self.edgesY[y][x+1] = self.edgesY[y][x+1] / sf - self.edgesF[y][x] = self.edgesF[y][x] / sf - self.edgesH[y][x] = self.edgesH[y][x] / sf - if t == 2: - self.edgesX[y+1][x] = self.edgesX[y+1][x] / sf - self.edgesH[y][x] = self.edgesH[y][x] / sf - self.edgesG[y][x] = self.edgesG[y][x] / sf - if t == 3: - self.edgesY[y][x] = self.edgesY[y][x] / sf - self.edgesG[y][x] = self.edgesG[y][x] / sf - self.edgesE[y][x] = self.edgesE[y][x] / sf - - - def calculatePixelCorners2(self): - w = 20 - posMat = [] - CrVx = np.zeros((self.nCorners,self.nCorners)) - CrVy = np.zeros((self.nCorners,self.nCorners)) - ZrVx = np.zeros((self.nPixels,self.nPixels)) - ZrVy = np.zeros((self.nPixels,self.nPixels)) - - #boundary conditions matrix/vectors - BCposMatX = [] - BCposMatY = [] - BCrVx = [] - BCrVy = [] - - for y in range(self.nCorners): - for x in range(self.nCorners): - BClineX = np.zeros((self.nCorners,self.nCorners)) - BClineY = np.zeros((self.nCorners,self.nCorners)) - if (x == 0 and y == 0) or \ - (x == 0 and y == self.nPixels) or \ - (x == self.nPixels and y == 0) or \ - (x == self.nPixels and y == self.nPixels): - BClineX[y][x] = w - BClineY[y][x] = w - BCrVx.append(self.getCornerPos(y,x)[0] * w) - BCrVy.append(self.getCornerPos(y,x)[1] * w) - #print("bclinex shape {} zeros shape {}".format( BClineX.reshape((self.nCorners*self.nCorners,)).shape , np.zeros((self.nPixels*self.nPixels)).shape )) - BCposMatX.append(np.hstack((BClineX.reshape((self.nCorners*self.nCorners,)),np.zeros((self.nPixels*self.nPixels,)) )) ) - BCposMatY.append(np.hstack((BClineY.reshape((self.nCorners*self.nCorners,)),np.zeros((self.nPixels*self.nPixels,)) )) ) - - elif x == 0 or x == self.nPixels: - BClineX[y][x] = w - #BClineY[y][x] = 1 - BCrVx.append(self.getCornerPos(y,x)[0] * w) - #BCrVy.append(self.getCornerPos(y,x)[1]) - BCposMatX.append(np.hstack((BClineX.reshape((self.nCorners*self.nCorners,)),np.zeros((self.nPixels*self.nPixels,)) )) ) - #BCposMatY.append(np.hstack((BClineY.reshape((self.nCorners*self.nCorners,)),np.zeros((self.nPixels*self.nPixels,)) )) ) - elif y == 0 or y == self.nPixels: - #BClineX[y][x] = 1 - BClineY[y][x] = w - #BCrVx.append(self.getCornerPos(y,x)[0]) - BCrVy.append(self.getCornerPos(y,x)[1] * w) - #BCposMatX.append(np.hstack((BClineX.reshape((self.nCorners*self.nCorners,)),np.zeros((self.nPixels*self.nPixels,)) )) ) - BCposMatY.append(np.hstack((BClineY.reshape((self.nCorners*self.nCorners,)),np.zeros((self.nPixels*self.nPixels,)) )) ) - - - eLength = 0 - - if x != 0: - eLength += self.edgesX[y][x-1] - if y != 0: - eLength += self.edgesY[y-1][x] - if x != self.nPixels: - eLength += self.edgesX[y][x] - if y != self.nPixels: - eLength += self.edgesY[y][x] - - if y != 0 and x != 0: - eLength += self.edgesH[y-1][x-1] - if y != self.nPixels and x != 0: - eLength += self.edgesF[y][x-1] - if y != 0 and x != self.nPixels: - eLength += self.edgesG[y-1][x] - if y != self.nPixels and x != self.nPixels: - eLength += self.edgesE[y][x] - - line = np.zeros((self.nCorners,self.nCorners)) - lineZ = np.zeros((self.nPixels,self.nPixels)) - - - if x != 0: - line[y][x-1] = - self.edgesX[y][x-1]/eLength - if y != 0: - line[y-1][x] = - self.edgesY[y-1][x]/eLength - if x != self.nPixels: - line[y][x+1] = - self.edgesX[y][x]/eLength - if y != self.nPixels: - line[y+1][x] = - self.edgesY[y][x]/eLength - - if y != 0 and x != 0: - lineZ[y-1][x-1] = -self.edgesH[y-1][x-1]/eLength - if y != self.nPixels and x != 0: - lineZ[y][x-1] = -self.edgesF[y][x-1]/eLength - if y != 0 and x != self.nPixels: - lineZ[y-1][x] = -self.edgesG[y-1][x]/eLength - if y != self.nPixels and x != self.nPixels: - lineZ[y][x] = -self.edgesE[y][x]/eLength - - - line[y][x] = 1 - CrVx[y][x] = 0 - CrVy[y][x] = 0 - posMat.append( \ - np.hstack(( \ - line.reshape((self.nCorners*self.nCorners,)), \ - lineZ.reshape((self.nPixels*self.nPixels,)) \ - )) \ - ) - - for y in range(self.nPixels): - for x in range(self.nPixels): - line = np.zeros((self.nCorners,self.nCorners)) - lineZ = np.zeros((self.nPixels,self.nPixels)) - - eLength = self.edgesE[y][x] + self.edgesF[y][x] +self.edgesG[y][x] +self.edgesH[y][x] - line[y][x] = -self.edgesE[y][x] / eLength - line[y][x+1] = -self.edgesF[y][x] / eLength - line[y+1][x] = -self.edgesG[y][x] / eLength - line[y+1][x+1] = -self.edgesH[y][x] / eLength - - lineZ[y][x] = 1 - ZrVx[y][x] = 0 - ZrVy[y][x] = 0 - posMat.append( \ - np.hstack(( \ - line.reshape((self.nCorners*self.nCorners,)), \ - lineZ.reshape((self.nPixels*self.nPixels,)) \ - )) \ - ) - - CrVxFlat = CrVx.reshape((self.nCorners*self.nCorners,)) - CrVyFlat = CrVy.reshape((self.nCorners*self.nCorners,)) - ZrVxFlat = ZrVx.reshape((self.nPixels*self.nPixels,)) - ZrVyFlat = ZrVy.reshape((self.nPixels*self.nPixels,)) - posMat = np.asarray(posMat) - - BCrVyFlat = np.asarray(BCrVy) - BCrVxFlat = np.asarray(BCrVx) - BCposMatX = np.asarray(BCposMatX) - BCposMatY = np.asarray(BCposMatY) - - print ("BCposMatY vy {} shape posMat {}".format(BCposMatY.shape,posMat.shape)) - - FinalrVy = np.hstack((CrVyFlat,ZrVyFlat,BCrVyFlat)) - FinalrVx = np.hstack((CrVxFlat,ZrVxFlat,BCrVxFlat)) - FinalposMatX = np.vstack((posMat,BCposMatX)) - FinalposMatY = np.vstack((posMat,BCposMatY)) - - print("posMat shape {}".format(posMat.shape)) - print("posMatX shape {}".format(FinalposMatX.shape)) - print("rVxFlat shape {}".format(FinalrVx.shape)) - - #print("posMat {}".format(FinalposMat)) - #print("rVxFlat {}".format(FinalrVx)) - - xPos = np.linalg.lstsq(FinalposMatX,FinalrVx)[0] - yPos = np.linalg.lstsq(FinalposMatY,FinalrVy)[0] - - print("xPosShape {} cutXPosShape {}".format(xPos.shape,xPos[:self.nCorners][:self.nCorners].shape)) - - self.cPosX = xPos[:self.nCorners*self.nCorners].reshape((self.nCorners,self.nCorners)) - self.cPosY = yPos[:self.nCorners*self.nCorners].reshape((self.nCorners,self.nCorners)) - - self.zPosX = xPos[self.nCorners*self.nCorners:].reshape((self.nPixels,self.nPixels)) - self.zPosY = yPos[self.nCorners*self.nCorners:].reshape((self.nPixels,self.nPixels)) - - - - def fill(self,yy,xx,count = 1): - [y,x,t] = self.getPixel(yy,xx) - self.counts[y][x][t] += count - - def getCountDist(self): - c = [] - for y in range(self.nPixels): - for x in range(self.nPixels): - c.append(self.counts[y][x]) - return c - - def getPixel(self,yy,xx, debug = False): - for y in range(self.nPixels): - for x in range(self.nPixels): - for t in range(4): - [v1x,v1y,v2x,v2y,v3x,v3y] = self.getTriangleCorner(y,x,t) - if self.pointInTriangle([xx,yy],[v1x,v1y],[v2x,v2y],[v3x,v3y]): - return [y,x,t] - - if not debug: - raise Exception("not inside a pixel") - else: - print("no pixel found") - return [0,0] - - #http://stackoverflow.com/questions/2049582/how-to-determine-a-point-in-a-2d-triangle - def trSign (self, p1, p2, p3): - return (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1]); - - def pointInTriangle (self,pt, v1, v2, v3): - b1 = self.trSign(pt, v1, v2) < 0.0 - b2 = self.trSign(pt, v2, v3) < 0.0 - b3 = self.trSign(pt, v3, v1) < 0.0 - return ((b1 == b2) and (b2 == b3)); - - def getAvgCounts(self): - return self.getTotalCounts() / self.nPixels/self.nPixels/4. - - def getTotalCounts(self): - tot = 0 - for y in range(self.nPixels): - for x in range(self.nPixels): - for t in range(4): - tot += self.counts[y][x][t] - return tot - - #tl tr bl br - def getPixelCorners(self,iy,ix): - return self.getCornerPos(iy,ix) + self.getCornerPos(iy,ix+1) + self.getCornerPos(iy+1,ix) + self.getCornerPos(iy+1,ix+1) - - def getTriangleCorner(self,iy,ix,tr): - if tr == 0: - return self.getCornerPos(iy,ix) + self.getCornerPos(iy,ix+1) + [self.zPosX[iy][ix],self.zPosY[iy][ix]] - if tr == 1: - return self.getCornerPos(iy,ix+1) + self.getCornerPos(iy+1,ix+1) + [self.zPosX[iy][ix],self.zPosY[iy][ix]] - if tr == 2: - return self.getCornerPos(iy+1,ix+1) + self.getCornerPos(iy+1,ix) + [self.zPosX[iy][ix],self.zPosY[iy][ix]] - if tr == 3: - return self.getCornerPos(iy+1,ix) + self.getCornerPos(iy,ix) + [self.zPosX[iy][ix],self.zPosY[iy][ix]] - - def getCornerPos(self,iy,ix): - return [self.cPosX[iy][ix],self.cPosY[iy][ix]] - - def getXEdgePos(self,iy,ix): - p1 = self.getCornerPos(iy,ix) - p2 = self.getCornerPos(iy,ix+1) - return [p1[0],p1[1],p2[0],p2[1]] - - def getYEdgePos(self,iy,ix): - p1 = self.getCornerPos(iy,ix) - p2 = self.getCornerPos(iy+1,ix) - return [p1[0],p1[1],p2[0],p2[1]] - - def getEEdgePos(self,iy,ix): - p1 = self.getCornerPos(iy,ix) - return [p1[0],p1[1],self.zPosX[iy][ix],self.zPosY[iy][ix]] - - def getFEdgePos(self,iy,ix): - p1 = self.getCornerPos(iy,ix+1) - return [p1[0],p1[1],self.zPosX[iy][ix],self.zPosY[iy][ix]] - - def getGEdgePos(self,iy,ix): - p1 = self.getCornerPos(iy+1,ix) - return [p1[0],p1[1],self.zPosX[iy][ix],self.zPosY[iy][ix]] - - def getHEdgePos(self,iy,ix): - p1 = self.getCornerPos(iy+1,ix+1) - return [p1[0],p1[1],self.zPosX[iy][ix],self.zPosY[iy][ix]] - diff --git a/slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.cpp b/slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.cpp deleted file mode 100644 index 1cdd3c718..000000000 --- a/slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.cpp +++ /dev/null @@ -1,134 +0,0 @@ -#include "interpolation_EtaVEL.h" -#include "TH2F.h" -#include "TCanvas.h" -#include "TROOT.h" -//#include "EtaVEL.h" -#include "EtaVEL.cpp" -/* -Zum erstellen der correction map ist createGainAndEtaFile(...) in EVELAlg.C der entry point. -Zum erstellen des HR images ist createImage(...) der entry point. -*/ -interpolation_EtaVEL::interpolation_EtaVEL(int nx, int ny, int ns, double etamin, double etamax, int p) : slsInterpolation(nx, ny, ns), newEta(NULL), heta(NULL), plot(p) { - newEta = new EtaVEL(nSubPixels,etamin,etamax,nPixelsX, nPixelsY); - heta= new TH2F("heta","heta",50*nSubPixels, etamin,etamax,50*nSubPixels, etamin,etamax); - heta->SetStats(kFALSE); -} - -interpolation_EtaVEL::~interpolation_EtaVEL() { - delete newEta; - delete heta; -} - - -void interpolation_EtaVEL::prepareInterpolation(int &ok, int maxit) { - int nit=0; - while ((newEta->converged != 1) && nit++Modified(); - gPad->Update(); - } - if (newEta->converged==1) ok=1; else ok=0; -} - -int interpolation_EtaVEL::addToFlatField(Double_t *cluster, Double_t &etax, Double_t &etay) { - Double_t sum, totquad, sDum[2][2]; - int corner =calcEta(cluster, etax, etay, sum, totquad, sDum); - //check if it's OK...should redo it every time? - //or should we fill a finer histogram and afterwards re-fill the newEta? - addToFlatField(etax, etay); - return corner; -} - -int interpolation_EtaVEL::addToFlatField(Double_t etax, Double_t etay) { - // newEta->fill(etaX,etaY); - heta->Fill(etax,etay); - return 0; -} - -void interpolation_EtaVEL::iterate() { - cout << " -------------- newEta refilled"<< endl; - for (int ibx=0; ibxGetNbinsX(); ibx++) { - for (int iby=0; ibyGetNbinsY(); iby++) { - newEta->fill(heta->GetXaxis()->GetBinCenter(ibx+1),heta->GetYaxis()->GetBinCenter(iby+1),heta->GetBinContent(ibx+1,iby+1)); - } - } - newEta->updatePixelPos(); - cout << " -------------- pixelPosition updated"<< endl; -} - -void interpolation_EtaVEL::DrawH() { - heta->Draw("col"); - (newEta->plotPixelBorder())->Draw(); -} - - -void interpolation_EtaVEL::getInterpolatedPosition(Int_t x, Int_t y, Double_t *cluster, Double_t &int_x, Double_t &int_y) { - - Double_t etax, etay, sum, totquad, sDum[2][2]; - - int corner =calcEta(cluster, etax, etay, sum, totquad, sDum); - - int bin = newEta->findBin(etax,etay); - if (bin<=0) { - int_x=-1; - int_y=-1; - return; - } - double subX = ((double)(newEta->getXBin(bin))+.5)/((double)newEta->getNPixels()); - double subY = ((double)(newEta->getYBin(bin))+.5)/((double)newEta->getNPixels()); - - double dX, dY; - switch (corner) { - case TOP_LEFT: - dX=-1.; - dY=+1.; - break; - case TOP_RIGHT: - dX=+1.; - dY=+1.; - break; - case BOTTOM_LEFT: - dX=-1.; - dY=-1.; - break; - case BOTTOM_RIGHT: - dX=+1.; - dY=-1.; - break; - default: - dX=0; - dY=0; - } - - int_x=((double)x)+ subX+0.5*dX; - int_y=((double)y)+ subY+0.5*dY; - - // cout << corner << " " << subX<< " " << subY << " " << dX << " " << dY << " " << int_x << " " << int_y << endl; - -}; - - -// void interpolation_EtaVEL::Streamer(TBuffer &b){newEta->Streamer(b);}; -void interpolation_EtaVEL::getInterpolatedBin(Double_t *cluster, Int_t &int_x, Int_t &int_y) { - - Double_t etax, etay, sum, totquad, sDum[2][2]; - - int corner =calcEta(cluster, etax, etay, sum, totquad, sDum); - - int bin = newEta->findBin(etax,etay); - if (bin<0) { - int_x=-1; - int_y=-1; - return; - } - int_x=newEta->getXBin(bin); - int_y=newEta->getYBin(bin); - - - -}; - diff --git a/slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.h b/slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.h deleted file mode 100644 index 8fbacf96d..000000000 --- a/slsDetectorCalibration/interpolations/etaVEL/etaVELInterpolation.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef INTERPOLATION_ETAVEL_H -#define INTERPOLATION_ETAVEL_H - -#include -#include "EtaVEL.h" -//#include "TH2F.h" -//#include "EtaVEL.cpp" -//class EtaVEL; - -class etaVELInterpolation: public etaInterpolationBase { - - public: - interpolation_EtaVEL(int nx=40, int ny=160, int ns=25, double etamin=-0.02, double etamax=1.02, int p=0); - ~interpolation_EtaVEL(); - - - //create eta distribution, eta rebinnining etc. - //returns flat field image - void prepareInterpolation(int &ok){prepareInterpolation(ok,10000);}; - void prepareInterpolation(int &ok, int maxit); - - //create interpolated image - //returns interpolated image - - //return position inside the pixel for the given photon - void getInterpolatedPosition(Int_t x, Int_t y, Double_t *data, Double_t &int_x, Double_t &int_y); - void getInterpolatedBin(Double_t *cluster, Int_t &int_x, Int_t &int_y); - - - - int addToFlatField(Double_t *cluster, Double_t &etax, Double_t &etay); - int addToFlatField(Double_t etax, Double_t etay); - int setPlot(int p=-1) {if (p>=0) plot=p; return plot;}; - // int WriteH(){newEta->Write("newEta"); heta->Write("heta");}; - EtaVEL *setEta(EtaVEL *ev){if (ev) {delete newEta; newEta=ev;} return newEta;}; - - - - // TH2F *setEta(TH2F *ev){if (ev) {delete heta; heta=ev;} return heta;}; - void iterate(); - // void DrawH(); - double getChiSq(){return newEta->getChiSq();}; - - - - protected: - EtaVEL *newEta; - // TH2F *heta; - int plot; - - // ClassDefNV(interpolation_EtaVEL,1); - // #pragma link C++ class interpolation_EtaVEL-; -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/linearInterpolation.h b/slsDetectorCalibration/interpolations/linearInterpolation.h deleted file mode 100644 index 605de4c93..000000000 --- a/slsDetectorCalibration/interpolations/linearInterpolation.h +++ /dev/null @@ -1,234 +0,0 @@ -#ifndef LINEAR_INTERPOLATION_H -#define LINEAR_INTERPOLATION_H - -//#include -//#include -//#include - -#include "slsInterpolation.h" - -class linearInterpolation : public slsInterpolation{ - - public: - linearInterpolation(int nx=400, int ny=400, int ns=25) : slsInterpolation(nx,ny,ns) {}; - linearInterpolation(linearInterpolation *orig) : slsInterpolation(orig) {}; - - virtual void prepareInterpolation(int &ok){ok=1;}; - - virtual linearInterpolation* Clone() { - - return new linearInterpolation(this); - - }; - - - ////////////////////////////////////////////////////////////////////////////// - //////////// /*It return position hit for the event in input */ ////////////// - virtual void getInterpolatedPosition(int x, int y, double *data, double &int_x, double &int_y) - { - double sDum[2][2]; - double tot, totquad; - double etax,etay; - - int corner; - corner=calcQuad(data, tot, totquad, sDum); - if (nSubPixels>2) { - calcEta(totquad, sDum, etax, etay); - } - getInterpolatedPosition(x, y, etax,etay, corner, int_x, int_y); - - return; - }; - - virtual void getInterpolatedPosition(int x, int y, int *data, double &int_x, double &int_y) - { - double sDum[2][2]; - double tot, totquad; - double etax,etay; - - int corner; - corner=calcQuad(data, tot, totquad, sDum); - if (nSubPixels>2) - calcEta(totquad, sDum, etax, etay); - getInterpolatedPosition(x,y,etax,etay,corner,int_x,int_y); - - return; - }; - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,double *cl,double &int_x, double &int_y) { - - double eta_x, eta_y; - if (nSubPixels>2) { - double cc[2][2]; - double *cluster[3]; - cluster[0]=cl; - cluster[1]=cl+3; - cluster[2]=cl+6; - int xoff, yoff; - - switch (quad) { - case BOTTOM_LEFT: - xoff=0; - yoff=0; - break; - case BOTTOM_RIGHT: - xoff=1; - yoff=0; - break; - case TOP_LEFT: - xoff=0; - yoff=1; - break; - case TOP_RIGHT: - xoff=1; - yoff=1; - break; - default: - ; - } - cc[0][0]=cluster[yoff][xoff]; - cc[1][0]=cluster[yoff+1][xoff]; - cc[0][1]=cluster[yoff][xoff+1]; - cc[1][1]=cluster[yoff+1][xoff+1]; - calcEta(totquad,cc,eta_x,eta_y); - } - // cout << x << " " << y << " " << eta_x << " " << eta_y << " " << int_x << " " << int_y << endl; - return getInterpolatedPosition(x,y,eta_x, eta_y,quad,int_x,int_y); - - - - - - - - } - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,int *cl,double &int_x, double &int_y) { - - double cc[2][2]; - int *cluster[3]; - int xoff, yoff; - cluster[0]=cl; - cluster[1]=cl+3; - cluster[2]=cl+6; - - switch (quad) { - case BOTTOM_LEFT: - xoff=0; - yoff=0; - break; - case BOTTOM_RIGHT: - xoff=1; - yoff=0; - break; - case TOP_LEFT: - xoff=0; - yoff=1; - break; - case TOP_RIGHT: - xoff=1; - yoff=1; - break; - default: - ; - } - double etax, etay; - if (nSubPixels>2) { - cc[0][0]=cluster[yoff][xoff]; - cc[1][0]=cluster[yoff+1][xoff]; - cc[0][1]=cluster[yoff][xoff+1]; - cc[1][1]=cluster[yoff+1][xoff+1]; - calcEta(totquad,cc,etax,etay); - } - // cout << x << " " << y << " " << etax << " " << etay << " " << int_x << " " << int_y << endl; - return getInterpolatedPosition(x,y,etax, etay,quad,int_x,int_y); - - } - - - - virtual void getInterpolatedPosition(int x, int y, double etax, double etay, int corner, double &int_x, double &int_y) - { - - double xpos_eta,ypos_eta; - double dX,dY; - switch (corner) - { - case TOP_LEFT: - dX=-1.; - dY=0; - break; - case TOP_RIGHT: - dX=0; - dY=0; - break; - case BOTTOM_LEFT: - dX=-1.; - dY=-1.; - break; - case BOTTOM_RIGHT: - dX=0; - dY=-1.; - break; - default: - cout << "bad quadrant" << endl; - dX=0.; - dY=0.; - } - - - if (nSubPixels>2) { - xpos_eta=(etax)+dX; - ypos_eta=(etay)+dY; - } else { - xpos_eta=0.5*dX+0.25; - ypos_eta=0.5*dY+0.25; - } - int_x=((double)x) + xpos_eta; - int_y=((double)y) + ypos_eta; - // cout <<"**"<< x << " " << y << " " << xpos_eta << " " << ypos_eta << " " << corner << endl; - return; - }; - - - - - - - - //////////////////////////////////////////////////////////////////////////////////////////////////////// - virtual void getPositionETA3(int x, int y, double *data, double &int_x, double &int_y) - { - double sDum[2][2]; - double tot, totquad; - double eta3x,eta3y; - - calcQuad(data, tot, totquad, sDum); - calcEta3(data,eta3x, eta3y,tot); - - double xpos_eta,ypos_eta; - - xpos_eta=eta3x; - ypos_eta=eta3y; - - int_x=((double)x) + xpos_eta; - int_y=((double)y) + ypos_eta; - - return; - }; - //////////////////////////////////////////////////////////////////////////////////////////////////////// - - virtual int addToFlatField(double *cluster, double &etax, double &etay){}; - virtual int addToFlatField(int *cluster, double &etax, double &etay){}; - virtual int addToFlatField(double etax, double etay){}; - virtual int addToFlatField(double totquad,int quad,double *cl,double &etax, double &etay) {}; - virtual int addToFlatField(double totquad,int quad,int *cl,double &etax, double &etay) {}; - - protected: - ; - - -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/noInterpolation.h b/slsDetectorCalibration/interpolations/noInterpolation.h deleted file mode 100644 index 6c199399f..000000000 --- a/slsDetectorCalibration/interpolations/noInterpolation.h +++ /dev/null @@ -1,104 +0,0 @@ -#ifndef NO_INTERPOLATION_H -#define NO_INTERPOLATION_H - -/* #ifdef MYROOT1 */ -/* #include */ -/* #include */ -/* #include */ -/* #include */ -/* #include */ -/* #endif */ - -#include -#include "slsInterpolation.h" - - - -class noInterpolation : public slsInterpolation{ - public: - noInterpolation(int nx=400, int ny=400, int ns=25) : slsInterpolation(nx,ny,ns) {};// {eventGenerator=new TRandom();}; - noInterpolation(noInterpolation *orig) : slsInterpolation(orig){}; - virtual void prepareInterpolation(int &ok){ok=1;}; - - ////////////////////////////////////////////////////////////////////////////// - //////////// /*It return position hit for the event in input */ ////////////// - - virtual noInterpolation* Clone() { - - return new noInterpolation(this); - - }; - - - virtual void getInterpolatedPosition(int x, int y, double *data, double &int_x, double &int_y) - { - //Random coordinate in the Pixel reference - int_x = x + ((double)rand())/((double)RAND_MAX) -0.5;//eventGenerator->Uniform(-0.5,0.5); - int_y = y + ((double)rand())/((double)RAND_MAX) -0.5;//eventGenerator->Uniform(-0.5,0.5); - - return ; - }; - - virtual void getInterpolatedPosition(int x, int y, int *data, double &int_x, double &int_y) - { - return getInterpolatedPosition(x, y, (double*)NULL, int_x, int_y); - } - - - virtual void getInterpolatedPosition(int x, int y, double etax, double etay, int corner, double &int_x, double &int_y) - { - getInterpolatedPosition(x, y, (double*)NULL, int_x, int_y); - }; - - - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,double *cl,double &etax, double &etay){ - getInterpolatedPosition(x, y, (double*)NULL, etax, etay); - }; - - - virtual void getInterpolatedPosition(int x, int y, double totquad,int quad,int *cl,double &etax, double &etay){ - getInterpolatedPosition(x, y, (double*)NULL, etax, etay); - }; - - - - ////////////////////////////////////////////////////////////////////////////////////// - virtual void getPositionETA3(int x, int y, double *data, double &int_x, double &int_y) - { - //Random coordinate in the Pixel reference - int_x = x + ((double)rand())/((double)RAND_MAX) -0.5;//eventGenerator->Uniform(-0.5,0.5); - int_y = y + ((double)rand())/((double)RAND_MAX) -0.5;//eventGenerator->Uniform(-0.5,0.5); - - return ; - }; - - virtual void getPositionETA3(int x, int y, int *data, double &int_x, double &int_y) - { - return getPositionETA3(x, y, (double*)NULL, int_x, int_y); - }; - - - - ////////////////////////////////////////////////////////////////////////////////////// - virtual int addToFlatField(double *cluster, double &etax, double &etay){return 0;}; - - virtual int addToFlatField(int *cluster, double &etax, double &etay){return 0;}; - - virtual int addToFlatField(double etax, double etay){return 0;}; - - virtual int addToFlatField(double totquad,int quad,double *cl,double &etax, double &etay){return 0;}; - - - virtual int addToFlatField(double totquad,int quad,int *cl,double &etax, double &etay){return 0;}; - - - protected: - ; - // TRandom *eventGenerator; - // ClassDefNV(slsInterpolation,1); - // #pragma link C++ class slsInterpolation-; -}; - -#endif diff --git a/slsDetectorCalibration/interpolations/slsInterpolation.h b/slsDetectorCalibration/interpolations/slsInterpolation.h deleted file mode 100644 index 8059ddcc9..000000000 --- a/slsDetectorCalibration/interpolations/slsInterpolation.h +++ /dev/null @@ -1,534 +0,0 @@ -#ifndef SLS_INTERPOLATION_H -#define SLS_INTERPOLATION_H - -#ifdef MYROOT1 -#include -#include -#include -#endif - -#include -#ifndef MY_TIFF_IO_H -#include "tiffIO.h" -#endif - -#ifndef DEF_QUAD -#define DEF_QUAD - enum quadrant { - TOP_LEFT=0, - TOP_RIGHT=1, - BOTTOM_LEFT=2, - BOTTOM_RIGHT=3, - UNDEFINED_QUADRANT=-1 - }; -#endif -#include - -#include -#include -using namespace std; - -//#ifdef MYROOT1 -//: public TObject -//#endif -class slsInterpolation -{ - - public: - slsInterpolation(int nx=400, int ny=400, int ns=25) :nPixelsX(nx), nPixelsY(ny), nSubPixels(ns), id(0) { - -#ifdef MYROOT1 -hint=new TH2F("hint","hint",ns*nx, 0, nx, ns*ny, 0, ny); -#endif - -#ifndef MYROOT1 - hint=new int[ns*nx*ns*ny]; -#endif - -}; - - slsInterpolation(slsInterpolation *orig){ - nPixelsX=orig->nPixelsX; - nPixelsY=orig->nPixelsY; - nSubPixels=orig->nSubPixels; -#ifdef MYROOT1 - hint=(TH2F*)(orig->hint)->Clone("hint"); -#endif - -#ifndef MYROOT1 - hint=new int[nSubPixels*nPixelsX*nSubPixels*nPixelsY]; - memcpy(hint, orig->hint,nSubPixels*nPixelsX*nSubPixels*nPixelsY*sizeof(int)); -#endif - - }; - - virtual int setId(int i) {id=i; return id;}; - - virtual slsInterpolation* Clone() = 0; - - int getNSubPixels() {return nSubPixels;}; - - int getImageSize(int &nnx, int &nny, int &ns) { - nnx=nSubPixels*nPixelsX; - nny=nSubPixels*nPixelsY; - ns=nSubPixels; - return nSubPixels*nSubPixels*nPixelsX*nPixelsY; - }; - - - //create eta distribution, eta rebinnining etc. - //returns flat field image - virtual void prepareInterpolation(int &ok)=0; - - //create interpolated image - //returns interpolated image -#ifdef MYROOT1 - virtual TH2F *getInterpolatedImage(){return hint;}; -#endif - -#ifndef MYROOT1 - virtual int *getInterpolatedImage(){ - // cout << "return interpolated image " << endl; - /* for (int i=0; iReset(); -#endif -#ifndef MYROOT1 - for (int ix=0; ixFill(int_x, int_y); return hint;}; -#endif - -#ifndef MYROOT1 - virtual int *addToImage(double int_x, double int_y){ - int iy=((double)nSubPixels)*int_y; - int ix=((double)nSubPixels)*int_x; - if (ix>=0 && ix<(nPixelsX*nSubPixels) && iy<(nSubPixels*nPixelsY) && iy>=0 ){ - // cout << int_x << " " << int_y << " " << " " << ix << " " << iy << " " << ix+iy*nPixelsX*nSubPixels << " " << hint[ix+iy*nPixelsX*nSubPixels]; - (*(hint+ix+iy*nPixelsX*nSubPixels))+=1; - // cout << " " << hint[ix+iy*nPixelsX*nSubPixels] << endl; - }// else - // cout << "bad! "<< int_x << " " << int_y << " " << " " << ix << " " << iy << " " << ix+iy*nPixelsX*nSubPixels << endl; - - return hint; - }; -#endif - - - virtual int addToFlatField(double *cluster, double &etax, double &etay)=0; - virtual int addToFlatField(int *cluster, double &etax, double &etay)=0; - virtual int addToFlatField(double totquad,int quad,int *cl,double &etax, double &etay)=0; - virtual int addToFlatField(double totquad,int quad,double *cluster,double &etax, double &etay)=0; - virtual int addToFlatField(double etax, double etay)=0; - -#ifdef MYROOT1 - virtual TH2D *getFlatField(){return NULL;}; - virtual TH2D *setFlatField(TH2D *h, int nb=-1, double emin=-1, double emax=-1){return NULL;}; - virtual TH2D *getFlatField(int &nb, double &emin, double &emax){nb=0; emin=0; emax=0; return getFlatField();}; -#endif - -#ifndef MYROOT1 - virtual int *getFlatField(){return NULL;}; - virtual int *setFlatField(int *h, int nb=-1, double emin=-1, double emax=-1){return NULL;}; - void *writeFlatField(const char * imgname){return NULL;}; - void *readFlatField(const char * imgname, int nb=-1, double emin=1, double emax=0){return NULL;}; - virtual int *getFlatField(int &nb, double &emin, double &emax){nb=0; emin=0; emax=0; return getFlatField();}; -#endif - - //virtual void Streamer(TBuffer &b); - - static int calcQuad(int *cl, double &sum, double &totquad, double sDum[2][2]){ - double cli[3*3];//=new int[3*3]; - for (int i=0; i<9; i++) - cli[i]=cl[i]; - return calcQuad(cli, sum, totquad, sDum); - - } - - - static int calcQuad(double *cl, double &sum, double &totquad, double sDum[2][2]){ - - int corner = UNDEFINED_QUADRANT; - double *cluster[3]; - cluster[0]=cl; - cluster[1]=cl+3; - cluster[2]=cl+6; - - sum=0; - double sumBL=0; - double sumTL=0; - double sumBR=0; - double sumTR=0; - int xoff=0, yoff=0; - for (int ix=0; ix<3; ix++) { - for (int iy=0; iy<3; iy++) { - sum+=cluster[iy][ix]; - if (ix<=1 && iy<=1) sumBL+=cluster[iy][ix]; - if (ix<=1 && iy>=1) sumTL+=cluster[iy][ix]; - if (ix>=1 && iy<=1) sumBR+=cluster[iy][ix]; - if (ix>=1 && iy>=1) sumTR+=cluster[iy][ix]; - } - } - - /* sDum[0][0] = cluster[0][0]; sDum[1][0] = cluster[1][0]; */ - /* sDum[0][1] = cluster[0][1]; sDum[1][1] = cluster[1][1]; */ - corner = BOTTOM_LEFT; - totquad=sumBL; - - - if(sumTL >= totquad){ - /* sDum[0][0] = cluster[1][0]; sDum[1][0] = cluster[2][0]; */ - /* sDum[0][1] = cluster[1][1]; sDum[1][1] = cluster[2][1]; */ - - corner = TOP_LEFT; - totquad=sumTL; - xoff=0; - yoff=1; - } - - if(sumBR >= totquad){ - /* sDum[0][0] = cluster[0][1]; sDum[1][0] = cluster[1][1]; */ - /* sDum[0][1] = cluster[0][2]; sDum[1][1] = cluster[1][2]; */ - - xoff=1; - yoff=0; - corner = BOTTOM_RIGHT; - totquad=sumBR; - } - - if(sumTR >= totquad){ - xoff=1; - yoff=1; - /* sDum[0][0] = cluster[1][1]; sDum[1][0] = cluster[2][1]; */ - /* sDum[0][1] = cluster[1][2]; sDum[1][1] = cluster[2][2]; */ - corner = TOP_RIGHT; - totquad=sumTR; - } - - - for (int ix=0; ix<2; ix++) { - for (int iy=0; iy<2; iy++) { - sDum[iy][ix] = cluster[iy+yoff][ix+xoff]; - } - } - - return corner; - - } - - static int calcEta(double totquad, double sDum[2][2], double &etax, double &etay){ - double t,r; - - if (totquad>0) { - t = sDum[1][0] + sDum[1][1]; - r = sDum[0][1] + sDum[1][1]; - etax=r/totquad; - etay=t/totquad; - } - return 0; - - } - - static int calcEta(double *cl, double &etax, double &etay, double &sum, double &totquad, double sDum[2][2]) { - int corner = calcQuad(cl,sum,totquad,sDum); - calcEta(totquad, sDum, etax, etay); - - return corner; - } - - - static int calcEta(int *cl, double &etax, double &etay, double &sum, double &totquad, double sDum[2][2]) { - int corner = calcQuad(cl,sum,totquad,sDum); - calcEta(totquad, sDum, etax, etay); - - return corner; - } - - - static int calcEtaL(double totquad, int corner, double sDum[2][2], double &etax, double &etay){ - double t,r, toth, totv; - if (totquad>0) { - switch(corner) { - case TOP_LEFT: - t = sDum[1][1]; - r = sDum[0][1] ; - toth=sDum[0][1]+sDum[0][0]; - totv=sDum[0][1]+sDum[1][1]; - break; - case TOP_RIGHT: - t = sDum[1][0] ; - r = sDum[0][1] ; - toth=sDum[0][1]+sDum[0][0]; - totv=sDum[1][0]+sDum[0][0]; - break; - case BOTTOM_LEFT: - r = sDum[1][1] ; - t = sDum[1][1] ; - toth=sDum[1][0]+sDum[1][1]; - totv=sDum[0][1]+sDum[1][1]; - break; - case BOTTOM_RIGHT: - t = sDum[1][0] ; - r = sDum[1][1] ; - toth=sDum[1][0]+sDum[1][1]; - totv=sDum[1][0]+sDum[0][0]; - break; - default: - etax=-1000; - etay=-1000; - return 0; - } - //etax=r/totquad; - //etay=t/totquad; - etax=r/toth; - etay=t/totv; - } - return 0; - } - - - - static int calcEtaL(double *cl, double &etax, double &etay, double &sum, double &totquad, double sDum[2][2]) { - int corner = calcQuad(cl,sum,totquad,sDum); - calcEtaL(totquad, corner, sDum, etax, etay); - - return corner; - } - - static int calcEtaL(int *cl, double &etax, double &etay, double &sum, double &totquad, double sDum[2][2]) { - int corner = calcQuad(cl,sum,totquad,sDum); - calcEtaL(totquad, corner, sDum, etax, etay); - - return corner; - } - - - - static int calcEtaC3(double *cl, double &etax, double &etay, double &sum, double &totquad, double sDum[2][2]){ - - int corner = calcQuad(cl,sum,totquad,sDum); - calcEta(sum, sDum, etax, etay); - return corner; - - } - - - - static int calcEtaC3(int *cl, double &etax, double &etay, double &sum, double &totquad, double sDum[2][2]){ - - int corner = calcQuad(cl,sum,totquad,sDum); - calcEta(sum, sDum, etax, etay); - return corner; - - } - - - - static int calcEta3(double *cl, double &etax, double &etay, double &sum) { - double l=0,r=0,t=0,b=0, val; - sum=0; - // int quad; - for (int ix=0; ix<3; ix++) { - for (int iy=0; iy<3; iy++) { - val=cl[iy+3*ix]; - sum+=val; - if (iy==0) l+=val; - if (iy==2) r+=val; - if (ix==0) b+=val; - if (ix==2) t+=val; - } - } - if (sum>0) { - etax=(-l+r)/sum; - etay=(-b+t)/sum; - } - /* if (etax<-1 || etax>1 || etay<-1 || etay>1) { */ - /* cout << "**********" << etax << " " << etay << endl; */ - /* for (int ix=0; ix<3; ix++) { */ - /* for (int iy=0; iy<3; iy++) { */ - /* cout << cl[iy+3*ix] << "\t" ; */ - - /* } */ - /* cout << endl; */ - /* } */ - /* cout << sum << " " << l << " " << r << " " << t << " " << b << endl; */ - - /* } */ - - - if (etax>=0 && etay>=0) - return TOP_RIGHT; - if (etax<0 && etay>=0) - return TOP_LEFT; - if (etax<0 && etay<0) - return BOTTOM_LEFT; - return BOTTOM_RIGHT; - } - - - static int calcEta3(int *cl, double &etax, double &etay, double &sum) { - double cli[9]; - for (int ix=0; ix<9; ix++) cli[ix]=cl[ix]; - - return calcEta3(cli, etax, etay, sum); - } - - - static int calcMyEta(double totquad, int quad, double *cl, double &etax, double &etay) { - double l,r,t,b, sum; - int yoff; - switch (quad) { - case BOTTOM_LEFT: - case BOTTOM_RIGHT: - yoff=0; - break; - case TOP_LEFT: - case TOP_RIGHT: - yoff=1; - break; - default: - ; - } - l=cl[0+yoff*3]+cl[0+yoff*3+3]; - r=cl[2+yoff*3]+cl[2+yoff*3+3]; - b=cl[0+yoff*3]+cl[1+yoff*3]*cl[2+yoff*3]; - t=cl[0+yoff*3+3]+cl[1+yoff*3+3]*cl[0+yoff*3+3]; - sum=t+b; - if (sum>0) { - etax=(-l+r)/sum; - etay=(+t)/sum; - } - - return -1; - } - - static int calcMyEta(double totquad, int quad, int *cl, double &etax, double &etay) { - double l,r,t,b, sum; - int yoff; - switch (quad) { - case BOTTOM_LEFT: - case BOTTOM_RIGHT: - yoff=0; - break; - case TOP_LEFT: - case TOP_RIGHT: - yoff=1; - break; - default: - ; - } - l=cl[0+yoff*3]+cl[0+yoff*3+3]; - r=cl[2+yoff*3]+cl[2+yoff*3+3]; - b=cl[0+yoff*3]+cl[1+yoff*3]*cl[2+yoff*3]; - t=cl[0+yoff*3+3]+cl[1+yoff*3+3]*cl[0+yoff*3+3]; - sum=t+b; - if (sum>0) { - etax=(-l+r)/sum; - etay=(+t)/sum; - } - - return -1; - } - - - - static int calcEta3X(double *cl, double &etax, double &etay, double &sum) { - double l,r,t,b; - sum=cl[0]+cl[1]+cl[2]+cl[3]+cl[4]+cl[5]+cl[6]+cl[7]+cl[8]; - if (sum>0) { - l=cl[3]; - r=cl[5]; - b=cl[1]; - t=cl[7]; - etax=(-l+r)/sum; - etay=(-b+t)/sum; - } - return -1; - } - - - static int calcEta3X(int *cl, double &etax, double &etay, double &sum) { - double l,r,t,b; - sum=cl[0]+cl[1]+cl[2]+cl[3]+cl[4]+cl[5]+cl[6]+cl[7]+cl[8]; - if (sum>0) { - l=cl[3]; - r=cl[5]; - b=cl[1]; - t=cl[7]; - etax=(-l+r)/sum; - etay=(-b+t)/sum; - } - return -1; - } - - - - - - - protected: - int nPixelsX, nPixelsY; - int nSubPixels; -#ifdef MYROOT1 - TH2F *hint; -#endif -#ifndef MYROOT1 - int *hint; -#endif - int id; - -}; - -#endif diff --git a/slsDetectorCalibration/moench03CommonMode.h b/slsDetectorCalibration/moench03CommonMode.h deleted file mode 100644 index 7c950a9e4..000000000 --- a/slsDetectorCalibration/moench03CommonMode.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef MOENCH03COMMONMODE_H -#define MOENCH03COMMONMODE_H - -#include "commonModeSubtraction.h" - -class moench03CommonMode : public commonModeSubtraction { - /** @short class to calculate the common mode noise for moench02 i.e. on 4 supercolumns separately */ - public: - /** constructor - initalizes a commonModeSubtraction with 4 different regions of interest - \param nn number of samples for the moving average - */ - moench03CommonMode(int nn=1000) : commonModeSubtraction(nn,32){} ; - - - /** add value to common mode as a function of the pixel value, subdividing the region of interest in the 4 supercolumns of 40 columns each; - \param val value to add to the common mode - \param ix pixel coordinate in the x direction - \param iy pixel coordinate in the y direction - */ - virtual void addToCommonMode(double val, int ix=0, int iy=0) { - // (void) iy; - int isc=ix/25+(iy/200)*16; - if (isc>=0 && isc=0 && isc0) return cmPed[isc]/nCm[isc]-cmStat[isc].Mean(); - } - return 0; - }; - -}; - - -#endif diff --git a/slsDetectorCalibration/moenchCommonMode.h b/slsDetectorCalibration/moenchCommonMode.h deleted file mode 100644 index dba0df2b7..000000000 --- a/slsDetectorCalibration/moenchCommonMode.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef MOENCHCOMMONMODE_H -#define MOENCHCOMMONMODE_H - -#include "commonModeSubtraction.h" - -class moenchCommonMode : public commonModeSubtraction { - /** @short class to calculate the common mode noise for moench02 i.e. on 4 supercolumns separately */ - public: - /** constructor - initalizes a commonModeSubtraction with 4 different regions of interest - \param nn number of samples for the moving average - */ - moenchCommonMode(int nn=1000) : commonModeSubtraction(nn,4){} ; - - - /** add value to common mode as a function of the pixel value, subdividing the region of interest in the 4 supercolumns of 40 columns each; - \param val value to add to the common mode - \param ix pixel coordinate in the x direction - \param iy pixel coordinate in the y direction - */ - virtual void addToCommonMode(double val, int ix=0, int iy=0) { - (void) iy; - int isc=ix/40; - if (isc>=0 && isc=0 && isc0) return cmPed[isc]/nCm[isc]-cmStat[isc].Mean(); - } - return 0; - }; - -}; - - -#endif diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.cluster_finder b/slsDetectorCalibration/moenchExecutables/Makefile.cluster_finder deleted file mode 100644 index b8414b77f..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.cluster_finder +++ /dev/null @@ -1,39 +0,0 @@ - -CBFLIBDIR= /afs/psi.ch/project/sls_det_software/CBFlib-0.9.5/ -#ZMQLIB=../slsReceiverSoftware/include -#LIBRARYCBF=$(CBFLIBDIR)/lib/*.o -INCDIR=-I. -I../ -I../interpolations -I../interpolations/etaVEL -I../dataStructures -I../../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ -#LIBHDF5= -LDFLAG= ../tiffIO.cpp -L/usr/lib64/ -lpthread -lm -lstdc++ -L. -pthread -lrt -L$(CBFLIBDIR)/lib/ -ltiff -#-L$(ZMQLIB) -lzmq -#-L../../bin -MAIN=moench03ClusterFinder.cpp -#-lhdf5 -#DESTDIR?=../bin - -all: moenchClusterFinder moenchMakeEta moenchInterpolation moenchNoInterpolation moenchPhotonCounter moenchAnalog - - - -moenchClusterFinder: $(MAIN) $(INCS) clean - g++ -o moenchClusterFinder $(MAIN) $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DOLDDATA #-DNEWRECEIVER - -moenchMakeEta: moench03MakeEta.cpp $(INCS) clean - g++ -o moenchMakeEta moench03MakeEta.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -moenchInterpolation: moench03Interpolation.cpp $(INCS) clean - g++ -o moenchInterpolation moench03Interpolation.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -moenchNoInterpolation: moench03NoInterpolation.cpp $(INCS) clean - g++ -o moenchNoInterpolation moench03NoInterpolation.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -moenchPhotonCounter: moenchPhotonCounter.cpp $(INCS) clean - g++ -o moenchPhotonCounter moenchPhotonCounter.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DNEWRECEIVER - -moenchAnalog: moenchPhotonCounter.cpp $(INCS) clean - g++ -o moenchAnalog moenchPhotonCounter.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DNEWRECEIVER -DANALOG - -clean: - rm -f moenchClusterFinder moenchMakeEta moenchInterpolation moenchNoInterpolation moenchPhotonCounter - - diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.moench b/slsDetectorCalibration/moenchExecutables/Makefile.moench deleted file mode 100644 index b49a76212..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.moench +++ /dev/null @@ -1,20 +0,0 @@ - -CBFLIBDIR=/afs/psi.ch/project/sls_det_software/CBFlib-0.9.5 -LIBRARYCBF=$(CBFLIBDIR)/lib/*.o -INCDIR=-IslsDetectorCalibration -I../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ -I. -IetaVEL -LIBHDF5=-L$(CBFLIBDIR)/lib/ -lhdf5 -LDFLAG= -L/usr/lib64/ -lpthread -#-L../../bin -MAIN=moench03OnTheFlyAnalysis.C - -#DESTDIR?=../bin - -all: moench03OnTheFlyAnalysis - - - -moench03OnTheFlyAnalysis: $(MAIN) $(INCS) clean - g++ -o moench03OnTheFlyAnalysis $(MAIN) -lm -ltiff -lstdc++ $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -clean: - rm -f moench03OnTheFlyAnalysis diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.moench_eta b/slsDetectorCalibration/moenchExecutables/Makefile.moench_eta deleted file mode 100644 index 7f575d6cb..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.moench_eta +++ /dev/null @@ -1,23 +0,0 @@ - -CBFLIBDIR= /home/l_msdetect/CBFlib-0.9.5 -ZMQLIB=../slsReceiverSoftware/include -LIBRARYCBF=$(CBFLIBDIR)/lib/*.o -INCDIR=-IslsDetectorCalibration -I../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ -I. -#-IetaVEL -LIBHDF5= -LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -L. -lzmq -pthread -lrt -L$(CBFLIBDIR)/lib/ -lhdf5 -ltiff -L$(ZMQLIB) -#-L../../bin -MAIN=moench03ClusterFinder.cpp - -#DESTDIR?=../bin - -all: moench03ClusterFinder - - - -moench03ClusterFinder: $(MAIN) $(INCS) clean - g++ -o moenchClusterFinder $(MAIN) $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) tiffIO.cpp -DSAVE_ALL - -clean: - rm -f moench03ClusterFinder - diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.moench_zmq b/slsDetectorCalibration/moenchExecutables/Makefile.moench_zmq deleted file mode 100644 index 1a6732a53..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.moench_zmq +++ /dev/null @@ -1,28 +0,0 @@ - -CBFLIBDIR=/afs/psi.ch/project/sls_det_software/CBFlib-0.9.5 -ZMQLIB=../../slsReceiverSoftware/include -LIBRARYCBF=$(CBFLIBDIR)/lib/*.o -INCDIR=-I../../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ -I. -I../dataStructures ../tiffIO.cpp -I../ -I../interpolations/ -LIBHDF5= -#-I../interpolations/etaVEL -LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -L. -lzmq -pthread -lrt -lhdf5 -ltiff -L$(ZMQLIB) -L$(CBFLIBDIR)/lib/ -#-L../../bin - -#DESTDIR?=../bin - -all: moenchZmqClusterFinder moenchZmqInterpolating moenchZmqAnalog - - -moenchZmqInterpolating: $(MAIN) $(INCS) clean - g++ -o moenchZmqInterpolating moenchZmqInterpolating.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -moenchZmqClusterFinder: $(MAIN) $(INCS) clean - g++ -o moenchZmqClusterFinder moenchZmqClusterFinder.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -moenchZmqAnalog: $(MAIN) $(INCS) clean - g++ -o moenchZmqAnalog moenchZmqAnalog.cpp $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL - -clean: - rm -f moench03ZmqInterpolating moench03ZmqClusterFinder moenchZmqAnalog - - diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.phoenix b/slsDetectorCalibration/moenchExecutables/Makefile.phoenix deleted file mode 100644 index 7379db1a7..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.phoenix +++ /dev/null @@ -1,24 +0,0 @@ - -CBFLIBDIR= /afs/psi.ch/project/sls_det_software/CBFlib-0.9.5/ -#ZMQLIB=../slsReceiverSoftware/include -LIBRARYCBF=$(CBFLIBDIR)/lib/*.o -INCDIR=-I.. -I. -I../interpolations -I../interpolations/etaVEL -I../../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ ../tiffIO.cpp -I../dataStructures -#LIBHDF5= -LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -L. -pthread -lrt -L$(CBFLIBDIR)/lib/ -ltiff -lhdf5 -#-L$(ZMQLIB) -lzmq -#-L../../bin -MAIN=moench03ClusterFinderPhoenix.cpp -# -#DESTDIR?=../bin - -all: moenchClusterFinderPhoenix -#moenchMakeEtaPhoenix moenchInterpolationPhoenix - - - -moenchClusterFinderPhoenix: $(MAIN) $(INCS) clean - g++ -o moenchClusterFinderPhoenix $(MAIN) $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) - -clean: - rm -f moenchClusterFinderPhoenix - diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.reoder_image b/slsDetectorCalibration/moenchExecutables/Makefile.reoder_image deleted file mode 100644 index 2ad256370..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.reoder_image +++ /dev/null @@ -1,22 +0,0 @@ - -CBFLIBDIR= /afs/psi.ch/project/sls_det_software/CBFlib-0.9.5/ -#ZMQLIB=../slsReceiverSoftware/include -INCDIR=-I. -I../ -I../interpolations -I../interpolations/etaVEL -I../dataStructures -I../../slsReceiverSoftware/include -I$(CBFLIBDIR)/include/ -LDFLAG= ../tiffIO.cpp -L/usr/lib64/ -lpthread -lm -lstdc++ -L. -pthread -lrt -L$(CBFLIBDIR)/lib/ -ltiff -MAIN=moench03ReorderImage.cpp - -all: moenchReorderImage moenchClusterFinder - - - -moenchReorderImage: $(MAIN) $(INCS) clean - g++ -o moenchReorderImage $(MAIN) $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DNEWRECEIVER - -moenchClusterFinder: moench03ClusterFinder.cpp - g++ -o moenchClusterFinder $(MAIN) $(LDFLAG) $(INCDIR) $(LIBHDF5) $(LIBRARYCBF) -DSAVE_ALL -DNEWRECEIVER - - -clean: - rm -f moenchReorderImage moenchClusterFinder - - diff --git a/slsDetectorCalibration/moenchExecutables/Makefile.tiff_to_th2f b/slsDetectorCalibration/moenchExecutables/Makefile.tiff_to_th2f deleted file mode 100644 index db51710b7..000000000 --- a/slsDetectorCalibration/moenchExecutables/Makefile.tiff_to_th2f +++ /dev/null @@ -1,27 +0,0 @@ -#INCSROOT= receiverGui.h -#INCS= $(INCSROOT) moench03_receiver.h -#LINKDEF=receiverGuiLinkDef.h - -#CBFLIBDIR= /afs/psi.ch/project/sls_det_software/CBFlib-0.9.5/ -#ZMQLIB=../slsReceiverSoftware/include -#LIBRARYCBF=$(CBFLIBDIR)/lib/*.o -INCDIR=-I. -I../ -I../interpolations -I../interpolations/etaVEL -I../dataStructures -I../../slsReceiverSoftware/include -I$(ROOTSYS)/include -#-I$(CBFLIBDIR)/include/ -#LIBHDF5= -LDFLAG= -L/usr/lib64/ -lpthread -lm -lstdc++ -L. -pthread -lrt -ltiff -#-L$(CBFLIBDIR)/lib/ -lhdf5 - -MAIN=tiff_to_th2f.cpp - - -all: tiff_to_th2f - - - -tiff_to_th2f: $(MAIN) $(INCS) - - g++ -o tiff_to_th2f $(MAIN) `root-config --cflags --glibs` -lMinuit -lm -ltiff -lstdc++ $(LDFLAG) $(INCDIR) ../tiffIO.cpp -#$(LIBRARYCBF) $(LIBHDF5) -clean: - rm -f tiff_to_th2f - diff --git a/slsDetectorCalibration/moenchExecutables/moench03ClusterFinder.cpp b/slsDetectorCalibration/moenchExecutables/moench03ClusterFinder.cpp deleted file mode 100644 index 0246c0c1a..000000000 --- a/slsDetectorCalibration/moenchExecutables/moench03ClusterFinder.cpp +++ /dev/null @@ -1,206 +0,0 @@ -//#include "ansi.h" -#include - - - -//#include "moench03T1ZmqData.h" -#ifdef NEWRECEIVER -#include "moench03T1ReceiverDataNew.h" -#endif -#ifdef CSAXS_FP -#include "moench03T1ReceiverData.h" -#endif -#ifdef OLDDATA -#include "moench03Ctb10GbT1Data.h" -#endif - -// #include "interpolatingDetector.h" -//#include "etaInterpolationPosXY.h" -// #include "linearInterpolation.h" -// #include "noInterpolation.h" -#include "multiThreadedAnalogDetector.h" -#include "singlePhotonDetector.h" -//#include "interpolatingDetector.h" - -#include -#include -#include -#include - -#include -using namespace std; - - -int main(int argc, char *argv[]) { - - - if (argc<6) { - cout << "Usage is " << argv[0] << "indir outdir fname runmin runmax " << endl; - return 1; - } - int p=10000; - int fifosize=1000; - int nthreads=1; - int nsubpix=25; - int etabins=nsubpix*10; - double etamin=-1, etamax=2; - int csize=3; - int nx=400, ny=400; - int save=1; - int nsigma=5; - int nped=1000; - int ndark=100; - int ok; - int iprog=0; - - - - - -#ifdef NEWRECEIVER - moench03T1ReceiverDataNew *decoder=new moench03T1ReceiverDataNew(); - cout << "RECEIVER DATA WITH ONE HEADER!"<readPedestals("/scratch/ped_100.tiff"); - // interp->readFlatField("/scratch/eta_100.tiff",etamin,etamax); - // cout << "filter "<< endl; - - - int size = 327680;////atoi(argv[3]); - - int* image; - //int* image =new int[327680/sizeof(int)]; - filter->newDataSet(); - - - int ff, np; - int dsize=decoder->getDataSize(); - cout << " data size is " << dsize; - - - char data[dsize]; - - ifstream filebin; - char *indir=argv[1]; - char *outdir=argv[2]; - char *fformat=argv[3]; - int runmin=atoi(argv[4]); - int runmax=atoi(argv[5]); - - char fname[10000]; - char outfname[10000]; - char imgfname[10000]; - char pedfname[10000]; - // strcpy(pedfname,argv[6]); - char fn[10000]; - - std::time_t end_time; - - FILE *of=NULL; - cout << "input directory is " << indir << endl; - cout << "output directory is " << outdir << endl; - cout << "fileformat is " << fformat << endl; - - - std::time(&end_time); - cout << std::ctime(&end_time) << endl; - - - - - - - - - char* buff; - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - - - mt->setFrameMode(eFrame); - mt->StartThreads(); - mt->popFree(buff); - - - cout << "mt " << endl; - - int ifr=0; - - - for (int irun=runmin; irunsetFilePointer(of); - // cout << "file pointer set " << endl; - } else { - cout << "Could not open "<< outfname << " for writing " << endl; - mt->setFilePointer(NULL); - return 1; - } - // //while read frame - ff=-1; - while (decoder->readNextFrame(filebin, ff, np,buff)) { - // cout << "*"<pushData(buff); - // // //pop - mt->nextThread(); - // // // cout << " " << (void*)buff; - mt->popFree(buff); - ifr++; - if (ifr%10000==0) cout << ifr << " " << ff << endl; - ff=-1; - } - cout << "--" << endl; - filebin.close(); - // //close file - // //join threads - while (mt->isBusy()) {;}//wait until all data are processed from the queues - if (of) - fclose(of); - - mt->writeImage(imgfname); - mt->clearImage(); - - std::time(&end_time); - cout << std::ctime(&end_time) << endl; - - } else - cout << "Could not open "<< fname << " for reading " << endl; - - - } - - - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moench03ClusterFinderPhoenix.cpp b/slsDetectorCalibration/moenchExecutables/moench03ClusterFinderPhoenix.cpp deleted file mode 100644 index 7ae1f4559..000000000 --- a/slsDetectorCalibration/moenchExecutables/moench03ClusterFinderPhoenix.cpp +++ /dev/null @@ -1,201 +0,0 @@ -//#include "ansi.h" -#include - -//#include "moench03T1ZmqData.h" -//#include "moench03T1ReceiverData.h" - -#include "moench03Ctb10GbT1Data.h" - -// #include "interpolatingDetector.h" -//#include "etaInterpolationPosXY.h" -// #include "linearInterpolation.h" -// #include "noInterpolation.h" -#include "multiThreadedAnalogDetector.h" -#include "singlePhotonDetector.h" -//#include "interpolatingDetector.h" - -#include -#include -#include -#include - -#include -using namespace std; - - -int main(int argc, char *argv[]) { - - - if (argc<6) { - cout << "Usage is " << argv[0] << "indir outdir fname runmin runmax " << endl; - return 0; - } - int ii=0; - int p=10000; - int fifosize=1000; - int nthreads=5; - int nsubpix=25; - int etabins=nsubpix*10; - double etamin=-1, etamax=2; - int csize=3; - int nx=400, ny=400; - int save=1; - int nsigma=5; - int nped=1000; - int ndark=100; - int ok; - int iprog=0; - moench03Ctb10GbT1Data *decoder=new moench03Ctb10GbT1Data(); - cout << "decoder" << endl; - //moench03T1ReceiverData *decoder=new moench03T1ReceiverData(); - //moench03T1ZmqData *decoder=new moench03T1ZmqData(); - singlePhotonDetector *filter=new singlePhotonDetector(decoder,csize, nsigma, 1, 0, nped, 100); - // char tit[10000]; - cout << "filter" << endl; - - - - - // filter->readPedestals("/scratch/ped_100.tiff"); - // interp->readFlatField("/scratch/eta_100.tiff",etamin,etamax); - // cout << "filter "<< endl; - - - int size = 327680;////atoi(argv[3]); - - int* image; - //int* image =new int[327680/sizeof(int)]; - filter->newDataSet(); - - cout << "dataset" << endl; - - int ff, np; - int dsize=decoder->getDataSize(); - cout << " data size is " << dsize << endl; - - - char data[dsize]; - - ifstream filebin; - char *indir=argv[1]; - cout << "input directory is " << indir << endl; - char *outdir=argv[2]; - cout << "output directory is " << outdir << endl; - char *fformat=argv[3]; - cout << "fileformat is " << fformat << endl; - int runmin=atoi(argv[4]); - cout << "runmin : " << runmin << endl; - int runmax=atoi(argv[5]); - cout << "runmax : " << runmax << endl; - - char fname[10000]; - char outfname[10000]; - char imgfname[10000]; - char pedfname[10000]; - char fn[10000]; - - std::time_t end_time; - - FILE *of=NULL; - - - cout << "time " << endl; - std::time(&end_time); - cout << std::ctime(&end_time) << endl; - filter->setFrameMode(eFrame); - // mt->setFrameMode(ePedestal); - - - // for (int ix=0; ix<400; ix++) - // for (int iy=0; iy<400; iy++) - // cout << ix << " " << iy << " " << filter->getPedestal(ix,iy) << " " << filter->getPedestalRMS(ix,iy) << endl; - - - char* buff; - cout << "aa " << endl; - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - cout << "mt " << endl; - - // mt->setFrameMode(eFrame); //need to find a way to switch between flat and frames! - // mt->prepareInterpolation(ok); - mt->setFrameMode(eFrame); - mt->StartThreads(); - mt->popFree(buff); - - - - int ifr=0; - // //loop on files - // mt->setFrameMode(eFrame); - //mt->setFrameMode(eFlat); - - - - - - for (int irun=runmin; irunsetFilePointer(of); - // cout << "file pointer set " << endl; - } else { - cout << "Could not open "<< outfname << " for writing " << endl; - mt->setFilePointer(NULL); - return 1; - } - // //while read frame - ff=-1; - while (decoder->readNextFrame(filebin, ff, np,buff)) { - //cout << "*"<pushData(buff); - // // //pop - mt->nextThread(); - // // // cout << " " << (void*)buff; - mt->popFree(buff); - - ff=-1; - ii++; - if (ii%10000==0) { - - cout << ii << endl; - - while (mt->isBusy()) {;}//wait until all data are processed from the queues - mt->writeImage("/scratch/tmp.tiff"); - } - } - // cout << "--" << endl; - filebin.close(); - // //close file - // //join threads - while (mt->isBusy()) {;}//wait until all data are processed from the queues - if (of) - fclose(of); - - mt->writeImage(imgfname); - mt->clearImage(); - - std::time(&end_time); - cout << std::ctime(&end_time) << endl; - - } else - cout << "Could not open "<< fname << " for reading " << endl; - - - } - - - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp b/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp deleted file mode 100644 index 2d852a164..000000000 --- a/slsDetectorCalibration/moenchExecutables/moench03Interpolation.cpp +++ /dev/null @@ -1,322 +0,0 @@ - -#include "ansi.h" -#include - -//#include "moench03T1ZmqData.h" -//#define DOUBLE_SPH -//#define MANYFILES - -#ifdef DOUBLE_SPH -#include "single_photon_hit_double.h" -#endif - -#ifndef DOUBLE_SPH -#include "single_photon_hit.h" -#endif - -#include "etaInterpolationPosXY.h" -#include "noInterpolation.h" -//#include "etaInterpolationAdaptiveBins.h" -//#include "etaInterpolationRandomBins.h" -using namespace std; -#define NC 400 -#define NR 400 - - -#define XTALK - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [outfname] - * - */ - - if (argc<9) { - cout << "Wrong usage! Should be: "<< argv[0] << " infile " << " etafile outfile runmin runmax ns cmin cmax" << endl; - return 1; - } - - char infname[10000]; - char fname[10000]; - char outfname[10000]; - int runmin=atoi(argv[4]); - int runmax=atoi(argv[5]); - int nsubpix=atoi(argv[6]); - float cmin=atof(argv[7]); - float cmax=atof(argv[8]); - - int etabins=1000;//nsubpix*2*100; - double etamin=-1, etamax=2; - double eta3min=-2, eta3max=2; - int quad; - double sum, totquad; - double sDum[2][2]; - double etax, etay, int_x, int_y; - double eta3x, eta3y, int3_x, int3_y, noint_x, noint_y; - int ok; - int f0=-1; - int ix, iy, isx, isy; - int nframes=0, lastframe=-1; - double d_x, d_y, res=5, xx, yy; -#ifdef MANYFILES - int ff=1000; -#endif - int nph=0, badph=0, totph=0; - FILE *f=NULL; - -#ifdef DOUBLE_SPH - single_photon_hit_double cl(3,3); -#endif - -#ifndef DOUBLE_SPH - single_photon_hit cl(3,3); -#endif - -#ifdef XTALK - int old_val[3][3]; - int new_val[3][3]; - double xcorr=0.04; - - // int ix=0; -#endif - - - eta2InterpolationPosXY *interp=new eta2InterpolationPosXY(NC, NR, nsubpix, etabins, etamin, etamax); - eta3InterpolationPosXY *interp3=new eta3InterpolationPosXY(NC, NR, nsubpix, etabins, eta3min, eta3max); - noInterpolation *dummy=new noInterpolation(NC, NR, nsubpix); - noInterpolation *nointerp=new noInterpolation(NC, NR, nsubpix); - noInterpolation *mult=new noInterpolation(NC, NR, nsubpix); - //etaInterpolationAdaptiveBins *interp=new etaInterpolationAdaptiveBins (NC, NR, nsubpix, etabins, etamin, etamax); - //etaInterpolationRandomBins *interp=new etaInterpolationRandomBins (NC, NR, nsubpix, etabins, etamin, etamax); - //#ifndef FF - cout << "read ff " << argv[2] << endl; - sprintf(fname,"%s_eta2.tiff",argv[2]); - interp->readFlatField(fname); - interp->prepareInterpolation(ok); - - sprintf(fname,"%s_eta3.tiff",argv[2]); - interp3->readFlatField(fname); - interp3->prepareInterpolation(ok); - //#endif - - int *img; - float *totimg=new float[NC*NR*nsubpix*nsubpix]; - for (ix=0; ixwriteInterpolatedImage(outfname); - interp->clearInterpolatedImage(); - } -#endif - - } -#ifdef XTALK - if ((cl.x+1)%25!=0) { - for (int ix=-1; ix<2; ix++) { - for (int iy=-1; iy<2; iy++) { - old_val[iy+1][ix+1]=cl.get_data(ix,iy); - if (ix>=0) { - new_val[iy+1][ix+1]=old_val[iy+1][ix+1]-old_val[iy+1][ix]*xcorr; - cl.set_data(new_val[iy+1][ix+1],ix,iy); - } - } - } - } -#endif - quad=interp->calcQuad(cl.get_cluster(), sum, totquad, sDum); - if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && totquad200 && sum<580) { - // interp->getInterpolatedPosition(cl.x,cl.y, totquad,quad,cl.get_cluster(),int_x, int_y); - interp->getInterpolatedPosition(cl.x,cl.y, cl.get_cluster(),int_x, int_y); - interp->addToImage(int_x, int_y); - interp3->getInterpolatedPosition(cl.x,cl.y, cl.get_cluster(),int3_x, int3_y); - interp3->addToImage(int3_x, int3_y); - nointerp->getInterpolatedPosition(cl.x,cl.y, cl.get_cluster(),noint_x, noint_y); - nointerp->addToImage(noint_x, noint_y); - - - d_x= (int_x-int3_x)*25.; - d_y= (int_y-int3_y)*25.; - dummy->calcEta(totquad, sDum, etax, etay); - xx=int_x; - yy=int_y; - if (etax<0.1 || etax>0.9) xx=int3_x; - if (etay<0.1 || etay>0.9) yy=int3_y; - dummy->addToImage(xx,yy); - - if (d_x>res || d_x<-res || d_y>res || d_y<-res) { - badph++; - // cout << "delta (um): "<< d_x << " " << d_y << " " << cl.x << " " << cl.y << endl; - // cout << sum << " " << totquad << " " << etax << " "<< etay << endl; - // //cout<< int_x << " " << int_y << " " << int3_x << " " << int3_y << endl; - } - mult->addToImage(noint_x, noint_y); - - if (nph%1000000==0) cout << nph << endl; - if (nph%100000000==0) { - sprintf(outfname,"%s_inteta2.tiff", argv[3]); - interp->writeInterpolatedImage(outfname); - sprintf(outfname,"%s_inteta3.tiff", argv[3]); - interp3->writeInterpolatedImage(outfname); - sprintf(outfname,"%s_mix.tiff", argv[3]); - dummy->writeInterpolatedImage(outfname); - sprintf(outfname,"%s_noint.tiff", argv[3]); - nointerp->writeInterpolatedImage(outfname); - sprintf(outfname,"%s_mult.tiff", argv[3]); - mult->writeInterpolatedImage(outfname); - } - - } else { - mult->getInterpolatedPosition(cl.x,cl.y, cl.get_cluster(),int_x, int_y); - for (int imult=0; imult<2.*sum/(cmax+cmin); imult++) mult->addToImage(int_x, int_y); - } - - - } - fclose(f); -#ifdef FF - img=interp->getInterpolatedImage(); - for (isx=0; isxwriteInterpolatedImage(outfname); - sprintf(outfname,"%s_inteta3.tiff", argv[3]); - interp3->writeInterpolatedImage(outfname); - sprintf(outfname,"%s_mix.tiff", argv[3]); - dummy->writeInterpolatedImage(outfname); - sprintf(outfname,"%s_mult.tiff", argv[3]); - mult->writeInterpolatedImage(outfname); - -#ifndef MANYFILES - img=interp->getInterpolatedImage(); - for (ix=0; ixclearInterpolatedImage(); - interp3->clearInterpolatedImage(); - dummy->clearInterpolatedImage(); - mult->clearInterpolatedImage(); - - } else - cout << "could not open file " << infname << endl; - } - cout << irun << " " << runmax << endl; -#ifndef MANYFILES - sprintf(outfname,argv[3],11111); - WriteToTiff(totimg, outfname,NC*nsubpix,NR*nsubpix); -#endif - cout << "Filled " << nph << " (/"<< totph <<") of which " << badph << " badly interpolated " << endl; - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moench03MakeEta.cpp b/slsDetectorCalibration/moenchExecutables/moench03MakeEta.cpp deleted file mode 100644 index c2f2f92cd..000000000 --- a/slsDetectorCalibration/moenchExecutables/moench03MakeEta.cpp +++ /dev/null @@ -1,114 +0,0 @@ - -#include "ansi.h" -#include - -#include "moench03T1ZmqData.h" -#include "single_photon_hit.h" - - #include "etaInterpolationPosXY.h" - -using namespace std; -#define NC 400 -#define NR 400 - -#define XTALK - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [outfname] - * - */ - int nsubpix=10; - int etabins=nsubpix*100; - double etamin=-1, etamax=2; - double eta3min=-2, eta3max=2; - int quad; - double sum, totquad; - double sDum[2][2]; - char fname[10000]; - double etax, etay; - int runmin, runmax; - single_photon_hit cl(3,3); -int iph=0; - - if (argc<7) { - cout << "Wrong usage! Should be: "<< argv[0] << " infile " << " outfile runmin runmax cmin cmax" << endl; - return 1; - } - - eta2InterpolationPosXY *interp2=new eta2InterpolationPosXY(NR, NC, nsubpix, etabins, etamin, etamax); - cout << "###########"<< endl; - eta3InterpolationPosXY *interp3=new eta3InterpolationPosXY(NR, NC, nsubpix, etabins, eta3min, eta3max); - // cout << eta3min << " " << eta3max << endl; - runmin=atoi(argv[3]); - runmax=atoi(argv[4]); - double cmin=atof(argv[5]); //200 - double cmax=atof(argv[6]); //3000 - -#ifdef XTALK - int old_val[3][3]; - int new_val[3][3]; - double xcorr=0.04; - - // int ix=0; -#endif - - FILE *f; - for (int i=runmin; i=0) { - new_val[iy+1][ix+1]=old_val[iy+1][ix+1]-old_val[iy+1][ix]*xcorr; - cl.set_data(new_val[iy+1][ix+1],ix,iy); - } - } - } - } -#endif - quad=interp2->calcQuad(cl.get_cluster(), sum, totquad, sDum); - - if (sum>cmin && totquad/sum>0.8 && totquad/sum<1.2 && totquadaddToFlatField(cl.get_cluster(),etax, etay); - // if (etax>0.49 && etax<0.51 && etay>0.49 && etay<0.51 ) { - // cout << cl.y << " " << cl.x << " " << quad << " "<< totquad << " " <addToFlatField(cl.get_cluster(),etax, etay); - iph++; - if (iph%1000000==0) cout << iph << endl; - if (iph%100000000==0) { - sprintf(fname,"%s_eta2.tiff",argv[2]); - interp2->writeFlatField(fname); - sprintf(fname,"%s_eta3.tiff",argv[2]); - interp3->writeFlatField(fname); - } - // if (iph>1E8) break; - } - // } - - } - fclose(f); - - } - else cout << "could not open file " << fname << endl; - } - - sprintf(fname,"%s_eta2.tiff",argv[2]); - interp2->writeFlatField(fname); - sprintf(fname,"%s_eta3.tiff",argv[2]); - interp3->writeFlatField(fname); - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moench03NoInterpolation.cpp b/slsDetectorCalibration/moenchExecutables/moench03NoInterpolation.cpp deleted file mode 100644 index 9ff0ea900..000000000 --- a/slsDetectorCalibration/moenchExecutables/moench03NoInterpolation.cpp +++ /dev/null @@ -1,171 +0,0 @@ - -#include "ansi.h" -#include - -#include "moench03T1ZmqData.h" -#include "single_photon_hit.h" - -#include "noInterpolation.h" - -using namespace std; -#define NC 400 -#define NR 400 - - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [outfname] - * - */ - - if (argc<7) { - cout << "Wrong usage! Should be: "<< argv[0] << " infile " << " etafile outfile runmin runmax ns" << endl; - return 1; - } - - char infname[10000]; - char outfname[10000]; - int runmin=atoi(argv[4]); - int runmax=atoi(argv[5]); - int nsubpix=atoi(argv[6]); - - int etabins=1000;//nsubpix*2*100; - double etamin=-1, etamax=2; - int quad; - double sum, totquad; - double sDum[2][2]; - double etax, etay, int_x, int_y; - int ok; - - int ix, iy, isx, isy; - - - FILE *f=NULL; - - single_photon_hit cl(3,3); - // etaInterpolationPosXY *interp=new etaInterpolationPosXY(NC, NR, nsubpix, etabins, etamin, etamax); - noInterpolation *interp=new noInterpolation(NC, NR, nsubpix); - // interp->readFlatField(argv[2]); - // interp->prepareInterpolation(ok); - - int *img; - float *totimg=new float[NC*NR*nsubpix*nsubpix]; - for (ix=0; ixcalcQuad(cl.get_cluster(), sum, totquad, sDum); - if (sum>200 && sum<580) { - interp->getInterpolatedPosition(cl.x,cl.y, totquad,quad,cl.get_cluster(),int_x, int_y); - interp->addToImage(int_x, int_y); - } - } - fclose(f); -#ifdef FF - img=interp->getInterpolatedImage(); - for (isx=0; isxwriteInterpolatedImage(outfname); - img=interp->getInterpolatedImage(); - for (ix=0; ixclearInterpolatedImage(); - - } - } - - sprintf(outfname,argv[3],11111); - WriteToTiff(totimg, outfname,NC*nsubpix,NR*nsubpix); - - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moench03ReorderImage.cpp b/slsDetectorCalibration/moenchExecutables/moench03ReorderImage.cpp deleted file mode 100644 index 69b9b20c8..000000000 --- a/slsDetectorCalibration/moenchExecutables/moench03ReorderImage.cpp +++ /dev/null @@ -1,163 +0,0 @@ -//#include "ansi.h" -#include - - - -//#include "moench03T1ZmqData.h" - -#include "moench03T1ReceiverDataNew.h" - -// #include "interpolatingDetector.h" -//#include "etaInterpolationPosXY.h" -// #include "linearInterpolation.h" -// #include "noInterpolation.h" -//#include "interpolatingDetector.h" - -#include -#include -#include -#include - -#include - -#include -using namespace std; - -#define NX 400 //number of x pixels -#define NY 400 //number of y pixels - -int main(int argc, char *argv[]) { - - - if (argc<6) { - cout << "Usage is " << argv[0] << "indir outdir fname runmin runmax " << endl; - return 1; - } - int p=10000; - int fifosize=1000; - int nthreads=8; - int nsubpix=25; - int etabins=nsubpix*10; - double etamin=-1, etamax=2; - int csize=3; - int nx=400, ny=400; - int save=1; - int nsigma=5; - int nped=1000; - int ndark=100; - int ok; - int iprog=0; - - - - - moench03T1ReceiverDataNew *decoder=new moench03T1ReceiverDataNew(); - - - uint16_t data[NY*NX]; - - - int size = 327680;////atoi(argv[3]); - - int* image; - - int ff, np; - int dsize=decoder->getDataSize(); - - - //char data[dsize]; - - ifstream filebin; - char *indir=argv[1]; - char *outdir=argv[2]; - char *fformat=argv[3]; - int runmin=atoi(argv[4]); - int runmax=atoi(argv[5]); - - char fname[10000]; - char outfname[10000]; - char imgfname[10000]; - char pedfname[10000]; - // strcpy(pedfname,argv[6]); - char fn[10000]; - - std::time_t end_time; - - FILE *of=NULL; - cout << "input directory is " << indir << endl; - cout << "output directory is " << outdir << endl; - cout << "fileformat is " << fformat << endl; - - - std::time(&end_time); - cout << std::ctime(&end_time) << endl; - - - - - - - - char* buff; - - - - - int ifr=0; - - - for (int irun=runmin; irunreadNextFrame(filebin, ff, np,buff)) { - for (int ix=0; ix<400; ix++) - for (int iy=0; iy<400; iy++) - data[iy*NX+ix]=decoder->getChannel(buff,ix,iy); - - ifr++; - - fwrite(&ff, 8, 1,of);//write detector frame number - fwrite(&ifr, 8, 1,of);//write datset frame number - fwrite(data,2,NX*NY,of);//write reordered data - - if (ifr%10000==0) cout << ifr << " " << ff << endl; - ff=-1; - - } - cout << "--" << endl; - filebin.close(); - // //close file - // //join threads - - if (of) - fclose(of); - - std::time(&end_time); - cout << std::ctime(&end_time) << endl; - - } else - cout << "Could not open "<< fname << " for reading " << endl; - - - } - - - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqAnalog.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqAnalog.cpp deleted file mode 100644 index 4cbee47d0..000000000 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqAnalog.cpp +++ /dev/null @@ -1,394 +0,0 @@ -//#define ROOTSPECTRUM - -#include "multiThreadedAnalogDetector.h" - -#include "sls_receiver_defs.h" -#include "ZmqSocket.h" -#include "moench03T1ZmqDataNew.h" - -#ifdef ROOTSPECTRUM -#include -#include -#include -#include -#include -#include -#include -#include -#endif - -#include -#include -#include -#include -#include -#include "tiffIO.h" - -#include - -//#include "analogDetector.h" -#include "singlePhotonDetector.h" -#include "ansi.h" -#include -using namespace std; - - -#define SLS_DETECTOR_JSON_HEADER_VERSION 0x2 - - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [send_socket ip] [send port number] - * - */ - int fifosize=1000; - int nthreads=20; - char* buff; - char tit[10000]; - // help - if (argc < 3 ) { - cprintf(RED, "Help: ./trial [receive socket ip] [receive starting port number] [send_socket ip] [send starting port number]\n"); - return EXIT_FAILURE; - } - - // receive parameters - bool send = false; - char* socketip=argv[1]; - uint32_t portnum = atoi(argv[2]); - int size = 32*2*5000;//atoi(argv[3]); - - // send parameters if any - char* socketip2 = 0; - uint32_t portnum2 = 0; - if (argc > 3) { - send = true; - socketip2 = argv[3]; - portnum2 = atoi(argv[4]); - } - cout << "\nrx socket ip : " << socketip << - "\nrx port num : " << portnum ; - if (send) { - cout << "\nsd socket ip : " << socketip2 << - "\nsd port num : " << portnum2; - } - cout << endl; - - //slsDetectorData *det=new moench03T1ZmqDataNew(); - moench03T1ZmqDataNew *det=new moench03T1ZmqDataNew(); - analogDetector *filter=new analogDetector(det,1,NULL,1000); - //singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, 0, 1000, 10); - //filter->setROI(250, 400, 30, 150); - float threshold=1; - if (argc > 5) { - threshold=atof(argv[5]); - filter->setThreshold(threshold); - cout << "Threshold set to " << threshold << endl; - } - - int nnx, nny, nns; - int imsize=filter->getImageSize(nnx,nny,nns); - - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - - - - // mt->prepareInterpolation(ok); - mt->StartThreads(); - mt->popFree(buff); - - - - cout << "det " << endl; - int16_t dout[400*400]; - double ddark[400*400]; - cout << "dout " << endl; - - // receive socket - ZmqSocket* zmqsocket = new ZmqSocket(socketip,portnum); -#ifdef ROOTSPECTRUM - TH2F *h2=NULL; - TH2F *hmap=NULL; - TFile *froot=NULL; - - h2=new TH2F("hs","hs",500,-500,500,400*400,-0.5,400*400-0.5); - hmap=new TH2F("hmap","hmap",400,-0.5,400-0.5,400,-0.5,400-0.5); -#endif - cout << "zmq1 " << endl; - - if (zmqsocket->IsError()) { - cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", portnum, socketip); - delete zmqsocket; - return EXIT_FAILURE; - } - zmqsocket->Connect(); - printf("Zmq Client at %s\n", zmqsocket->GetZmqServerAddress()); - - // send socket - ZmqSocket* zmqsocket2 = 0; - cout << "zmq2 " << endl; - if (send) { - zmqsocket2 = new ZmqSocket(portnum2, socketip2); - if (zmqsocket2->IsError()) { - bprintf(RED, "Error: Could not create Zmq socket server on port %d and ip %s\n", portnum2, socketip2); - delete zmqsocket2; - delete zmqsocket; - return EXIT_FAILURE; - } - zmqsocket2->Connect(); - printf("Zmq Server started at %s\n", zmqsocket2->GetZmqServerAddress()); - // zmqsocket2->Disconnect(); - } - - - // header variables - uint64_t acqIndex = -1; - uint64_t frameIndex = -1; - uint32_t subframeIndex = -1; - uint64_t fileindex = -1; - string filename = ""; - //char* image = new char[size]; - //int* image = new int[(size/sizeof(int))](); - - int *nph;//[400*400]; - int iframe=0; - char rootfname[10000]; - - char fname[10000]; - char ff[10000]; - int fi; - int length; - char newped=-1, ped=-1, dat=-1, isdark=-1; - - double *peds; - int *im; - int fnumber; - float *gm=new float[400*400]; - // infinite loop - while(1) { - - - // cout << "+++++++++++++++++++++++++++++++LOOP" << endl; - // get header, (if dummy, fail is on parse error or end of acquisition) - if (!zmqsocket->ReceiveHeader(0, acqIndex, frameIndex, subframeIndex, filename, fileindex)){ - // if (!zmqsocket->ReceiveHeader(0, acqIndex, frameIndex, subframeIndex, filename, fileindex)) { - cprintf(RED, "Got Dummy\n"); - while (mt->isBusy()) {;}//wait until all data are processed from the queues - if (dat==1) { - - sprintf(tit,"%s_%lld.tiff",filename.c_str(),fi); - cout << tit << endl; - im=mt->getImage(nnx,nny,nns); - if (isdark) cout << "getting dark "<< endl; - else cout << "subtracting dark"<< endl; - if (gm) { - for (int ii=0; ii<400*400; ii++) { - // if (image[ix]>0) cout << ix << " " << image[ix]<< endl; - if (isdark) { - ddark[ii]=(double)im[ii]/((double)iframe); - if (ddark[ii]>0) cout << "*" ; - gm[ii]=im[ii]; - if (send) dout[ii]=im[ii]; - } else { - gm[ii]=im[ii];//-ddark[ii]*iframe; - if (gm[ii]<0) gm[ii]=0; - if (send) dout[ii]=gm[ii]; - } - //cout << endl; - - } - cout << endl; - //cout << "image " << nnx << " " << nny << endl; - WriteToTiff(gm,tit ,nnx, nny); - // delete [] gm; - } else cout << "Could not allocate float image " << endl; - - - - } else { - - sprintf(tit,"%s_%lld.tiff",filename.c_str(),fi); - cout << tit << endl; - mt->writePedestal(tit); - - } - - // mt->writeImage(tit); - // cout << "wrote" << endl; - - - - - - - - - if (send) { - if (dat==1) { - //im=mt->getImage(nnx,nny,nns); - - //if (im) - // cout << "got image" << endl; - //else - // cout << "could not get image" << endl; - - - //for (int ii=0; ii<400*400; ii++) { - //if (im[ii]>0) - //cout << im[ii] << endl; - // if (im[ii]>=0) - - // if (isdark) { - //ddark[ii]=im[ii]; - // dout[ii]=im[ii]; - // } else { - // dout[ii]=im[ii]-ddark[ii]; - // if (dout[ii]<0) dout[ii]=0; - // } - // else - // dout[ii]=0; - //else - //dout[ii]=0; - // cout << im[ii] << " " << dout[ii] << endl; - // } - //for (int iiy=49; iiy<52; iiy++) - // for (int iix=80; iix<83; iix++) - // dout[iiy*400+iix]=0; - ; - } else { - peds=mt->getPedestal(); - // sprintf(tit,"%s_%lld.tiff",filename.c_str(),fi); - //cout << tit << endl; - //mt->writePedestal(tit); - if (peds) - cout << "got peds" << endl; - else - cout << "could not get peds" << endl; - for (int ii=0; ii<400*400; ii++) { - dout[ii]=peds[ii]; - // if (ii%400==10 && ii/400==10) - // cout << ii/400 << " " << ii%400 << " " << peds[ii] << " " << dout[ii] << endl; - // if (ii%400==100 && ii/400==100) - // cout << ii/400 << " " << ii%400 << " " << peds[ii] << " " << dout[ii] << endl; - } - - } - - - // zmqsocket2 = new ZmqSocket(portnum2, socketip2); - // if (zmqsocket2->IsError()) { - // bprintf(RED, "Error: Could not create Zmq socket server on port %d and ip %s\n", portnum2, socketip2); - // delete zmqsocket2; - // delete zmqsocket; - // return EXIT_FAILURE; - // } - // zmqsocket2->Connect(); - // printf("Zmq Server started at %s\n", zmqsocket2->GetZmqServerAddress()); - //zmqsocket2->Connect(); - - - zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,ff, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - - - zmqsocket2->SendData((char*)dout,length); - cprintf(GREEN, "Sent Data %d \n",length); - - zmqsocket2->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - cprintf(RED, "Sent Dummy\n"); - // zmqsocket2->Disconnect(); - - // delete zmqsocket2; - } - cout << "Acquired "<< iframe << " frames " << endl; - iframe=0; - newped=-1; - ped=-1; - dat=-1; - mt->clearImage(); - isdark=0; - continue; //continue to not get out - } - // cprintf(GREEN, "Got Header \n"); - - strcpy(ff,filename.c_str()); - fi=fileindex; - //isdark=0; - if (newped<0) { - if (filename.find("newped")!=std::string::npos) { - cout << "NEWPED" << endl; - if (newped<=0) { - newped=1; - ped=1; - while (mt->isBusy()) {;} - mt->newDataSet(); //resets pedestal - mt->setFrameMode(ePedestal); - cout << "New data set"<< endl; - } - } else { - newped=0; - } - } - if (ped<0) { - if (filename.find("ped")!=std::string::npos) { - ped=1; - dat=0; - while (mt->isBusy()) {;} - mt->setFrameMode(ePedestal); - cout << "pedestal!"<< endl; - } else { - ped=0; - dat=1; - while (mt->isBusy()) {;} - mt->setFrameMode(eFrame); - cout << "data!"<< endl; - if (filename.find("dark")!=std::string::npos) { - isdark=1; - cout << "this is a dark image" << endl; - } - - } - } - - // get data - length = zmqsocket->ReceiveData(0, buff, size); - // cprintf(GREEN, "Got Data\n"); - - //processing with image - //... - // if (iframe<10) { - // filter->addToPedestal(image); - //} else { - //SLOW!!! - //*** - //filter->getNPhotons(image); - //nph=filter->getImage(); - //filter->addToPedestal(image); - //***** - - // cprintf(BLUE, "Data processed\n"); - - - mt->pushData(buff); - mt->nextThread(); - // cout << " " << (void*)buff; - mt->popFree(buff); - - - - //stream data from socket 2 - - iframe++; - } - - // }// exiting infinite loop - - - - delete zmqsocket; - if (send) - delete zmqsocket2; - - - cout<<"Goodbye"<< endl; - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqClusterFinder.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqClusterFinder.cpp deleted file mode 100644 index 4fe7c20b9..000000000 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqClusterFinder.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#include "sls_receiver_defs.h" -#include "ZmqSocket.h" -#include "moench03T1ZmqDataNew.h" -#include -#include -#include -#include -#include -#include "tiffIO.h" - -#include - -//#include "analogDetector.h" -#include "singlePhotonDetector.h" -#include "multiThreadedAnalogDetector.h" -#include "ansi.h" -#include -using namespace std; - - -#define SLS_DETECTOR_JSON_HEADER_VERSION 0x2 - - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [send_socket ip] [send port number] - * - */ - FILE *of=NULL; - int fifosize=1000; - int nthreads=20; - // help - if (argc < 3 ) { - cprintf(RED, "Help: ./trial [receive socket ip] [receive starting port number] [send_socket ip] [send starting port number]\n"); - return EXIT_FAILURE; - } - - // receive parameters - bool send = false; - char* socketip=argv[1]; - uint32_t portnum = atoi(argv[2]); - int size = 32*2*5000;//atoi(argv[3]); - - // send parameters if any - char* socketip2 = 0; - uint32_t portnum2 = 0; - if (argc > 3) { - send = true; - socketip2 = argv[3]; - portnum2 = atoi(argv[4]); - } - cout << "\nrx socket ip : " << socketip << - "\nrx port num : " << portnum ; - if (send) { - cout << "\nsd socket ip : " << socketip2 << - "\nsd port num : " << portnum2; - } - cout << endl; - - //slsDetectorData *det=new moench03T1ZmqDataNew(); - moench03T1ZmqDataNew *det=new moench03T1ZmqDataNew(); - //analogDetector *filter=new analogDetector(det,1,NULL,1000); - singlePhotonDetector *filter=new singlePhotonDetector(det,3, 5, 1, 0, 1000, 10); - - - char* buff; - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - mt->setFrameMode(eFrame); - mt->StartThreads(); - mt->popFree(buff); - - - - - - // receive socket - ZmqSocket* zmqsocket = new ZmqSocket(socketip,portnum); - - - - if (zmqsocket->IsError()) { - cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", portnum, socketip); - delete zmqsocket; - return EXIT_FAILURE; - } - zmqsocket->Connect(); - printf("Zmq Client at %s\n", zmqsocket->GetZmqServerAddress()); - - // send socket - ZmqSocket* zmqsocket2 = 0; - cout << "zmq2 " << endl; - if (send) { - zmqsocket2 = new ZmqSocket(portnum2, socketip2); - if (zmqsocket2->IsError()) { - bprintf(RED, "Error: Could not create Zmq socket server on port %d and ip %s\n", portnum2, socketip2); - delete zmqsocket2; - delete zmqsocket; - return EXIT_FAILURE; - } - zmqsocket2->Connect(); - printf("Zmq Server started at %s\n", zmqsocket2->GetZmqServerAddress()); - } - - - // header variables - uint64_t acqIndex = -1; - uint64_t frameIndex = -1; - uint32_t subframeIndex = -1; - uint64_t fileindex = -1; - string filename = ""; - char* image = new char[size]; - //int* image = new int[(size/sizeof(int))](); - - int *nph; - int iframe=0; - char ofname[10000]; - - char fname[10000]; - int length; - int *detimage; - int nnx, nny,nns; - filter->getImageSize(nnx, nny,nns); - int16_t *dout=new int16_t [nnx*nny]; - // infinite loop - while(1) { - - - // cout << "+++++++++++++++++++++++++++++++LOOP" << endl; - // get header, (if dummy, fail is on parse error or end of acquisition) - if (!zmqsocket->ReceiveHeader(0, acqIndex, frameIndex, subframeIndex, filename, fileindex)){ - // if (!zmqsocket->ReceiveHeader(0, acqIndex, frameIndex, subframeIndex, filename, fileindex)) { - cprintf(RED, "Got Dummy\n"); - while (mt->isBusy()) {;}//wait until all data are processed from the queues - - - detimage=mt->getImage(nnx,nny,nns); - for (int ix=0; ixSendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,16,fileindex,400,400,400*400, acqIndex,frameIndex,fname, acqIndex, 0,0,0,0,0,0,0,0,0,0,0,1); - zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fname, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - - zmqsocket2->SendData((char*)dout,length); - cprintf(GREEN, "Sent Data\n"); - } - - - // stream dummy to socket2 to signal end of acquisition - if (send) { - zmqsocket2->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - cprintf(RED, "Sent Dummy\n"); - } - mt->clearImage(); - if (of) { - fclose(of); - of=NULL; - } - - continue; //continue to not get out - } - - - if (of==NULL) { - sprintf(ofname,"%s_%d.clust",filename.c_str(),fileindex); - of=fopen(ofname,"w"); - if (of) { - mt->setFilePointer(of); - }else { - cout << "Could not open "<< ofname << " for writing " << endl; - mt->setFilePointer(NULL); - } - } - - // get data - length = zmqsocket->ReceiveData(0, buff, size); - mt->pushData(buff); - mt->nextThread(); - mt->popFree(buff); - - - - - iframe++; - } // exiting infinite loop - - - - delete zmqsocket; - if (send) - delete zmqsocket2; - - - cout<<"Goodbye"<< endl; - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/moenchZmqInterpolating.cpp b/slsDetectorCalibration/moenchExecutables/moenchZmqInterpolating.cpp deleted file mode 100644 index 2bd7e48f2..000000000 --- a/slsDetectorCalibration/moenchExecutables/moenchZmqInterpolating.cpp +++ /dev/null @@ -1,292 +0,0 @@ -#include "sls_receiver_defs.h" -#include "ZmqSocket.h" -#include "moench03T1ZmqDataNew.h" -#include -#include -#include -#include -#include -#include "tiffIO.h" - -#include - -//#include "analogDetector.h" -#include "interpolatingDetector.h" -#include "linearInterpolation.h" -#include "multiThreadedAnalogDetector.h" -#include "ansi.h" -#include -using namespace std; - - -#define SLS_DETECTOR_JSON_HEADER_VERSION 0x2 - - - - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [send_socket ip] [send port number] - * - */ - - int nthreads=20; - int nsigma=5; - int xmin=0; - int xmax=400; - int ymin=0; - int ymax=400; - int nsubpixels=2; - - - FILE *of=NULL; - int fifosize=1000; - int int_ready=0; - int ok; - // help - if (argc < 3 ) { - cprintf(RED, "Help: %s [receive socket ip] [receive starting port number] [send_socket ip] [send starting port number] [nsubpixels] [nthreads] [nsigma] [xmin xmax ymin ymax]\n", argv[0]); - return EXIT_FAILURE; - } - - char* socketip2 = 0; - uint32_t portnum2 = 0; - // receive parameters - int size = 32*2*5000;//atoi(argv[3]); - bool send = false; - - - - char* socketip=argv[1]; - uint32_t portnum = atoi(argv[2]); - if (argc > 3) { - send = true; - socketip2 = argv[3]; - portnum2 = atoi(argv[4]); - } - if (argc > 5) { - nsubpixels=atoi(argv[5]); - } - if (argc>6) { - nthreads=atoi(argv[6]); - } - if (argc>7) { - nsigma=atoi(argv[7]); - } - if (argc>11) { - xmin=atoi(argv[8]); - xmax=atoi(argv[8]); - ymin=atoi(argv[10]); - ymax=atoi(argv[11]); - } - - cout << "\nrx socket ip : " << socketip << - "\nrx port num : " << portnum ; - if (send) { - cout << "\nsd socket ip : " << socketip2 << - "\nsd port num : " << portnum2; - } - cout << endl; - - //slsDetectorData *det=new moench03T1ZmqDataNew(); - int npx, npy; - moench03T1ZmqDataNew *det=new moench03T1ZmqDataNew(); - det->getDetectorSize(npx, npy); - linearInterpolation *interp=new linearInterpolation(npx,npy,nsubpixels); - interpolatingDetector *filter=new interpolatingDetector(det,interp, nsigma, 1, 0, 1000, 100,npx,npy); - cout << "Setting noise cut to " << nsigma << " sigma"<< endl; - filter->setROI(xmin,xmax,ymin,ymax); - cout << "Setting ROI to "<< xmin << " " << xmax << " " << ymin << " " << ymax << endl; - - char* buff; - multiThreadedAnalogDetector *mt=new multiThreadedAnalogDetector(filter,nthreads,fifosize); - int frameMode=eFrame; - mt->setFrameMode(frameMode); - mt->StartThreads(); - mt->popFree(buff); - - - - - - // receive socket - ZmqSocket* zmqsocket = new ZmqSocket(socketip,portnum); - if (zmqsocket->IsError()) { - cprintf(RED, "Error: Could not create Zmq socket on port %d with ip %s\n", portnum, socketip); - delete zmqsocket; - return EXIT_FAILURE; - } - zmqsocket->Connect(); - printf("Zmq Client at %s\n", zmqsocket->GetZmqServerAddress()); - - // send socket - ZmqSocket* zmqsocket2 = 0; - if (send) { - zmqsocket2 = new ZmqSocket(portnum2, socketip2); - if (zmqsocket2->IsError()) { - bprintf(RED, "Error: Could not create Zmq socket server on port %d and ip %s\n", portnum2, socketip2); - delete zmqsocket2; - delete zmqsocket; - return EXIT_FAILURE; - } - zmqsocket2->Connect(); - printf("Zmq Server started at %s\n", zmqsocket2->GetZmqServerAddress()); - } - - - // header variables - uint64_t acqIndex = -1; - uint64_t frameIndex = -1; - uint32_t subframeIndex = -1; - uint64_t fileindex = -1; - string filename = ""; - char ffname[10000]; - int ffindex; - - char* image = new char[size]; - //int* image = new int[(size/sizeof(int))](); - - int *nph; - int iframe=0; - char ofname[10000]; - - char fname[10000]; - int length; - int *detimage; - int nnx, nny,nns; - int nix, niy,nis; - filter->getImageSize(nnx, nny,nns); - int16_t *dout=new int16_t [nnx*nny]; - // infinite loop - int ix, iy, isx, isy; - while(1) { - - - // cout << "+++++++++++++++++++++++++++++++LOOP" << endl; - // get header, (if dummy, fail is on parse error or end of acquisition) - if (!zmqsocket->ReceiveHeader(0, acqIndex, frameIndex, subframeIndex, filename, fileindex)){ - // if (!zmqsocket->ReceiveHeader(0, acqIndex, frameIndex, subframeIndex, filename, fileindex)) { - // cprintf(RED, "Got Dummy\n"); - while (mt->isBusy()) {;}//wait until all data are processed from the queues - if (frameMode==ePedestal) { - detped=mt->getPedestal(); - if (detped) { - - for (ix=0; ix<400; ix++) { - for (iy=0; iy<400; iy++) { - dout[iy*400+ix]+=detped[iy*400+ix]; - } - } - } - - } else { - detimage=mt->getImage(nix,niy,nis); - if (detimage) { - for (ix=0; ixSendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,16,fileindex,400,400,400*400, acqIndex,frameIndex,fname, acqIndex, 0,0,0,0,0,0,0,0,0,0,0,1); - zmqsocket2->SendHeaderData(0, false, SLS_DETECTOR_JSON_HEADER_VERSION,0,0,0,0,0, 0,0,fname, 0, 0,0,0,0,0,0,0,0,0,0,0,1); - - zmqsocket2->SendData((char*)dout,length); - cprintf(GREEN, "Sent Data\n"); - } - - sprintf(ofname,"%s_%d.tiff",ffname,ffindex); - if (frameMode==eFlat) - mt->writeFlatField(ofname); - else if (frameMode==ePedestal) - mt->writePedestal(ofname); - else - mt->writeImage(ofname); - - - // stream dummy to socket2 to signal end of acquisition - if (send) { - zmqsocket2->SendHeaderData(0, true, SLS_DETECTOR_JSON_HEADER_VERSION); - // cprintf(RED, "Sent Dummy\n"); - cprintf(RED, "Received %d frames\n", iframe); - } - mt->clearImage(); - if (of) { - fclose(of); - of=NULL; - } - iframe=0; - continue; //continue to not get out - } - - - if (of==NULL) { - while (mt->isBusy()) {;} - sprintf(ofname,"%s_%d.clust",filename.c_str(),fileindex); - of=fopen(ofname,"w"); - if (of) { - mt->setFilePointer(of); - }else { - cout << "Could not open "<< ofname << " for writing " << endl; - mt->setFilePointer(NULL); - } - ffindex=fileindex; - strcpy(ffname,filename.c_str()); - if (filename.find("flat")!=std::string::npos) { - cout << "add to ff" << endl; - frameMode=eFlat;//ePedestal; - int_ready=0; - - } else if (filename.find("newped")!=std::string::npos) { - frameMode=ePedestal; - cout << "new pedestal" << endl; - - mt->newDataSet(); - } else if (filename.find("ped")!=std::string::npos){ - frameMode=ePedestal; - cout << "pedestal" << endl; - } else { - frameMode=eFrame; - cout << "data" << endl; - if (int_ready==0) { - mt->prepareInterpolation(ok); - cout << "prepare interpolation " << endl; - int_ready=1; - } - } - - mt->setFrameMode(frameMode); - } - - // get data - length = zmqsocket->ReceiveData(0, buff, size); - mt->pushData(buff); - mt->nextThread(); - mt->popFree(buff); - - iframe++; - } // exiting infinite loop - - - - delete zmqsocket; - if (send) - delete zmqsocket2; - - - // cout<<"Goodbye"<< endl; - return 0; -} - diff --git a/slsDetectorCalibration/moenchExecutables/tiff_to_th2f.cpp b/slsDetectorCalibration/moenchExecutables/tiff_to_th2f.cpp deleted file mode 100644 index 3e248feaa..000000000 --- a/slsDetectorCalibration/moenchExecutables/tiff_to_th2f.cpp +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "tiffIO.h" - -#include - -using namespace std; - - -int main(int argc, char *argv[]) { -/** - * trial.o [socket ip] [starting port number] [outfname] - * - */ - - if (argc<3) { - cout << "Wrong usage! Should be: "<< argv[0] << " infile " << " outfile " << endl; - return 1; - } - - uint32 nx, ny; - - float *data=ReadFromTiff(argv[1],nx, ny); - - TH2F *h2=NULL; - if (data) { - TFile *fout=new TFile(argv[2],"RECREATE"); - if (fout) { - h2=new TH2F("h2",argv[1],nx,0,nx,ny,0, ny); - for (int ix=0; ixSetBinContent(ix+1, iy+1, data[ix+iy*nx]); - } - } - h2->Write(); - fout->Close(); - } - delete [] data; - } - - - - return 0; -} - diff --git a/slsDetectorCalibration/multiThreadedAnalogDetector.h b/slsDetectorCalibration/multiThreadedAnalogDetector.h deleted file mode 100644 index 1395a53e3..000000000 --- a/slsDetectorCalibration/multiThreadedAnalogDetector.h +++ /dev/null @@ -1,574 +0,0 @@ -#ifndef MULTITHREADED_ANALOG_DETECTOR_H -#define MULTITHREADED_ANALOG_DETECTOR_H - -#include -#include -#include -#include -#include -#include -//#include -//#include -//#include -#include -#include -#include - -//#include "analogDetector.h" -#include "singlePhotonDetector.h" -//#include "interpolatingDetector.h" -#include "circularFifo.h" -#include "slsInterpolation.h" -#include -#include -#include -//#include - - -using namespace std; - - -class threadedAnalogDetector -{ -public: - threadedAnalogDetector(analogDetector *d, int fs=10000) { - char *mem, *mm; - det=d; - fifoFree=new CircularFifo(fs); - fifoData=new CircularFifo(fs); - mem=(char*)malloc(fs*det->getDataSize()); - // cout << "data size is " << det->getDataSize()*fs << endl; - for (int i=0; igetDataSize(); - fifoFree->push(mm); - } - busy=0; - stop=1; - fMode=eFrame; - ff=NULL; - } - - - virtual int setFrameMode(int fm) {fMode=fm; if (fMode>=0) det->setFrameMode((frameMode)fMode);}; - virtual void newDataSet(){det->newDataSet();}; - //fMode=fm; return fMode;} - - /* void prepareInterpolation(int &ok) { */ - /* cout << "-" << endl; */ - /* det->prepareInterpolation(ok); */ - /* }; */ - - virtual int *getImage() { - return det->getImage(); - } - virtual int getImageSize(int &nnx, int &nny, int &ns) {return det->getImageSize(nnx, nny, ns);}; - virtual int getDetectorSize(int &nnx, int &nny) {return det->getDetectorSize(nnx, nny);}; - - ~threadedAnalogDetector() {StopThread(); free(mem); delete fifoFree; delete fifoData;} - - /** Returns true if the thread was successfully started, false if there was an error starting the thread */ - virtual bool StartThread() - { stop=0; - return (pthread_create(&_thread, NULL, processData, this) == 0); - } - - virtual void StopThread() - { stop=1; - (void) pthread_join(_thread, NULL); - } - - - virtual bool pushData(char* &ptr) { - fifoData->push(ptr); - } - - virtual bool popFree(char* &ptr) { - fifoFree->pop(ptr); - } - - virtual int isBusy() {return busy;} - - //protected: - /** Implement this method in your subclass with the code you want your thread to run. */ - //virtual void InternalThreadEntry() = 0; - virtual void *writeImage(const char * imgname) {cout << "a" <writeImage(imgname);}; - - virtual void clearImage(){det->clearImage();}; - - virtual void prepareInterpolation(int &ok){ - slsInterpolation *interp=(slsInterpolation*)det->getInterpolation(); - if (interp) - interp->prepareInterpolation(ok); - } - - virtual int *getFlatField(){ - slsInterpolation *interp=(slsInterpolation*)det->getInterpolation(); - if (interp) - return interp->getFlatField(); - else - return NULL; - } - - virtual int *setFlatField(int *ff, int nb, double emin, double emax){ - slsInterpolation *interp=(slsInterpolation*)det->getInterpolation(); - if (interp) - return interp->setFlatField(ff, nb, emin, emax); - else - return NULL; - } - - virtual int *getFlatField(int &nb, double emi, double ema){ - slsInterpolation *interp=(slsInterpolation*)det->getInterpolation(); - int *ff; - if (interp) { - ff=interp->getFlatField(nb,emi,ema); - // cout << "tdgff* ff has " << nb << " bins " << endl; - return ff; - } else - return NULL; - } - - virtual char *getInterpolation() { - return det->getInterpolation(); - } - - virtual void setPedestal(double *ped, double *rms=NULL, int m=-1){det->setPedestal(ped,rms,m);}; - - - virtual void setPedestalRMS(double *rms){ det->setPedestalRMS(rms);}; - - virtual double *getPedestal(double *ped=NULL){return det->getPedestal(ped);}; - - - virtual double *getPedestalRMS(double *rms=NULL){ return det->getPedestalRMS(rms);}; - - - - -/** sets file pointer where to write the clusters to - \param f file pointer - \returns current file pointer -*/ - FILE *setFilePointer(FILE *f){return det->setFilePointer(f); }; - -/** gets file pointer where to write the clusters to - \returns current file pointer -*/ -FILE *getFilePointer(){return det->getFilePointer();}; - - - void setMutex(pthread_mutex_t *fmutex){det->setMutex(fmutex);}; - -private: - analogDetector *det; - int fMode; - int *dataSize; - pthread_t _thread; - char *mem; - CircularFifo *fifoFree; - CircularFifo *fifoData; - int stop; - int busy; - char *data; - int *ff; - - static void * processData(void * ptr) { - threadedAnalogDetector *This=((threadedAnalogDetector *)ptr); - return This->processData(); - } - void * processData() { - busy=1; - while (!stop) { - if (fifoData->isEmpty()) { - busy=0; - usleep(100); - } else { - busy=1; - fifoData->pop(data); //blocking! - det->processData(data); - fifoFree->push(data); - } - } - return NULL; - } - - - -}; - - - -class multiThreadedAnalogDetector -{ -public: - multiThreadedAnalogDetector(analogDetector *d, int n, int fs=1000) : nThreads(n), ithread(0) { - dd[0]=d; - if (nThreads==1) - dd[0]->setId(100); - else - dd[0]->setId(0); - for (int i=1; iClone(); - dd[i]->setId(i); - } - - for (int i=0; igetImageSize(nnx, nny,ns); - image=new int[nn]; - ff=NULL; - ped=NULL; - } - - ~multiThreadedAnalogDetector() { - StopThreads(); - for (int i=0; isetFrameMode(fm); return ret;}; - - void newDataSet(){for (int i=0; inewDataSet();}; - int *getImage(int &nnx, int &nny, int &ns) { - int *img; - // int nnx, nny, ns; - int nn=dets[0]->getImageSize(nnx, nny, ns); - //for (i=0; igetImage(); - for (int i=0; iclearImage(); - } - - } - - virtual void *writeImage(const char * imgname) { -/* #ifdef SAVE_ALL */ -/* for (int ii=0; iiwriteImage(tit); */ -/* } */ -/* #endif */ - int nnx, nny, ns; - getImage(nnx, nny, ns); - //int nnx, nny, ns; - int nn=dets[0]->getImageSize(nnx, nny, ns); - float *gm=new float[nn]; - if (gm) { - for (int ix=0; ix0 && ix/nnx<350) cout << ix/nnx << " " << ix%nnx << " " << image[ix]<< " " << gm[ix] << endl; - } - //cout << "image " << nnx << " " << nny << endl; - WriteToTiff(gm,imgname ,nnx, nny); - delete [] gm; - } else cout << "Could not allocate float image " << endl; - return NULL; - } - - - virtual void StartThreads() { - for (int i=0; iStartThread(); - - } - - - - virtual void StopThreads() { - for (int i=0; iStopThread(); - - } - - - int isBusy() { - int ret=0, ret1; - for (int i=0; iisBusy(); - ret|=ret1; - // if (ret1) cout << "thread " << i <<" still busy " << endl; - } - return ret; - } - - - bool pushData(char* &ptr) { - dets[ithread]->pushData(ptr); - } - - bool popFree(char* &ptr) { - dets[ithread]->popFree(ptr); - } - - int nextThread() { - ithread++; - if (ithread==nThreads) ithread=0; - return ithread; - } - - virtual void prepareInterpolation(int &ok){ - getFlatField(); //sum up all etas - setFlatField(); //set etas to all detectors - for (int i=0; iprepareInterpolation(ok); - } - } - - virtual int *getFlatField(){ - int nb=0; - double emi, ema; - int *f0; - slsInterpolation* inte=(slsInterpolation*)dets[0]->getInterpolation(); - if (inte) { - if (inte->getFlatField(nb,emi,ema)) { - if (ff) delete [] ff; - ff=new int[nb*nb]; - for (int i=0; igetInterpolation(); - f0=inte->getFlatField(); - if (f0) { - // cout << "ff " << i << endl; - for (int ib=0; ib0) */ - /* cout << i << " " << ib << " " << f0[ib] << " " << ff[ib] << endl; */ - - } - } - } - return ff; - } - } - return NULL; - } - - - virtual int *setFlatField(int *h=NULL, int nb=-1, double emin=1, double emax=0){ - //int nb=0; - double emi, ema; - slsInterpolation* inte=(slsInterpolation*)dets[0]->getFlatField(nb,emi,ema); - if (inte) { - if (h==NULL) h=ff; - for (int i=0; isetFlatField(h, nb, emin, emax); - } - } - return NULL; - }; - - void *writeFlatField(const char * imgname){ - - int nb=0; - double emi, ema; - slsInterpolation* inte=(slsInterpolation*)dets[0]->getFlatField(nb,emi,ema); - if (inte) { - if (getFlatField()) { - // cout << "mtwff* ff has " << nb << " bins " << endl; - float *gm=new float[nb*nb]; - if (gm) { - for (int ix=0; ixgetFlatField(nb,emin,emax); - if (inte) { - uint32 nnx; - uint32 nny; - float *gm=ReadFromTiff(imgname, nnx, nny); - if (ff) delete [] ff; - if (nnx>nb) nb=nnx; - if (nny>nb) nb=nny; - ff=new int[nb*nb]; - - for (int ix=0; ixgetDetectorSize(nx,ny); - if (ped) delete [] ped; - ped=new double[nx*ny]; - double *p0=new double[nx*ny]; - - for (int i=0; igetInterpolation(nb,emi,ema); - p0=dets[i]->getPedestal(p0); - if (p0) { - for (int ib=0; ibgetDetectorSize(nx,ny); - if (h==NULL) h=ped; - for (int i=0; isetPedestal(h); - } - - return NULL; - }; - - - - - void *writePedestal(const char * imgname){ - - int nx, ny; - dets[0]->getDetectorSize(nx,ny); - - getPedestal(); - float *gm=new float[nx*ny]; - if (gm) { - for (int ix=0; ixgetDetectorSize(nx,ny); - uint32 nnx; - uint32 nny; - float *gm=ReadFromTiff(imgname, nnx, nny); - if (ped) delete [] ped; - if (nnx>nx) nx=nnx; - if (nny>ny) ny=nny; - ped=new double[nx*ny]; - - for (int ix=0; ixsetFilePointer(f); - //dets[i]->setMutex(&fmutex); - } - return dets[0]->getFilePointer(); - }; - -/** gets file pointer where to write the clusters to - \returns current file pointer -*/ -FILE *getFilePointer(){return dets[0]->getFilePointer();}; - - - - private: - bool stop; - const int nThreads; - threadedAnalogDetector *dets[20]; - analogDetector *dd[20]; - int ithread; - int *image; - int *ff; - double *ped; - pthread_mutex_t fmutex; -}; - -#endif - - - - - - - - - - - - - - - - - - diff --git a/slsDetectorCalibration/pedestalSubtraction.h b/slsDetectorCalibration/pedestalSubtraction.h deleted file mode 100644 index 062b0d84e..000000000 --- a/slsDetectorCalibration/pedestalSubtraction.h +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef PEDESTALSUBTRACTION_H -#define PEDESTALSUBTRACTION_H - -#include "MovingStat.h" - -class pedestalSubtraction { - /** @short class defining the pedestal subtraction based on an approximated moving average */ - public: - /** constructor - \param nn number of samples to calculate the moving average (defaults to 1000) - */ - pedestalSubtraction (int nn=1000) : stat(nn) {}; - - /** virtual destructorr - */ - virtual ~pedestalSubtraction() {}; - - /** clears the moving average */ - virtual void Clear() {stat.Clear();} - - /** adds the element to the moving average - \param val value to be added - */ - virtual void addToPedestal(double val){stat.Calc(val);}; - - /** returns the average value of the pedestal - \returns mean of the moving average - */ - virtual double getPedestal(){return stat.Mean();}; - - /** returns the standard deviation of the moving average - \returns standard deviation of the moving average - */ - virtual double getPedestalRMS(){return stat.StandardDeviation();}; - - /**sets/gets the number of samples for the moving average - \param i number of elements for the moving average. If -1 (default) or negative, gets. - \returns actual number of samples for the moving average - */ - virtual int SetNPedestals(int i=-1) {return stat.SetN(i);}; - - /**sets/gets the number of samples for the moving average - \returns actual number of samples for the moving average - */ - virtual int GetNPedestals() {return stat.GetN();}; - - /** sets the moving average */ - virtual void setPedestal(double val, double rms=0, int m=-1) {stat.Set(val, rms, m);} - - - /** sets the moving average */ - virtual void setPedestalRMS(double rms) {stat.SetRMS(rms);} - - /**sets/gets the number of samples for the moving average - \returns actual number of samples for the moving average - */ - virtual int getNumpedestals() {return stat.NumDataValues();}; - - private: - MovingStat stat; /**< approximated moving average struct */ - -}; -#endif diff --git a/slsDetectorCalibration/singlePhotonDetector.h b/slsDetectorCalibration/singlePhotonDetector.h deleted file mode 100644 index f8b0f7577..000000000 --- a/slsDetectorCalibration/singlePhotonDetector.h +++ /dev/null @@ -1,685 +0,0 @@ -#ifndef SINGLEPHOTONDETECTOR_H -#define SINGLEPHOTONDETECTOR_H - -#include "analogDetector.h" - -#include "single_photon_hit.h" - - - -//#define MYROOT1 - -#ifdef MYROOT1 -#include -#endif - - -#ifndef EVTYPE_DEF -#define EVTYPE_DEF -/** enum to define the even types */ -enum eventType { - PEDESTAL=0, /** pedestal */ - NEIGHBOUR=1, /** neighbour i.e. below threshold, but in the cluster of a photon */ - PHOTON=2, /** photon i.e. above threshold */ - PHOTON_MAX=3, /** maximum of a cluster satisfying the photon conditions */ - NEGATIVE_PEDESTAL=4, /** negative value, will not be accounted for as pedestal in order to avoid drift of the pedestal towards negative values */ - UNDEFINED_EVENT=-1 /** undefined */ -}; -#endif - -//template class singlePhotonDetector : -//public analogDetector { -class singlePhotonDetector : -public analogDetector { - - /** @short class to perform pedestal subtraction etc. and find single photon clusters for an analog detector */ - - public: - - - /** - - Constructor (no error checking if datasize and offsets are compatible!) - \param d detector data structure to be used - \param csize cluster size (should be an odd number). Defaults to 3 - \param nsigma number of rms to discriminate from the noise. Defaults to 5 - \param sign 1 if photons are positive, -1 if negative - \param cm common mode subtraction algorithm, if any. Defaults to NULL i.e. none - \param nped number of samples for pedestal averaging - \param nd number of dark frames to average as pedestals without photon discrimination at the beginning of the measurement - - - */ - - - singlePhotonDetector(slsDetectorData *d, - int csize=3, - double nsigma=5, - int sign=1, - commonModeSubtraction *cm=NULL, - int nped=1000, - int nd=100, int nnx=-1, int nny=-1, double *gm=NULL) : analogDetector(d, sign, cm, nped, nnx, nny, gm), nDark(nd), eventMask(NULL),nSigma (nsigma), clusterSize(csize), clusterSizeY(csize), clusters(NULL), quad(UNDEFINED_QUADRANT), tot(0), quadTot(0) { - - - - - eventMask=new eventType*[ny]; - for (int i=0; i(orig) { - - nDark=orig->nDark; - myFile=orig->myFile; - - eventMask=new eventType*[ny]; - for (int i=0; inSigma; - clusterSize=orig->clusterSize; - clusterSizeY=orig->clusterSizeY; - // cluster=new single_photon_hit(clusterSize,clusterSizeY); - clusters=new single_photon_hit[nx*ny]; - - // cluster=clusters; - - setClusterSize(clusterSize); - - quad=UNDEFINED_QUADRANT; - tot=0; - quadTot=0; - gmap=orig->gmap; - nphTot=0; - nphFrame=0; - - } - - - - /** - duplicates the detector structure - \returns new single photon detector with same parameters - - */ - virtual singlePhotonDetector *Clone() { - return new singlePhotonDetector(this); - } - /** sets/gets number of rms threshold to detect photons - \param n number of sigma to be set (0 or negative gets) - \returns actual number of sigma parameter - */ - double setNSigma(double n=-1){if (n>0) nSigma=n; return nSigma;} - - /** sets/gets cluster size - \param n cluster size to be set, (0 or negative gets). If even is incremented by 1. - \returns actual cluster size - */ - int setClusterSize(int n=-1){ - if (n>0 && n!=clusterSize) { - if (n%2==0) - n+=1; - clusterSize=n; - // if (clusters) - // delete [] clusters; - if (ny>clusterSize) - clusterSizeY=clusterSize; - else - clusterSizeY=1; - for (int ip=0; ipset_cluster_size(clusterSize,clusterSizeY); - //cluster=new single_photon_hit(clusterSize,clusterSizeY); - } - return clusterSize; - } - - - - /** - converts the image into number of photons - \param data pointer to data - \param nph pointer where to add the calculated photons. If NULL, the internal image will be used - \returns array with data converted into number of photons. - */ - - virtual int *getNPhotons(char *data, int *nph=NULL) { - - nphFrame=0; - double val; - if (nph==NULL) - nph=image; - //nph=new int[nx*ny]; - - double rest[ny][nx]; - int cy=(clusterSizeY+1)/2; - int cs=(clusterSize+1)/2; - - int ccs=clusterSize; - int ccy=clusterSizeY; - - double g=1.; - - - double tthr=thr, tthr1, tthr2; - int nn=0; - double max=0, tl=0, tr=0, bl=0,br=0, v; - double rms=0; - - int cm=0; - if (cmSub) cm=1; - - if (thr>0) { - cy=1; - cs=1; - ccs=1; - ccy=1; - } - if (iframe0) { - newFrame(); - if (cmSub) { - addToCommonMode(data); - } - for (int ix=xmin; ix::getNPhotons(data,ix,iy); - nph[ix+nx*iy]+=nn; - rest[iy][ix]=(val-nn*tthr); - - nphFrame+=nn; - nphTot+=nn; - } - } - // } - for (int ix=xmin; ix0.25*tthr) { - eventMask[iy][ix]=NEIGHBOUR; - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - if ((iy+ir)>=0 && (iy+ir)=0 && (ix+ic)set_data(rest[iy+ir][ix+ic], ic, ir); - - - v=rest[iy+ir][ix+ic];//clusters->get_data(ic,ir); - tot+=v; - - if (ir<=0 && ic<=0) - bl+=v; - if (ir<=0 && ic>=0) - br+=v; - if (ir>=0 && ic<=0) - tl+=v; - if (ir>=0 && ic>=0) - tr+=v; - - if (v>max) { - max=v; - } - // if (ir==0 && ic==0) { - //} - } - } - } - - if (rest[iy][ix]>=max) { - if (bl>=br && bl>=tl && bl>=tr) { - quad=BOTTOM_LEFT; - quadTot=bl; - } else if (br>=bl && br>=tl && br>=tr) { - quad=BOTTOM_RIGHT; - quadTot=br; - } else if (tl>=br && tl>=bl && tl>=tr) { - quad=TOP_LEFT; - quadTot=tl; - } else if (tr>=bl && tr>=tl && tr>=br) { - quad=TOP_RIGHT; - quadTot=tr; - } - rms=getPedestalRMS(ix,iy); - tthr1=tthr-sqrt(ccy*ccs)*rms; - tthr2=tthr-sqrt(cy*cs)*rms; - if (tthr>sqrt(ccy*ccs)*rms) tthr1=tthr-sqrt(ccy*ccs)*rms; else tthr1=sqrt(ccy*ccs)*rms; - if (tthr>sqrt(cy*cs)*rms) tthr2=tthr-sqrt(cy*cs)*rms; else tthr2=sqrt(cy*cs)*rms; - if (tot>tthr1 || quadTot>tthr2) { - eventMask[iy][ix]=PHOTON; - nph[ix+nx*iy]++; - nphFrame++; - nphTot++; - - } - } - } - } - } - // cout << iframe << " " << nphFrame << " " << nphTot << endl; - //cout << iframe << " " << nph << endl; - } else return getClusters(data, nph); - } - return NULL; - }; - - - /** finds event type for pixel and fills cluster structure. The algorithm loops only if the evenMask for this pixel is still undefined. - if pixel or cluster around it are above threshold (nsigma*pedestalRMS) cluster is filled and pixel mask is PHOTON_MAX (if maximum in cluster) or NEIGHBOUR; If PHOTON_MAX, the elements of the cluster are also set as NEIGHBOURs in order to speed up the looping - if below threshold the pixel is either marked as PEDESTAL (and added to the pedestal calculator) or NEGATIVE_PEDESTAL is case it's lower than -threshold, otherwise the pedestal average would drift to negative values while it should be 0. - - /param data pointer to the data - /param ix pixel x coordinate - /param iy pixel y coordinate - /param cm enable(1)/disable(0) common mode subtraction (if defined). - /returns event type for the given pixel - */ - eventType getEventType(char *data, int ix, int iy, int cm=0) { - - // eventType ret=PEDESTAL; - double max=0, tl=0, tr=0, bl=0,br=0, v; - // cout << iframe << endl; - - int cy=(clusterSizeY+1)/2; - int cs=(clusterSize+1)/2; - double val; - tot=0; - quadTot=0; - quad=UNDEFINED_QUADRANT; - - if (iframex=ix; - clusters->y=iy; - clusters->rms=getPedestalRMS(ix,iy); - clusters->ped=getPedestal(ix,iy, cm); - - - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - if ((iy+ir)>=0 && (iy+ir)=0 && (ix+ic)set_data(v, ic, ir); - // v=clusters->get_data(ic,ir); - tot+=v; - if (ir<=0 && ic<=0) - bl+=v; - if (ir<=0 && ic>=0) - br+=v; - if (ir>=0 && ic<=0) - tl+=v; - if (ir>=0 && ic>=0) - tr+=v; - - if (v>max) { - max=v; - } - if (ir==0 && ic==0) { - if (v<-nSigma*clusters->rms) - eventMask[iy][ix]=NEGATIVE_PEDESTAL; - } - } - } - } - - if (bl>=br && bl>=tl && bl>=tr) { - quad=BOTTOM_LEFT; - quadTot=bl; - } else if (br>=bl && br>=tl && br>=tr) { - quad=BOTTOM_RIGHT; - quadTot=br; - } else if (tl>=br && tl>=bl && tl>=tr) { - quad=TOP_LEFT; - quadTot=tl; - } else if (tr>=bl && tr>=tl && tr>=br) { - quad=TOP_RIGHT; - quadTot=tr; - } - - if (max>nSigma*clusters->rms || tot>sqrt(clusterSizeY*clusterSize)*nSigma*clusters->rms || quadTot>cy*cs*nSigma*clusters->rms) { - if (clusters->get_data(0,0)>=max) { - eventMask[iy][ix]=PHOTON_MAX; - } else { - eventMask[iy][ix]=PHOTON; - } - } else if (eventMask[iy][ix]==PEDESTAL) { - if (cm==0) { - if (det) - val=dataSign*det->getValue(data, ix, iy); - else - val=((double**)data)[iy][ix]; - addToPedestal(val,ix,iy); - } - } - - - - return eventMask[iy][ix]; - - }; - - - - -/** - Loops in the region of interest to find the clusters - \param data pointer to the data structure - \returns number of clusters found - - */ - -int *getClusters(char *data, int *ph=NULL) { - - - int nph=0; - double val[ny][nx]; - int cy=(clusterSizeY+1)/2; - int cs=(clusterSize+1)/2; - int ir, ic; - - double max=0, tl=0, tr=0, bl=0,br=0, *v, vv; - int cm=0; - if (cmSub) cm=1; - if (ph==NULL) - ph=image; - - if (iframerms=getPedestalRMS(ix,iy); - // cluster=clusters+nph; - - - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - - if ((iy+ir)>=iy && (iy+ir)=ix && (ix+ic)=0) - br+=*v; - if (ir>=0 && ic<=0) - tl+=*v; - if (ir>=0 && ic>=0) - tr+=*v; - if (*v>max) { - max=*v; - } - - - if (ir==0 && ic==0) { - if (*v<-nSigma*(clusters+nph)->rms) - eventMask[iy][ix]=NEGATIVE_PEDESTAL; - } - - } - } - - if (bl>=br && bl>=tl && bl>=tr) { - (clusters+nph)->quad=BOTTOM_LEFT; - (clusters+nph)->quadTot=bl; - } else if (br>=bl && br>=tl && br>=tr) { - (clusters+nph)->quad=BOTTOM_RIGHT; - (clusters+nph)->quadTot=br; - } else if (tl>=br && tl>=bl && tl>=tr) { - (clusters+nph)->quad=TOP_LEFT; - (clusters+nph)->quadTot=tl; - } else if (tr>=bl && tr>=tl && tr>=br) { - (clusters+nph)->quad=TOP_RIGHT; - (clusters+nph)->quadTot=tr; - } - - if (max>nSigma*(clusters+nph)->rms || tot>sqrt(clusterSizeY*clusterSize)*nSigma*(clusters+nph)->rms || ((clusters+nph)->quadTot)>sqrt(cy*cs)*nSigma*(clusters+nph)->rms) { - if (val[iy][ix]>=max) { - eventMask[iy][ix]=PHOTON_MAX; - (clusters+nph)->tot=tot; - (clusters+nph)->x=ix; - (clusters+nph)->y=iy; - (clusters+nph)->iframe=det->getFrameNumber(data); - (clusters+nph)->ped=getPedestal(ix,iy,0); - for (int ir=-(clusterSizeY/2); ir<(clusterSizeY/2)+1; ir++) { - for (int ic=-(clusterSize/2); ic<(clusterSize/2)+1; ic++) { - (clusters+nph)->set_data(val[iy+ir][ix+ic],ic,ir); - } - } - // cout << (clusters+nph)->iframe << " " << ix << " " << nph << " " << tot << " " << (clusters+nph)->quadTot << endl; - nph++; - image[iy*nx+ix]++; - - } else { - eventMask[iy][ix]=PHOTON; - } - } else if (eventMask[iy][ix]==PEDESTAL) { - addToPedestal(data,ix,iy,cm); - } - - - } - } - nphFrame=nph; - nphTot+=nph; - //cout << nphFrame << endl; - // cout <<"**********************************"<< endl; - writeClusters(); - return image; - -}; - - - /**< - returns the total signal in a cluster - \param size cluser size should be 1,2 or 3 - \returns cluster center if size=1, sum of the maximum quadrant if size=2, total of the cluster if size=3 or anything else - */ - - double getClusterTotal(int size) { - switch (size) { - case 1: - return getClusterElement(0,0); - case 2: - return quadTot; - default: - return tot; - }; - }; - - /**< - retrurns the quadrant with maximum signal - \returns quadrant where the cluster is located */ - - quadrant getQuadrant() {return quad;}; - - - /** returns value for cluster element in relative coordinates - \param ic x coordinate (center is (0,0)) - \param ir y coordinate (center is (0,0)) - \returns cluster element - */ - double getClusterElement(int ic, int ir=0){return clusters->get_data(ic,ir);}; - - /** returns event mask for the given pixel - \param ic x coordinate (center is (0,0)) - \param ir y coordinate (center is (0,0)) - \returns event mask enum for the given pixel - */ - eventType getEventMask(int ic, int ir=0){return eventMask[ir][ic];}; - - -#ifdef MYROOT1 - /** generates a tree and maps the branches - \param tname name for the tree - \param iFrame pointer to the frame number - \returns returns pointer to the TTree - */ - TTree *initEventTree(char *tname, int *iFrame=NULL) { - TTree* tall=new TTree(tname,tname); - - if (iFrame) - tall->Branch("iFrame",iFrame,"iframe/I"); - else - tall->Branch("iFrame",&(clusters->iframe),"iframe/I"); - - tall->Branch("x",&(clusters->x),"x/I"); - tall->Branch("y",&(clusters->y),"y/I"); - char tit[100]; - sprintf(tit,"data[%d]/D",clusterSize*clusterSizeY); - tall->Branch("data",clusters->data,tit); - tall->Branch("pedestal",&(clusters->ped),"pedestal/D"); - tall->Branch("rms",&(clusters->rms),"rms/D"); - tall->Branch("tot",&(clusters->tot),"tot/D"); - tall->Branch("quadTot",&(clusters->quadTot),"quadTot/D"); - tall->Branch("quad",&(clusters->quad),"quad/I"); - return tall; - }; -#else -/** write cluster to filer - \param f file pointer -*/ - void writeCluster(FILE* f){clusters->write(f);}; - -/** - write clusters to file - \param f file pointer - \param clusters array of clusters structures - \param nph number of clusters to be written to file - -*/ - -static void writeClusters(FILE *f, single_photon_hit *clusters, int nph){for (int i=0; iwrite(f);}; -void writeClusters(FILE *f){for (int i=0; iwrite(f);}; - void writeClusters(){if (myFile) { - //cout << "++" << endl; - pthread_mutex_lock(fm); - for (int i=0; iwrite(myFile); - pthread_mutex_unlock(fm); - //cout << "--" << endl; - } - }; -#endif - - virtual void processData(char *data, int *val=NULL) { - // cout << "sp" << endl; - switch(fMode) { - case ePedestal: - addToPedestal(data); - break; - default: - getNPhotons(data,val); - } - iframe++; - // cout << "done" << endl; - }; - int getPhFrame(){return nphFrame;}; - int getPhTot(){return nphTot;}; - protected: - - int nDark; /**< number of frames to be used at the beginning of the dataset to calculate pedestal without applying photon discrimination */ - eventType **eventMask; /**< matrix of event type or each pixel */ - double nSigma; /**< number of sigma parameter for photon discrimination */ - int clusterSize; /**< cluster size in the x direction */ - int clusterSizeY; /**< cluster size in the y direction i.e. 1 for strips, clusterSize for pixels */ - // single_photon_hit *cluster; /**< single photon hit data structure */ - single_photon_hit *clusters; /**< single photon hit data structure */ - quadrant quad; /**< quadrant where the photon is located */ - double tot; /**< sum of the 3x3 cluster */ - double quadTot; /**< sum of the maximum 2x2cluster */ - int nphTot; - int nphFrame; - - - }; - - - - - -#endif diff --git a/slsDetectorCalibration/single_photon_hit.h b/slsDetectorCalibration/single_photon_hit.h deleted file mode 100644 index 696868b87..000000000 --- a/slsDetectorCalibration/single_photon_hit.h +++ /dev/null @@ -1,94 +0,0 @@ -#ifndef SINGLE_PHOTON_HIT_H -#define SINGLE_PHOTON_HIT_H -#include -#include - -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; - -#ifndef DEF_QUAD -#define DEF_QUAD - enum quadrant { - TOP_LEFT=0, - TOP_RIGHT=1, - BOTTOM_LEFT=2, - BOTTOM_RIGHT=3, - UNDEFINED_QUADRANT=-1 - }; -#endif - - -class single_photon_hit { - - /** @short Structure for a single photon hit */ - - public: - /** constructor, instantiates the data array -- all class elements are public! - \param nx cluster size in x direction - \param ny cluster size in y direction (defaults to 1 for 1D detectors) - */ - single_photon_hit(int nx=3, int ny=3): dx(nx), dy(ny) {data=new int[dx*dy];}; - - ~single_photon_hit(){delete [] data;}; /**< destructor, deletes the data array */ - - /** binary write to file of all elements of the structure, except size of the cluster - \param myFile file descriptor - */ - size_t write(FILE *myFile) { - //fwrite((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); - - if (fwrite((void*)this, 1, sizeof(int)+2*sizeof(int16_t), myFile)) - return fwrite((void*)data, 1, dx*dy*sizeof(int), myFile); - return 0; - }; - - /** - binary read from file of all elements of the structure, except size of the cluster. The structure is then filled with those args - \param myFile file descriptor - */ - size_t read(FILE *myFile) { - //fread((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); - - if (fread((void*)this, 1, sizeof(int)+2*sizeof(int16_t), myFile)) - return fread((void*)data, 1, dx*dy*sizeof(int), myFile); - return 0; - }; - - /** - assign the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) - \param v value to be set - \param ix coordinate x within the cluster (center is (0,0)) - \param iy coordinate y within the cluster (center is (0,0)) - */ - void set_data(double v, int ix, int iy=0){data[(iy+dy/2)*dx+ix+dx/2]=v;}; - - void set_cluster_size(int nx, int ny) {if (nx>0) dx=nx; if (ny>0) dy=ny; delete [] data; data=new int[dx*dy];}; - void get_cluster_size(int &nx, int &ny) {nx=dx; ny=dy;}; - void get_pixel(int &x1, int &y1) {x1=x; y1=y;}; - - /** - gets the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) - \param ix coordinate x within the cluster (center is (0,0)) - \param iy coordinate y within the cluster (center is (0,0)) - \returns value of the cluster element - */ - double get_data(int ix, int iy=0){return data[(iy+dy/2)*dx+ix+dx/2];}; - int *get_cluster() {return data;}; - - int iframe; /**< frame number */ - int16_t x; /**< x-coordinate of the center of hit */ - int16_t y; /**< x-coordinate of the center of hit */ - double rms; /**< noise of central pixel l -- at some point it can be removed*/ - double ped; /**< pedestal of the central pixel -- at some point it can be removed*/ - double tot; /**< sum of the 3x3 cluster */ - quadrant quad; /**< quadrant where the photon is located */ - double quadTot; /**< sum of the maximum 2x2cluster */ - int dx; /**< size of data cluster in x */ - int dy; /**< size of data cluster in y */ - int *data; /**< pointer to data */ -}; - - - -#endif diff --git a/slsDetectorCalibration/single_photon_hit_double.h b/slsDetectorCalibration/single_photon_hit_double.h deleted file mode 100644 index 7019b4149..000000000 --- a/slsDetectorCalibration/single_photon_hit_double.h +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef SINGLE_PHOTON_HIT_H -#define SINGLE_PHOTON_HIT_H -#include -#include - -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; - -#ifndef DEF_QUAD -#define DEF_QUAD - enum quadrant { - TOP_LEFT=0, - TOP_RIGHT=1, - BOTTOM_LEFT=2, - BOTTOM_RIGHT=3, - UNDEFINED_QUADRANT=-1 - }; -#endif - - -class single_photon_hit_double { - - /** @short Structure for a single photon hit */ - - public: - /** constructor, instantiates the data array -- all class elements are public! - \param nx cluster size in x direction - \param ny cluster size in y direction (defaults to 1 for 1D detectors) - */ - single_photon_hit_double(int nx=3, int ny=3): dx(nx), dy(ny) { - data=new double[dx*dy]; - }; - - ~single_photon_hit_double(){delete [] data;}; /**< destructor, deletes the data array */ - - /** binary write to file of all elements of the structure, except size of the cluster - \param myFile file descriptor - */ - size_t write(FILE *myFile) { - //fwrite((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); - if (fwrite((void*)this, 1, sizeof(int)+2*sizeof(int), myFile)) - return fwrite((void*)data, 1, dx*dy*sizeof(double), myFile); - return 0; - }; - - /** - binary read from file of all elements of the structure, except size of the cluster. The structure is then filled with those args - \param myFile file descriptor - */ - size_t read(FILE *myFile) { - //fread((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); - - if (fread((void*)this, 1, sizeof(int)+2*sizeof(int), myFile)) - return fread((void*)data, 1, dx*dy*sizeof(double), myFile); - return 0; - }; - - /** - assign the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) - \param v value to be set - \param ix coordinate x within the cluster (center is (0,0)) - \param iy coordinate y within the cluster (center is (0,0)) - */ - void set_data(double v, int ix, int iy=0){data[(iy+dy/2)*dx+ix+dx/2]=v;}; - - void set_cluster_size(int nx, int ny) { - - if (nx>0) dx=nx; if (ny>0) dy=ny; delete [] data; data=new double[dx*dy]; - }; - void get_cluster_size(int &nx, int &ny) {nx=dx; ny=dy;}; - void get_pixel(int &x1, int &y1) {x1=x; y1=y;}; - - /** - gets the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) - \param ix coordinate x within the cluster (center is (0,0)) - \param iy coordinate y within the cluster (center is (0,0)) - \returns value of the cluster element - */ - double get_data(int ix, int iy=0){return data[(iy+dy/2)*dx+ix+dx/2];}; - double *get_cluster() {return data;}; - - int iframe; /**< frame number */ - int x; /**< x-coordinate of the center of hit */ - int y; /**< x-coordinate of the center of hit */ - double rms; /**< noise of central pixel l -- at some point it can be removed*/ - double ped; /**< pedestal of the central pixel -- at some point it can be removed*/ - double tot; /**< sum of the 3x3 cluster */ - quadrant quad; /**< quadrant where the photon is located */ - double quadTot; /**< sum of the maximum 2x2cluster */ - int dx; /**< size of data cluster in x */ - int dy; /**< size of data cluster in y */ - double *data; /**< pointer to data */ -}; - - - -#endif diff --git a/slsDetectorCalibration/single_photon_hit_old.h b/slsDetectorCalibration/single_photon_hit_old.h deleted file mode 100644 index 587a09c1f..000000000 --- a/slsDetectorCalibration/single_photon_hit_old.h +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef SINGLE_PHOTON_HIT_H -#define SINGLE_PHOTON_HIT_H -#include -#include - -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; - -#ifndef DEF_QUAD -#define DEF_QUAD - enum quadrant { - TOP_LEFT=0, - TOP_RIGHT=1, - BOTTOM_LEFT=2, - BOTTOM_RIGHT=3, - UNDEFINED_QUADRANT=-1 - }; -#endif - - -class single_photon_hit { - - /** @short Structure for a single photon hit */ - - public: - /** constructor, instantiates the data array -- all class elements are public! - \param nx cluster size in x direction - \param ny cluster size in y direction (defaults to 1 for 1D detectors) - */ - single_photon_hit(int nx=3, int ny=3): dx(nx), dy(ny) {data=new int[dx*dy];}; - - ~single_photon_hit(){delete [] data;}; /**< destructor, deletes the data array */ - - /** binary write to file of all elements of the structure, except size of the cluster - \param myFile file descriptor - */ - size_t write(FILE *myFile) { - //fwrite((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); - if (fwrite((void*)this, 1, sizeof(int)+2*sizeof(int16_t), myFile)) - return fwrite((void*)data, 1, dx*dy*sizeof(int), myFile); - return 0; - }; - - /** - binary read from file of all elements of the structure, except size of the cluster. The structure is then filled with those args - \param myFile file descriptor - */ - size_t read(FILE *myFile) { - //fread((void*)this, 1, 3*sizeof(int)+4*sizeof(double)+sizeof(quad), myFile); - - if (fread((void*)this, 1, sizeof(int)+2*sizeof(int16_t), myFile)) - return fread((void*)data, 1, dx*dy*sizeof(int), myFile); - return 0; - }; - - /** - assign the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) - \param v value to be set - \param ix coordinate x within the cluster (center is (0,0)) - \param iy coordinate y within the cluster (center is (0,0)) - */ - void set_data(double v, int ix, int iy=0){data[(iy+dy/2)*dx+ix+dx/2]=v;}; - - void set_cluster_size(int nx, int ny) {if (nx>0) dx=nx; if (ny>0) dy=ny; delete [] data; data=new int[dx*dy];}; - void get_cluster_size(int &nx, int &ny) {nx=dx; ny=dy;}; - void get_pixel(int &x1, int &y1) {x1=x; y1=y;}; - - /** - gets the value to the element of the cluster matrix, with relative coordinates where the center of the cluster is (0,0) - \param ix coordinate x within the cluster (center is (0,0)) - \param iy coordinate y within the cluster (center is (0,0)) - \returns value of the cluster element - */ - double get_data(int ix, int iy=0){return data[(iy+dy/2)*dx+ix+dx/2];}; - int *get_cluster() {return data;}; - - int iframe; /**< frame number */ - int16_t x; /**< x-coordinate of the center of hit */ - int16_t y; /**< x-coordinate of the center of hit */ - double rms; /**< noise of central pixel l -- at some point it can be removed*/ - double ped; /**< pedestal of the central pixel -- at some point it can be removed*/ - double tot; /**< sum of the 3x3 cluster */ - quadrant quad; /**< quadrant where the photon is located */ - double quadTot; /**< sum of the maximum 2x2cluster */ - int dx; /**< size of data cluster in x */ - int dy; /**< size of data cluster in y */ - int *data; /**< pointer to data */ -}; - - - -#endif diff --git a/slsDetectorCalibration/slsDetectorCalibration.doxy b/slsDetectorCalibration/slsDetectorCalibration.doxy deleted file mode 100644 index 4ea3784d3..000000000 --- a/slsDetectorCalibration/slsDetectorCalibration.doxy +++ /dev/null @@ -1,103 +0,0 @@ -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - - - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = YES - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -INTERNAL_DOCS = NO - -SHOW_INCLUDE_FILES = NO - -SHOW_FILES = NO - -SHOW_NAMESPACES = NO - -COMPACT_LATEX = YES - -PAPER_TYPE = a4 - -PDF_HYPERLINKS = YES - -USE_PDFLATEX = YES - -LATEX_HIDE_INDICES = YES - -PREDEFINED = __cplusplus - -INPUT = analogDetector.h \ - pedestalSubtraction.h \ - MovingStat.h \ - singlePhotonDetector.h \ - interpolatingDetector.h tiffIO.h \ - single_photon_hit.h \ - dataStructures/slsDetectorData.h \ - commonModeSubtraction.h \ - RunningStat.h \ - interpolations/etaInterpolationBase.h \ - interpolations/slsInterpolation.h \ - interpolations/etaInterpolationPosXY.h \ - interpolations/linearInterpolation.h \ - interpolations/noInterpolation.h \ - interpolations/etaInterpolationGlobal.h \ - multiThreadedAnalogDetector.h - - -OUTPUT_DIRECTORY = slsDetectorCalibrationDocs - -#moench03Ctb10GbT1Data.h moench03TCtbData.h moench03T1CtbData.h moench03CtbData.h moench03Ctb10GbData.h moench03TCtb10GbData.h Mythen3_01_jctbData.h adcSar2_jctbData.h eigerHalfModuleData.h energyCalibration.h slsReceiverData.h gotthardModuleData.h gotthardShortModuleData.h jungfrau02Data.h jungfrau10ModuleData.h moench02Ctb10GbData.h moench02CtbData.h moench02ModuleData.h moench03CommonMode.h moenchCommonMode.h chiptestBoardData.h interpolation/etaVEL/interpolation_EtaVEL.h interpolation/etaVEL/EtaVEL.h etaVEL/iterativeEtaInterpolation.h dataStructures/moench03T1ZmqData.h \ No newline at end of file diff --git a/slsDetectorCalibration/slsDetectorData.h b/slsDetectorCalibration/slsDetectorData.h deleted file mode 100644 index 16b1c9767..000000000 --- a/slsDetectorCalibration/slsDetectorData.h +++ /dev/null @@ -1,340 +0,0 @@ -#ifndef SLSDETECTORDATA_H -#define SLSDETECTORDATA_H - -#include -#include -#include - -using namespace std; - - -template -class slsDetectorData { - - protected: - const int nx; /**< Number of pixels in the x direction */ - const int ny; /**< Number of pixels in the y direction */ - int dataSize; /**=0 && ix=0 && iy=0 && ix=0 && iydataSize) dsize=dataSize; - for (int ip=0; ip<(dsize/sizeof(dataType)); ip++) { - getPixel(ip,ix,iy); - if (ix>=0 && ix=0 && iydataSize) dsize=dataSize; - for (int ip=0; ip<(dsize/sizeof(dataType)); ip++) { - getPixel(ip,ix,iy); - if (ix>=0 && ix=0 && iy=0 && ix=0 && iy=0 && dataMap[iy][ix] -#include // exit() -template -class slsReceiverData : public slsDetectorData { - - -public: - - /** - slsReceiver data structure. Works for data acquired using the slsDetectorReceiver subdivided in different packets with headers and footers. - Inherits and implements slsDetectorData. - - Constructor (no error checking if datasize and offsets are compatible!) - \param npx number of pixels in the x direction - \param npy number of pixels in the y direction (1 for strips) - \param np number of packets - \param psize packets size - \param dMap array of size nx*ny storing the pointers to the data in the dataset (as offset) - \param dMask Array of size nx*ny storing the polarity of the data in the dataset (should be 0 if no inversion is required, 0xffffffff is inversion is required) - \param dROI Array of size nx*ny. The elements are 1s if the channel is good or in the ROI, 0 is bad or out of the ROI. NULL (default) means all 1s. - - */ - slsReceiverData(int npx, int npy, int np, int psize, int **dMap=NULL, dataType **dMask=NULL, int **dROI=NULL): slsDetectorData(npx, npy, np*psize, dMap, dMask, dROI), nPackets(np), packetSize(psize) {}; - - - /** - - Returns the frame number for the given dataset. Virtual func: works for slsDetectorReceiver data (also for each packet), but can be overloaded. - \param buff pointer to the dataset - \returns frame number - - */ - - virtual int getFrameNumber(char *buff){return ((*(int*)buff)&(0xffffff00))>>8;}; - - /** - - Returns the packet number for the given dataset. Virtual func: works for slsDetectorReceiver packets, but can be overloaded. - \param buff pointer to the dataset - \returns packet number number - - */ - - virtual int getPacketNumber(char *buff){return (*(int*)buff)&0xff;}; - - - - /** - - Loops over a memory slot until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! - \param data pointer to the memory to be analyzed - \param ndata size of frame returned - \param dsize size of the memory slot to be analyzed - \returns pointer to the first packet of the last good frame (might be incomplete if npackets lower than the number of packets), or NULL if no frame is found - - */ - - virtual char *findNextFrame(char *data, int &ndata, int dsize) { - char *retval=NULL, *p=data; - int dd=0; - int fn, fnum=-1, np=0, pnum=-1; - while (dd<=(dsize-packetSize)) { - pnum=getPacketNumber(p); - fn=getFrameNumber(p); - //cout <<"fnum:"<nPackets) { - //cout << "Bad packet number " << pnum << " frame "<< fn << endl; - retval=NULL; - np=0; - } else if (pnum==1) { - retval=p; - if (np>0) - /*cout << "*Incomplete frame number " << fnum << endl;*/ - np=0; - fnum=fn; - } else if (fn!=fnum) { - if (fnum!=-1) { - /* cout << " **Incomplete frame number " << fnum << " pnum " << pnum << " " << getFrameNumber(p) << endl;*/ - retval=NULL; - } - np=0; - } - p+=packetSize; - dd+=packetSize; - np++; - //cout <<"fnum:"<0){ - //cprintf(BG_RED, "Too few packets for this frame! fnum:%d, pnum:%d np:%d\n",fnum,pnum,np); - cout << "Too few packets for this frame! "<< fnum << " " << pnum << " " << np <nPackets) { - cout << "too many packets!!!!!!!!!!" << endl; - delete [] data; - return NULL; - } else if (retval!=NULL) { - // cout << "+" << endl;; - for (int ip=0; ipnPackets) { - cout << "*******too many packets!!!!!!!!!!" << endl; - delete [] data; - return NULL; - } else { - // cout << "." << endl;; - np++; - } - } - } - delete [] data; - return NULL; - }; - - - /** - - Loops over a file stream until a complete frame is found (i.e. all packets 0 to nPackets, same frame number). Can be overloaded for different kind of detectors! - \param filebin input file stream (binary) - \param fnum frame number of frame returned - \returns pointer to the first packet of the last good frame, NULL if no frame is found or last frame is incomplete - - */ - - virtual char *readNextFrame(ifstream &filebin, int& fnum) { - char *data=new char[packetSize*nPackets]; - char *retval=0; - int np=0, nd; - fnum = -1; - - if (filebin.is_open()) { - while (filebin.read(data+np*packetSize,packetSize)) { - - if (np==(nPackets-1)) { - - fnum=getFrameNumber(data); //cout << "fnum:"<nPackets) { - cout << "too many packets!!!!!!!!!!" << endl; - delete [] data; - return NULL; - } else if (retval!=NULL) { - // cout << "+" << endl;; - for (int ip=0; ipnPackets) { - cout << "*******too many packets!!!!!!!!!!" << endl; - delete [] data; - return NULL; - } else { - // cout << "." << endl;; - np++; - //cout<<"np:"< -using namespace std; -// #undef cbf_failnez -// #define cbf_failnez(x) \ -// { \ -// int err; \ -// err = (x); \ -// if (err) { \ -// fprintf(stderr,"\nCBFlib fatal error %x \n",err); \ -// exit(-1); \ -// } \ -// } - -void *WriteToTiff(float * imgData, const char * imgname, int nrow, int ncol){ - int sampleperpixel=1; - // unsigned char * buff=NULL; - tsize_t linebytes; - cout << "--" < -#include -#include -#include -#include -#include -#include - - -/*****************************************************************************/ -// -//CBFlib must be installed to use this program -// -/*****************************************************************************/ -#include "tiffio.h" - -#undef cbf_failnez -#define cbf_failnez(x) \ - { \ - int err; \ - err = (x); \ - if (err) { \ - fprintf(stderr,"\nCBFlib fatal error %x \n",err); \ - exit(-1); \ - } \ - } - -void *WriteToTiff(float * imgData, const char * imgname, int nrow, int ncol); - -float *ReadFromTiff( const char * imgname, uint32 &nrow, uint32 &ncol); - -#endif diff --git a/slsDetectorGui/.gitignore b/slsDetectorGui/.gitignore deleted file mode 100644 index 509e7b512..000000000 --- a/slsDetectorGui/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -Makefile.gui -forms/include/ -mocs/ -objs/ -qrc_icons.cpp -.project diff --git a/slsDetectorGui/CMakeLists.txt b/slsDetectorGui/CMakeLists.txt deleted file mode 100644 index bad299e19..000000000 --- a/slsDetectorGui/CMakeLists.txt +++ /dev/null @@ -1,133 +0,0 @@ - -set(CMAKE_AUTOMOC ON) - -set(SOURCES - slsDetectorPlotting/src/SlsQt1DPlot.cxx - slsDetectorPlotting/src/SlsQt1DZoomer.cxx - slsDetectorPlotting/src/SlsQt2DHist.cxx - slsDetectorPlotting/src/SlsQt2DPlot.cxx - slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx - slsDetectorPlotting/src/SlsQtNumberEntry.cxx - src/qDetectorMain.cpp - src/qDrawPlot.cpp - src/qCloneWidget.cpp - src/qTabMeasurement.cpp - src/qTabDataOutput.cpp - src/qTabPlot.cpp - src/qTabActions.cpp - src/qActionsWidget.cpp - src/qScanWidget.cpp - src/qTabAdvanced.cpp - src/qTabSettings.cpp - src/qTabDebugging.cpp - src/qTabDeveloper.cpp - src/qTabMessages.cpp - src/qServer.cpp -) - -set(FORMS - forms/form_detectormain.ui - forms/form_tab_measurement.ui - forms/form_tab_dataoutput.ui - forms/form_tab_plot.ui - forms/form_tab_advanced.ui - forms/form_tab_settings.ui - forms/form_tab_debugging.ui - forms/form_action.ui - forms/form_scan.ui -) - -qt4_wrap_ui(FORMS_H ${FORMS}) - -set(HEADERS - slsDetectorPlotting/include/SlsQt1DPlot.h - slsDetectorPlotting/include/SlsQt1DZoomer.h - slsDetectorPlotting/include/SlsQt2DHist.h - slsDetectorPlotting/include/SlsQt2DPlot.h - slsDetectorPlotting/include/SlsQt2DPlotLayout.h - slsDetectorPlotting/include/SlsQt2DZoomer.h - slsDetectorPlotting/include/SlsQtValidators.h - slsDetectorPlotting/include/SlsQtNumberEntry.h - include/qDefs.h - include/qDebugStream.h - include/qDetectorMain.h - include/qDrawPlot.h - include/qCloneWidget.h - include/qTabMeasurement.h - include/qTabDataOutput.h - include/qTabPlot.h - include/qTabActions.h - include/qActionsWidget.h - include/qScanWidget.h - include/qTabAdvanced.h - include/qTabSettings.h - include/qTabDebugging.h - include/qTabDeveloper.h - include/qTabMessages.h - include/gitInfoGui.h - include/qServer.h -) -set(RESOURCES - include/icons.qrc -) -qt4_add_resources(RESOURCES_SRCS ${RESOURCES}) - -include_directories( - include - slsDetectorPlotting/include - ../slsDetectorSoftware/commonFiles - ../slsDetectorSoftware/slsReceiverInterface - ../slsDetectorSoftware/slsDetector - ../slsDetectorSoftware/slsDetectorAnalysis - ../slsDetectorSoftware/multiSlsDetector - ../slsDetectorSoftware/usersFunctions - ../slsReceiverSoftware/include - ${QT_INCLUDE_DIR} - ${QT_QTCORE_INCLUDE_DIR} - ${QT_QTGUI_INCLUDE_DIR} - ${QWT_INCLUDE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} -) - -add_definitions( - -DDACS_INT -DVERBOSE -DPRINT_LOG -) - -add_executable(slsDetectorGui - ${SOURCES} - ${HEADERS} - ${FORMS_H} - ${RESOURCES_SRCS} -) - -set_target_properties(slsDetectorGui PROPERTIES - LINKER_LANGUAGE CXX - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) - - -target_link_libraries(slsDetectorGui - slsDetectorShared - ${QT_QTCORE_LIBRARIES} - ${QT_QTGUI_LIBRARIES} - ${QWT_LIBRARIES} - pthread - zmq - rt - png - z - Qt4::QtOpenGL - Qt4::QtSvg - -) - -add_executable(gui_client - client/qClient.h - client/qClient.cpp -) -set_target_properties(gui_client PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) - -install(TARGETS slsDetectorGui gui_client - RUNTIME DESTINATION bin) diff --git a/slsDetectorGui/Makefile b/slsDetectorGui/Makefile deleted file mode 100644 index d91ea4f7d..000000000 --- a/slsDetectorGui/Makefile +++ /dev/null @@ -1,68 +0,0 @@ -# LEO: Won't compile without libSlsDetector - -include ../Makefile.include - -$(info ) -$(info ##################################) -$(info # In slsDetectorGui Makefile #) -$(info ##################################) -$(info ) - - -DESTDIR ?= ../bin -LIBDIR ?= ../bin -PROG = $(DESTDIR)/slsDetectorGui -DOCDIR ?= docs - -LIBRARYDIR ?= ../slsDetectorSoftware -LIBRARYRXRDIR ?= ../slsReceiverSoftware -INCLUDES ?= $(LIBRARYDIR)/commonFiles -I$(LIBRARYRXRDIR)/MySocketTCP -I$(LIBRARYDIR)/slsReceiverInterface -I$(LIBRARYDIR)/slsDetector -I$(LIBRARYDIR)/slsDetectorAnalysis -I$(LIBRARYDIR)/multiSlsDetector -I$(LIBRARYDIR)/usersFunctions -I$(LIBRARYRXRDIR)/includes - -LDFLAGDET ?= -L$(LIBDIR) -Wl,-rpath=$(LIBDIR) -lSlsDetector - - - -#ifeq ( $(EIGERSLS), yes) -# LDFLAG += $(EIGERFLAGS) -#else ifeq ( $(ROOTSLS), yes) -# LDFLAG += $(ROOTFLAGS) -#endif - -.PHONY: all lib clean mm doc htmldoc guiclient - - -all: lib Makefile.gui $(PROG) guiclient - -lib: - cd $(LIBRARYDIR) && $(MAKE) DESTDIR=$(DESTDIR) - @echo "" - @echo "#######################################" - @echo "# Back in slsDetectorGui Makefile #" - @echo "#######################################" - @echo "" - - -clean: - if test -e Makefile.gui; then $(MAKE) -f Makefile.gui clean; $(MAKE) -f Makefile.gui mocclean; rm Makefile.gui; rm $(DESTDIR)/slsDetectorGui; else $(MAKE) Makefile.gui; $(MAKE) -f Makefile.gui clean; $(MAKE) -f Makefile.gui mocclean; rm $(DESTDIR)/slsDetectorGui; fi - cd client && $(MAKE) clean -# cd manual && make clean - - -Makefile.gui: mm - -mm: - qmake -set QT_INSTALL_PREFIX $(QTDIR) && qmake -o Makefile.gui INCLUDES='$(INCLUDES)' DESTDIR=$(DESTDIR) SLSDETLIB=$(DESTDIR) SUBLIBS='$(LDFLAGDET)' LIBDIR='$(LIBDIR)' - -doc: - cd manual && $(MAKE) DESTDIR=$(DOCDIR) - -htmldoc: - cd manual && $(MAKE) html DESTDIR=$(DOCDIR) - -$(PROG): Makefile $(DIR) src/*.cpp include/*.h slsDetectorPlotting/include/*.h slsDetectorPlotting/src/*.cxx # forms/include/*.h - $(MAKE) -f Makefile.gui SLSDETLIB=$(DESTDIR) DESTDIR=$(DESTDIR) SUBLIBS='$(LDFLAGDET)' INCLUDES='$(INCLUDES)' LIBDIR='$(LIBDIR)' - -guiclient: -# echo $(WD) - cd client && $(MAKE) DESTDIR=$(DESTDIR) - diff --git a/slsDetectorGui/client/Makefile b/slsDetectorGui/client/Makefile deleted file mode 100644 index 60f412844..000000000 --- a/slsDetectorGui/client/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -CC = g++ -CLAGS += -DVERBOSE #VERYBOSE -LDLIBS += -lm -lstdc++ -pthread - -LDIR = ../../slsDetectorSoftware -RDIR = ../../slsReceiverSoftware -DDIR = ../../bin -INCLUDES = -I $(LDIR)/commonFiles -I $(LDIR)/slsDetector -I ../include -I $(RDIR)/include -SRC_CLNT = qClient.cpp $(RDIR)/src/MySocketTCP.cpp -DEPSINCLUDES= qClient.h $(RDIR)/include/MySocketTCP.h $(LDIR)/slsDetector/slsDetectorBase.h $(LDIR)/commonFiles/sls_detector_defs.h - - -all: client - -client: $(OBJS) $(DDIR)/gui_client - -OBJS = $(SRC_CLNT:%.cpp=%.o) - - -$(DDIR)/gui_client : $(SRC_CLNT) $(DEPSINCLUDES) Makefile - $(CXX) -o $@ -c $< $(INCLUDES) $(FLAGS) $(LDLIBS) - - - -clean: - rm -rf $(DDIR)/gui_client *.o - - - - - diff --git a/slsDetectorGui/client/qClient.cpp b/slsDetectorGui/client/qClient.cpp deleted file mode 100644 index f12ced4e1..000000000 --- a/slsDetectorGui/client/qClient.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - * qClient.cpp - * - * Created on: Feb 27, 2013 - * Author: Dhanya Maliakal - */ -// Qt Project Class Headers -#include "qClient.h" -// Project Class Headers -#include "MySocketTCP.h" -#include "slsDetectorBase.h" - -// C++ Include Headers -#include -#include -using namespace std; - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int main(int argc, char *argv[]){ - qClient* cl = 0; - try { - cl = new qClient(argv[1]); - } catch(...) { - return 0; - } - cl->executeLine(argc-2, argv+2); - delete cl; - - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qClient::qClient(char* hostname): - mySocket(0), - myStopSocket(0){ - - try { - // control socket - mySocket = new MySocketTCP(hostname, DEFAULT_GUI_PORTNO); - // stop socket - myStopSocket = new MySocketTCP(hostname, DEFAULT_GUI_PORTNO+1); - } catch(...) { - if (mySocket == 0) - cout << "Error: could not connect to control server:" << - hostname << " with port " << DEFAULT_GUI_PORTNO << endl; - else - cout << "Error: could not connect to stop server:" << - hostname << " with port " << DEFAULT_GUI_PORTNO + 1 << endl; - throw; - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qClient::~qClient() { - if(mySocket) delete mySocket; - if(myStopSocket) delete myStopSocket; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qClient::executeLine(int narg, char *args[]){ - - string retval = ""; - string cmd = args[0]; - string argument; - - - //validate command structure - if(narg<1){ - cout << "Error: no command parsed" << endl; - return FAIL; - } - - - //help - if (cmd == "help"){ - retval = printCommands(); - } - - //file name - else if (cmd == "status"){ - - if(narg>1){ - argument = args[1]; - //start acquisition - if(argument == "start") - startAcquisition(); - else if (argument == "stop") - stopAcquisition(); - else{ - cprintf(RED,"Error: could not parse arguments: %s\n", argument.c_str()); - printCommands(); - return FAIL; - } - } - retval = getStatus(); - } - - - else if (cmd == "acquire"){ - startAcquisition(true); - retval = getStatus(); - } - - - else if (cmd == "exit"){ - return exitServer(); - } - - - //unrecognized command - else{ - cout << "Error: unrecognized command" << endl; - return FAIL; - } - - - //print result - cout << cmd << ": " << retval << endl; - - return OK; -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -string qClient::printCommands(){ - ostringstream os; - os << "\nexit \t exits servers in gui" << std::endl; - os << "status \t gets status of acquisition in gui. - can be running or idle" << std::endl; - os << "status i starts/stops acquistion in gui-non blocking. i is start or stop" << std::endl; - os << "acquire starts acquistion in gui-blocking" << std::endl; - return os.str(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -string qClient::getStatus(){ - int fnum = F_GET_RUN_STATUS; - int ret = FAIL; - runStatus retval=ERROR; - int progress = 0; - char answer[100]; - - if (myStopSocket->Connect() >= 0) { - myStopSocket->SendDataOnly(&fnum,sizeof(fnum)); - myStopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - myStopSocket->ReceiveDataOnly(&retval,sizeof(retval)); - myStopSocket->ReceiveDataOnly(&progress,sizeof(progress)); - myStopSocket->Disconnect(); - }else - exit(-1); - - - sprintf(answer,"%d%% ",progress); - strcat(answer,slsDetectorBase::runStatusType((runStatus)retval).c_str()); - - return string(answer); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qClient::startAcquisition(bool blocking){ - int fnum = F_START_ACQUISITION; - if(blocking) fnum = F_START_AND_READ_ALL; - int ret = FAIL; - - if (mySocket->Connect() >= 0) { - mySocket->SendDataOnly(&fnum,sizeof(fnum)); - mySocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret == FAIL){ - mySocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Gui returned error: " << mess << std::endl; - } - mySocket->Disconnect(); - }else - exit(-1); - - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qClient::stopAcquisition(){ - int fnum = F_STOP_ACQUISITION; - int ret = FAIL; - - if (myStopSocket->Connect() >= 0) { - myStopSocket->SendDataOnly(&fnum,sizeof(fnum)); - myStopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - if (ret == FAIL){ - myStopSocket->ReceiveDataOnly(mess,sizeof(mess)); - std::cout<< "Gui returned error: " << mess << std::endl; - } - myStopSocket->Disconnect(); - }else - exit(-1); - - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qClient::exitServer(){ - int fnum = F_EXIT_SERVER; - int ret = FAIL; - - if (myStopSocket->Connect() >= 0) { - myStopSocket->SendDataOnly(&fnum,sizeof(fnum)); - myStopSocket->ReceiveDataOnly(&ret,sizeof(ret)); - myStopSocket->ReceiveDataOnly(mess,sizeof(mess)); - cout << mess << endl; - myStopSocket->Disconnect(); - }else - exit(-1); - - return ret; -} diff --git a/slsDetectorGui/client/qClient.h b/slsDetectorGui/client/qClient.h deleted file mode 100644 index fbec87a95..000000000 --- a/slsDetectorGui/client/qClient.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * qClient.h - * - * Created on: Feb 27, 2013 - * Author: Dhanya Maliakal - */ -#ifndef QCLIENT_H -#define QCLIENT_H - - -/** Qt Project Class Headers */ -/** Project Class Headers */ -class MySocketTCP; -#include "sls_detector_defs.h" -/** C++ Include Headers */ -#include -#include -using namespace std; - -/** - *@short Sets up the gui server - */ -class qClient: public virtual slsDetectorDefs{ - - -public: - /** \short The constructor*/ - qClient(char* hostname); - /** Destructor */ - virtual ~qClient(); - - /**Execute command*/ - int executeLine(int narg, char *args[]); - -private: - /** Print list of commands */ - string printCommands(); - - /** Start Acquisition - * @param blocking true if its a blocking acquistion - */ - int startAcquisition(bool blocking = false); - - /** Stops Acquisition */ - int stopAcquisition(); - - /** Gets run status */ - string getStatus(); - - /** Exits Server */ - int exitServer(); - - /** client socket */ - MySocketTCP *mySocket; - - /** client socket */ - MySocketTCP *myStopSocket; - - char mess[MAX_STR_LENGTH]; - -}; - - - -#endif /* QCLIENT_H */ diff --git a/slsDetectorGui/doxy.config b/slsDetectorGui/doxy.config deleted file mode 100644 index 877d4c456..000000000 --- a/slsDetectorGui/doxy.config +++ /dev/null @@ -1,106 +0,0 @@ -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = YES - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = YES - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = YES - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = YES - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespace are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -INPUT = \ - slsDetectorPlotting/include/SlsQt1DPlot.h\ - slsDetectorPlotting/src/SlsQt1DPlot.cxx - slsDetectorPlotting/include/SlsQt1DZoomer.h\ - slsDetectorPlotting/src/SlsQt1DZoomer.cxx\ - slsDetectorPlotting/include/SlsQt2DHist.h\ - slsDetectorPlotting/src/SlsQt2DHist.cxx\ - slsDetectorPlotting/include/SlsQt2DPlot.h\ - slsDetectorPlotting/src/SlsQt2DPlot.cxx\ - slsDetectorPlotting/include/SlsQt2DPlotLayout.h\ - slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx\ - slsDetectorPlotting/include/SlsQtNumberEntry.h\ - slsDetectorPlotting/src/SlsQtNumberEntry.cxx\ - slsDetectorPlotting/include/SlsQt2DZoomer.h\ - slsDetectorPlotting/include/SlsQtValidators.h\ - include/qDetectorMain.h\ - src/qDetectorMain.cpp\ - include/qDrawPlot.h\ - src/qDrawPlot.cpp\ - include/qCloneWidget.h\ - src/qCloneWidget.cpp\ - include/qTabMeasurement.h\ - src/qTabMeasurement.cpp\ - include/qTabDataOutput.h\ - src/qTabDataOutput.cpp\ - include/qTabPlot.h\ - src/qTabPlot.cpp\ - include/qTabActions.h\ - src/qTabActions.cpp\ - include/qActionsWidget.h\ - src/qActionsWidget.cpp\ - include/qScanWidget.h\ - src/qScanWidget.cpp\ - include/qTabAdvanced.h\ - src/qTabAdvanced.cpp\ - include/qTabSettings.h\ - src/qTabSettings.cpp\ - include/qTabDebugging.h\ - src/qTabDebugging.cpp\ - include/qTabDeveloper.h\ - src/qTabDeveloper.cpp\ - include/qDefs.h - - -OUTPUT_DIRECTORY = docs - diff --git a/slsDetectorGui/forms/form_action.ui b/slsDetectorGui/forms/form_action.ui deleted file mode 100644 index 33d93c35e..000000000 --- a/slsDetectorGui/forms/form_action.ui +++ /dev/null @@ -1,169 +0,0 @@ - - - ActionsObject - - - - 0 - 0 - 680 - 25 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - Form - - - - 0 - - - 0 - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - - None - - - - - Custom Script - - - - - - - - false - - - - - - - false - - - Additional Parameter: - - - - - - - false - - - Browse - - - - :/icons/images/browse.png:/icons/images/browse.png - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - false - - - - 0 - 0 - - - - - - - - - - - diff --git a/slsDetectorGui/forms/form_detectormain.ui b/slsDetectorGui/forms/form_detectormain.ui deleted file mode 100644 index 1cdc2001b..000000000 --- a/slsDetectorGui/forms/form_detectormain.ui +++ /dev/null @@ -1,521 +0,0 @@ - - - DetectorMainObject - - - true - - - - 0 - 0 - 800 - 848 - - - - - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - 0 - 0 - 0 - - - - - - - - - 185 - 185 - 185 - - - - - - - 185 - 185 - 185 - - - - - - - 185 - 185 - 185 - - - - - - - 89 - 89 - 89 - - - - - - - - - 9 - - - - SLS Detector GUI - - - Qt::ImhNone - - - false - - - QTabWidget::Rounded - - - false - - - - - 0 - 0 - - - - - 0 - 395 - - - - - 524287 - 395 - - - - - - - 0 - 0 - 800 - 25 - - - - - 0 - 0 - - - - - 0 - 25 - - - - - 16777215 - 25 - - - - - 9 - - - - Qt::StrongFocus - - - false - - - true - - - - - 9 - - - - &Utilities - - - - - - - - - - - - - - - - &Modes - - - - - - - - - &Help - - - - - - - - - - true - - - - 0 - 0 - - - - - 36 - 422 - - - - - 524287 - 524287 - - - - - Sans Serif - 11 - 50 - false - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;"> -<tr> -<td style="border: none;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#00007f;">Left Click :zoom in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#00007f;">Righ</span><span style=" color:#00007f;">t Click </span><span style=" color:#00007f;">: zoom out by 1</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#00007f;">Middle Click : panning</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#00007f;">Ctrl+Right Click : zoom out to full size</span></p></td></tr></table></body></html> - - - - - - Qt::LeftToRight - - - QDockWidget::NoDockWidgetFeatures - - - Qt::BottomDockWidgetArea - - - SLS Detector Plot - - - 8 - - - - - 0 - 0 - - - - - 0 - 400 - - - - - 16777215 - 16777215 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 119 - 119 - 119 - - - - - - - - - 9 - 50 - false - - - - - - - &Load &Setup - - - - - - - - &Save &Setup - - - - - - - - &Measurement Wizard - - - - - &Load &Configuration - - - - - &Save &Configuration - - - - - &Energy Calibration - - - - - &Angular Calibration - - - - - true - - - false - - - &Debug - - - - - true - - - false - - - &Beamline - - - - - true - - - false - - - &Expert - - - - - true - - - false - - - &Configuration - - - - - &Version - - - - - &About - - - - - true - - - D&ockable Windows - - - - - &Load &Trimbits - - - - - &Save &Trimbits - - - - - &Load C&alibration - - - - - &Save C&alibration - - - - - true - - - &Listen to Gui Client - - - - - - diff --git a/slsDetectorGui/forms/form_scan.ui b/slsDetectorGui/forms/form_scan.ui deleted file mode 100644 index bd00b8c6e..000000000 --- a/slsDetectorGui/forms/form_scan.ui +++ /dev/null @@ -1,488 +0,0 @@ - - - ScanObject - - - - 0 - 0 - 724 - 125 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - Form - - - - 0 - - - 5 - - - 0 - - - - - false - - - - 0 - 0 - - - - - 180 - 0 - - - - - - - - 0 - - - 5 - - - 0 - - - 2 - - - 0 - - - 5 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - <nobr> -Defines scan range for a <b>Constant Step Size</b> with the following constraints: -</nobr><br><nobr> -1. <b>Number of Steps</b> >=2. -</nobr><br><nobr> -2. <b>Size</b> not equal to 0. -</nobr><br><nobr> -3. <b>From</b> not equal to <b>To</b>. -</nobr><br> - - - Constant Step Size - - - true - - - - - - - <nobr>Measures only at specific values listed by the user.</nobr><br> -<nobr>Number of entries is restricted to <b>Number of Steps</b> field.</nobr> - - - Specific Values - - - false - - - - - - - - 0 - 0 - - - - <nobr>Measures only at the specific values listed in a file.</nobr><br> -<nobr>Select the file, where these values are listed.</nobr> - - - Values from File - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - - - - - - - - - - - - 0 - - - - - false - - - - 0 - 0 - - - - Precision: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - false - - - - 0 - 0 - - - - 0 - - - 10 - - - 0 - - - - - - - - - 0 - - - - - false - - - - 0 - 0 - - - - Additional Parameter: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - false - - - - 0 - 0 - - - - - - - - - - 0 - - - - - false - - - - 0 - 0 - - - - Number of Steps: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - false - - - - 0 - 0 - - - - false - - - 0 - - - 1000000 - - - 0 - - - - - - - - - - None - - - - - Energy Scan (eV) - - - - - Threshold Scan - - - - - Trimbits Scan - - - - - Position Scan - - - - - Custom Script - - - - - - - - 0 - - - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 5 - 20 - - - - - - - - false - - - Browse - - - - :/icons/images/browse.png:/icons/images/browse.png - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 30 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - comboScript - dispScript - btnBrowse - dispParameter - spinSteps - spinPrecision - radioRange - radioCustom - radioFile - - - - - - diff --git a/slsDetectorGui/forms/form_tab_advanced.ui b/slsDetectorGui/forms/form_tab_advanced.ui deleted file mode 100644 index 0e980a746..000000000 --- a/slsDetectorGui/forms/form_tab_advanced.ui +++ /dev/null @@ -1,2109 +0,0 @@ - - - TabAdvancedObject - - - - 0 - 0 - 775 - 351 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - Form - - - - :/icons/images/refresh.png:/icons/images/refresh.png - - - - - 5 - 3 - 761 - 343 - - - - - - - QTabWidget::North - - - 3 - - - Qt::ElideLeft - - - - Logs - - - - - 5 - 10 - 746 - 66 - - - - Calibration Logs - - - - - 25 - 20 - 345 - 31 - - - - - 42 - - - - - - 0 - 0 - - - - Energy Calibration - - - - - - - - 0 - 0 - - - - Angular Calibration - - - - - - - - - - Trimming - - - - - 5 - 10 - 495 - 66 - - - - Trimbits Plot - - - true - - - false - - - - - 230 - 15 - 259 - 44 - - - - - 17 - - - - - <nobr> -Updates plot with Trimbits from Shared Memory, not from Detector. -</nobr> - - - false - - - Refresh - - - - :/icons/images/refresh.png:/icons/images/refresh.png - - - - 24 - 16 - - - - - - - - <nobr> -Plots Trimbits from Detector. This will take time. -</nobr> - - - Get Trimbits - - - - :/icons/images/download.png:/icons/images/download.png - - - - - - - - - 25 - 20 - 211 - 31 - - - - - - - Data Graph - - - true - - - - - - - Histogram - - - - - - - - - true - - - - 5 - 85 - 746 - 226 - - - - Trimming - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - true - - - true - - - - - 25 - 25 - 696 - 208 - - - - - 12 - - - - - - 0 - 0 - - - - Trimming Method: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - - 0 - 0 - - - - Exposure Time: - - - - - - - true - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Exposure time of each frame. - #exptime# - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 1.000000000000000 - - - - - - - true - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 50 - 20 - - - - - - - - - 0 - 0 - - - - <nobr> -Trimfile to which the resulting trimbits will be written. -</nobr><br><nobr> -An extension given by the modules serial number will be attached. -</nobr> - - - Output Trim File: - - - - - - - <nobr> -Trimfile to which the resulting trimbits will be written. -</nobr><br><nobr> -An extension given by the modules serial number will be attached. -</nobr> - - - - - - - - 0 - 0 - - - - <nobr> -Trimfile to which the resulting trimbits will be written. -</nobr><br><nobr> -An extension given by the modules serial number will be attached. -</nobr> - - - Browse - - - - :/icons/images/browse.png:/icons/images/browse.png - - - - - - - 0 - - - - - - - - 0 - 0 - - - - Start Trimming - - - - :/icons/images/start.png:/icons/images/start.png - - - - - - - true - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Exposure time of each frame. - #exptime# - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 3 - - - -1.000000000000000 - - - 10000.000000000000000 - - - 560.000000000000000 - - - - - - - - 0 - 0 - - - - Sets the Threshold DAC - - - Threshold (DACu): - - - - - - - true - - - - 0 - 0 - - - - - 0 - 0 - - - - Optimize Settings - - - - - - - - 0 - 0 - - - - Resolution (a.u.): - - - - - - - - 0 - 0 - - - - Number of measurements (not in real time) that will be acquired. - #frames# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 1 - - - 9 - - - 4 - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - Adjust to Fix Count Level - - - - - Equalize to Median - - - - - - - - - 0 - 0 - - - - Counts/ Channel: - - - - - - - - 0 - 0 - - - - Number of measurements (not in real time) that will be acquired. - #frames# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 16000000 - - - 500 - - - - - - - - - false - - - - 518 - 10 - 233 - 66 - - - - Developer Option - - - false - - - false - - - - - 12 - 28 - 94 - 16 - - - - Set All trimbits: - - - - - - 121 - 24 - 86 - 25 - - - - -1 - - - 63 - - - - - - - Region of Interest - - - - - 10 - 50 - 736 - 246 - - - - QFrame::NoFrame - - - true - - - - - 0 - 0 - 736 - 246 - - - - - 1 - - - 15 - - - - - - - - 10 - 5 - 736 - 41 - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - Get ROI - - - - :/icons/images/download.png:/icons/images/download.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - Set ROI - - - - :/icons/images/upload.png:/icons/images/upload.png - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - Clear ROI - - - - :/icons/images/erase.png:/icons/images/erase.png - - - - - - - - - Network - - - - - 10 - 132 - 736 - 171 - - - - Receiver Parameters - - - - - 420 - 140 - 291 - 29 - - - - Setup Receiver - - - - :/icons/images/setup.png:/icons/images/setup.png - - - - - - 25 - 21 - 686 - 119 - - - - - 6 - - - - - - 0 - 0 - - - - TCP Port: - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the Receiver UDP IP -#rx_udpip# - - - none - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 127 - 0 - - - - Sets Receiver UDP Port -#rx_udpport# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 2000000000 - - - 0 - - - - - - - - 0 - 0 - - - - UDP IP: - - - - - - - - 0 - 0 - - - - Hostname / IP: - - - - - - - - 0 - 0 - - - - <nobr>If the receiver is online<br>#r_online#</nobr>< - - - - Offline - - - - - Online - - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the Receiver UDP MAC -#rx_udpmac# - - - none - - - - - - - - 0 - 0 - - - - - 127 - 0 - - - - Sets Receiver TCP Port -#rx_tcpport# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 2000000000 - - - 0 - - - - - - - - 0 - 0 - - - - Online: - - - - - - - - 0 - 0 - - - - UDP Port: - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the Receiver Hostname, connects to it and gets the receiver mac address and eth. Sets some receiver parameters like file name, file dir, file index in receiver. -#rx_hostname# - - - none - - - - - - - - 0 - 0 - - - - UDP MAC: - - - - - - - - 0 - 0 - - - - ZMQ Port: - - - - - - - - 0 - 0 - - - - - 127 - 0 - - - - Sets Receiver UDP Port -#rx_udpport# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 2000000000 - - - 0 - - - - - - - - 0 - 0 - - - - ZMQ IP: - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the Receiver UDP IP -#rx_udpip# - - - - - - - - - - - - - 35 - 10 - 686 - 123 - - - - - 6 - - - - - - 0 - 0 - - - - - 180 - 0 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - <nobr>If the detector is online<br>#online#</nobr>< - - - - Offline - - - - - Online - - - - - - - - - 0 - 0 - - - - Stop Port: - - - - - - - - 0 - 0 - - - - Control Port: - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the detector IP to send packets to receiver -#detectorip# - - - - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the detector MAC to send packets to receiver -#detectormac# - - - - - - - - - - - 0 - 0 - - - - MAC: - - - - - - - - 0 - 0 - - - - - 108 - 0 - - - - Online: - - - - - - - - 0 - 0 - - - - - 108 - 0 - - - - Detector: - - - - - - - - 0 - 0 - - - - IP: - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - - 16777215 - 16777215 - - - - Sets Control Port -#port# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 2000000000 - - - 0 - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets Stop Port -#stopport# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 2000000000 - - - 0 - - - - - - - - 0 - 0 - - - - ZMQ Port (GUI): - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets Stop Port -#stopport# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 0 - - - 2000000000 - - - 0 - - - - - - - - 0 - 0 - - - - Client ZMQ IP: - - - - - - - - 0 - 0 - - - - - 180 - 0 - - - - Sets the detector IP to send packets to receiver -#detectorip# - - - - - - - - - - - - Acquisition - - - - - 14 - 13 - 367 - 110 - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Exposure Time of a sub frame. Only for Eiger in 32 bit mode -</nobr><br><nobr> - #subexptime# -</nobr> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 1.000000000000000 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - false - - - <html><head/><body><p>Number of storage cells. For Jungfrau only. </p><p>Default: 0. </p><p>Number of Images received: #frames * #cycles * (#storagecells+1) </p><p> #storagecells#</p><p><br/></p></body></html> - - - Number of Storage cells: - - - - - - - false - - - <nobr> -Exposure Time of a sub frame. Only for Eiger in 32 bit mode -</nobr><br><nobr> - #subexptime# -</nobr> - - - Sub Frame Exposure Time: - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Exposure Time of a sub frame. Only for Eiger in 32 bit mode -</nobr><br><nobr> - #subexptime# -</nobr> - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - false - - - - 0 - 0 - - - - <html><head/><body><p>Number of storage cells. For Jungfrau only. </p><p>Default: 0. </p><p>Number of Images received: #frames * #cycles * (#storagecells+1) </p><p> #storagecells#</p><p><br/></p></body></html> - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - -1 - - - 15 - - - 0 - - - - - - - false - - - <nobr> -Dead time between sub frames. Only for Eiger in 32 bit mode. -</nobr><br><nobr> -Default value is 0. A value less than the required minimum is ignored. -</nobr><br><nobr> - #subdeadtime# -</nobr> - - - Sub Frame Dead Time: - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Period between sub frames. Only for Eiger in 32 bit mode. -</nobr><br><nobr> -Default value is 0. A value less than the required minimum is ignored. -</nobr><br><nobr> - #subperiod# -</nobr> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 1.000000000000000 - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Period between sub frames. Only for Eiger in 32 bit mode. -</nobr><br><nobr> -Default value is 0. A value less than the required minimum is ignored. -</nobr><br><nobr> - #subperiod# -</nobr> - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - - - - tabAdvancedSettings - chkEnergyLog - chkAngularLog - boxPlot - radioDataGraph - radioHistogram - btnRefresh - btnGetTrimbits - boxTrimming - comboMethod - chkOptimize - spinResolution - spinCounts - spinExpTime - comboExpUnit - spinThreshold - dispFile - btnFile - btnStart - btnGetRoi - btnSetRoi - btnClearRoi - scrollArea - comboDetector - comboOnline - spinControlPort - dispIP - spinStopPort - dispMAC - dispRxrHostname - comboRxrOnline - spinTCPPort - dispUDPIP - spinUDPPort - dispUDPMAC - btnRxr - - - - - - diff --git a/slsDetectorGui/forms/form_tab_dataoutput.ui b/slsDetectorGui/forms/form_tab_dataoutput.ui deleted file mode 100644 index 0ebfddfe9..000000000 --- a/slsDetectorGui/forms/form_tab_dataoutput.ui +++ /dev/null @@ -1,897 +0,0 @@ - - - TabDataOutputObject - - - - 0 - 0 - 775 - 345 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - Form - - - - - 15 - 170 - 746 - 170 - - - - Options - - - - - 17 - 21 - 192 - 137 - - - - - 6 - - - - - false - - - <nobr> -Compression using Root. Available only for Gotthard in Expert Mode. -</nobr><br><nobr> - #r_compression# -</nobr> - - - Unused - - - - - - - false - - - Angular Conversion - - - - - - - Discard Bad Channels - - - - - - - false - - - <nobr> -Compression using Root. Available only for Gotthard in Expert Mode. -</nobr><br><nobr> - #r_compression# -</nobr> - - - 10GbE - - - - - - - - - 255 - 21 - 476 - 76 - - - - - 6 - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - false - - - Rate: - - - - - - - false - - - - 0 - 0 - - - - Flat field corrections. - #flatfield# filename - - - Browse - - - - :/icons/images/browse.png:/icons/images/browse.png - - - - - - - false - - - Qt::ClickFocus - - - Flat field corrections. - #flatfield# filename - - - - - - - Flat field corrections. - #flatfield# filename - - - Flat Field File: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - false - - - - 0 - 0 - - - - - - - - - 2 - 2 - 2 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 119 - 119 - 119 - - - - - - - - <nobr> -Directory where one saves the data. -</nobr><br> - #outdir# -<br> - - - - Dead Time: - - - - - - - - 0 - 0 - - - - ns - - - -1 - - - 200000000 - - - - - - - false - - - - 0 - 0 - - - - - 16777215 - 30 - - - - <nobr> -Directory where one saves the data. -</nobr><br> - #outdir# -<br> - - - - Default - - - - :/icons/images/calculate.png:/icons/images/calculate.png - - - - - - - - - 230 - 21 - 20 - 134 - - - - QFrame::Raised - - - Qt::Vertical - - - - - - 244 - 92 - 491 - 72 - - - - - - 11 - 4 - 475 - 62 - - - - - - - - 200 - 16777215 - - - - - Continous - - - - - Store in RAM - - - - - - - - - 105 - 16777215 - - - - Clock Divider: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 200 - 16777215 - - - - - Full Speed - - - - - Half Speed - - - - - Quarter Speed - - - - - Super Slow Speed - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 105 - 16777215 - - - - Flags: - - - - - - - - Parallel - - - - - Non Parallel - - - - - Safe - - - - - - - - - - - - 20 - 40 - 735 - 100 - - - - File - - - - - 12 - 20 - 714 - 68 - - - - - 4 - - - - - - 0 - 0 - - - - <nobr> -Directory where one saves the data. -</nobr><br> - #outdir# -<br> -Disabled if a receiver is utilized in acquisition. -<br> - - - - Browse - - - - :/icons/images/browse.png:/icons/images/browse.png - - - - - - - - 0 - 0 - - - - - 105 - 0 - - - - <html><head/><body><p>File Format<br/>#fileformat# <br/></p></body></html> - - - - Binary - - - - - ASCII - - - - - HDF5 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - - 105 - 0 - - - - - - - - - 0 - 0 - - - - - 70 - 16777215 - - - - - - - - - 2 - 2 - 2 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 119 - 119 - 119 - - - - - - - - <nobr> -Directory where one saves the data. -</nobr><br> - #outdir# -<br> - - - - Path: - - - - - - - - 0 - 0 - - - - - 70 - 16777215 - - - - - - - - - 2 - 2 - 2 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 119 - 119 - 119 - - - - - - - - <html><head/><body><p>File Format<br/>#fileformat# <br/></p></body></html> - - - Format: - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Overwrite Enable - #overwrite# - - - Overwrite - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - - 75 - 16777215 - - - - - - - - - 2 - 2 - 2 - - - - - - - - - 0 - 0 - 0 - - - - - - - - - 119 - 119 - 119 - - - - - - - - <html><head/><body><p>Name of file. Can be modified in Measurement tab.<br/>#fname# <br/></p></body></html> - - - Name Prefix: - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::NoFocus - - - <html><head/><body><p>Name of file. Can be modified in Measurement tab.<br/>#fname# <br/></p></body></html> - - - false - - - QLineEdit::Normal - - - true - - - - - - - Qt::StrongFocus - - - <nobr> -Directory where one saves the data. -</nobr><br> - #outdir# -<br> - - - - - - - - - - chkFlatField - dispFlatField - btnFlatField - chkRate - - - - - - diff --git a/slsDetectorGui/forms/form_tab_debugging.ui b/slsDetectorGui/forms/form_tab_debugging.ui deleted file mode 100644 index e8ebcd632..000000000 --- a/slsDetectorGui/forms/form_tab_debugging.ui +++ /dev/null @@ -1,471 +0,0 @@ - - - TabDebuggingObject - - - - 0 - 0 - 775 - 345 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - Form - - - - - 45 - 75 - 686 - 231 - - - - Qt::NoFocus - - - Tests - - - - - 15 - 110 - 141 - 51 - - - - - - - Qt::NoFocus - - - Readout Firmware - - - - - - - Qt::NoFocus - - - Readout Software - - - - - - - - - 15 - 185 - 656 - 36 - - - - - - - - 0 - 0 - - - - Run Test - - - - :/icons/images/start.png:/icons/images/start.png - - - - - - - - - 415 - 30 - 256 - 31 - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 100 - 16777215 - - - - Module: - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - true - - - - All Modules - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - - 280 - 110 - 141 - 51 - - - - - - - Qt::NoFocus - - - Readout Bus - - - - - - - Qt::NoFocus - - - Readout Memory - - - - - - - - - 530 - 110 - 141 - 26 - - - - - - - Qt::NoFocus - - - Chip - - - - - - - - - 15 - 30 - 276 - 31 - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 150 - 16777215 - - - - Readout: - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - - 15 - 60 - 276 - 31 - - - - - - - - 0 - 0 - - - - - 150 - 16777215 - - - - Status: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - 0 - 0 - - - - IDLE - - - - - - - - - 530 - 135 - 141 - 26 - - - - - - - Qt::NoFocus - - - Module Firmware - - - - - - - - - 5 - 95 - 676 - 16 - - - - Qt::Horizontal - - - - - - 5 - 165 - 676 - 16 - - - - Qt::Horizontal - - - - - - - 45 - 25 - 686 - 31 - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Get ID Information - - - - :/icons/images/download.png:/icons/images/download.png - - - - - - - - btnGetInfo - comboDetector - comboModule - btnTest - - - - - - diff --git a/slsDetectorGui/forms/form_tab_measurement.ui b/slsDetectorGui/forms/form_tab_measurement.ui deleted file mode 100644 index f8a6853cf..000000000 --- a/slsDetectorGui/forms/form_tab_measurement.ui +++ /dev/null @@ -1,1084 +0,0 @@ - - - TabMeasurementObject - - - - 0 - 0 - 775 - 345 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 345 - - - - Form - - - - - 30 - 153 - 319 - 116 - - - - - 0 - 0 - - - - Progress Monitor - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - 10 - 75 - 300 - 23 - - - - 24 - - - - - - 10 - 25 - 91 - 16 - - - - Current Frame: - - - - - - 101 - 25 - 101 - 16 - - - - 0 - - - - - - 150 - 45 - 76 - 16 - - - - - 0 - 0 - - - - - 60 - 0 - - - - 0 - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - - - - 10 - 45 - 136 - 16 - - - - Current Measurement: - - - - - - - 390 - 8 - 362 - 342 - - - - QFrame::NoFrame - - - QFrame::Plain - - - - - 0 - 10 - 357 - 321 - - - - - - - false - - - Number of Triggers to be expected. - #cycles# - - - Number of Triggers: - - - - - - - false - - - - 0 - 0 - - - - Number of Triggers to be expected. - #cycles# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - -1 - - - 2000000000 - - - 1 - - - - - - - false - - - The Delay between Trigger Edge and Start of Exposure ( or Readout). -#delay# - - - Delay After Trigger: - - - - - - - false - - - - 0 - 0 - - - - The Delay between Trigger Edge and Start of Exposure ( or Readout). -#delay# - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 0.000000000000000 - - - - - - - false - - - - 0 - 0 - - - - The Delay between Trigger Edge and Start of Exposure ( or Readout). -#delay# - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - false - - - - 0 - 0 - - - - Number of Gate Signals per Frame. - #gates# - - - Number of Gates: - - - - - - - false - - - - 0 - 0 - - - - Number of Gate Signals per Frame. - #gates# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - -1 - - - 2000000000 - - - 1 - - - - - - - false - - - - 0 - 0 - - - - <nobr> -The data are accumulated over several (frames) pump cycles. -</nobr> -<br> -<nobr> -Enabled only in <b>Expert Mode</b> and if<b> Number of Frames</b> > 1. -</nobr> -<br> -<nobr>Setting <b>Number of Probes</b> will reset <b>Number of Triggers</b> to 1. -</nobr> -<br> -Maximum value is 3. <br> -#probes# - - - - Number of Probes: - - - - - - - false - - - - 0 - 0 - - - - <nobr> -The data are accumulated over several (frames) pump cycles. -</nobr> -<br> -<nobr> -Enabled only in <b>Expert Mode</b> and if<b> Number of Frames</b> > 1. -</nobr> -<br> -<nobr>Setting <b>Number of Probes</b> will reset <b>Number of Triggers</b> to 1. -</nobr> -<br> -Maximum value is 3. <br> -#probes# - - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - -1 - - - 3 - - - 1 - - - - - - - - 0 - 0 - - - - Timing Mode of the detector. - #timing# - - - - None - - - - - Auto - - - - - Trigger Exposure Series - - - - - Trigger Readout - - - - - Gated with Fixed Number - - - - - Gated with Start Trigger - - - - - Burst Trigger - - - - - - - - false - - - Number of Frames: - - - - - - - false - - - - 0 - 0 - - - - Number of measurements (not in real time) that will be acquired. - #frames# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - -1 - - - 2000000000 - - - 1 - - - - - - - true - - - <nobr> -Exposure Time of a frame. -</nobr><br><nobr> - #exptime# -</nobr> - - - Exposure Time: - - - - - - - true - - - - 0 - 0 - - - - <nobr> -Exposure Time of a frame. -</nobr><br><nobr> - #exptime# -</nobr> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 1.000000000000000 - - - - - - - true - - - - 0 - 0 - - - - <nobr> -Exposure Time of a frame. -</nobr><br><nobr> - #exptime# -</nobr> - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - false - - - <nobr> -Frame period between exposures. -</nobr><br><nobr> - #period# -</nobr> - - - Acquisition Period: - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Frame period between exposures. -</nobr><br><nobr> - #period# -</nobr> - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - 9 - - - -1.000000000000000 - - - 2000000000.000000000000000 - - - 0.000000000000000 - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Frame period between exposures. -</nobr><br><nobr> - #period# -</nobr> - - - Qt::LeftToRight - - - 2 - - - - hr - - - - - min - - - - - s - - - - - ms - - - - - us - - - - - ns - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - Timing Mode: - - - - - - - - - - 20 - 5 - 336 - 159 - - - - QFrame::NoFrame - - - QFrame::Plain - - - - - 10 - 13 - 321 - 130 - - - - - 6 - - - - - Number of Measurements: - - - - - - - - 0 - 0 - - - - Number of measurements (not in real time) that will be acquired. - #frames# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - 1 - - - 2000000000 - - - 1 - - - - - - - - 0 - 0 - - - - Root of the file name - please check that the output directory is correctly set and select the file name format. - #fname# - - - - - - - - - - Run Index: - - - - - - - - 0 - 0 - - - - Run index (automatically incremented) - #index# - - - - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - - -1 - - - 2000000000 - - - 0 - - - - - - - <nobr>Sets output file name prefix</nobr><br> -<nobr>Check the box to enable write to file. </nobr> - - - File Name: - - - true - - - - - - - - - - 30 - 298 - 318 - 31 - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Starts Acquisition - - - Start - - - - :/icons/images/start.png:/icons/images/start.png - - - Shift+Space - - - false - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - true - - - - 0 - 0 - - - - - 70 - 16777215 - - - - Qt::NoFocus - - - Stops Acquisition - - - Stop - - - - :/icons/images/stop.png:/icons/images/stop.png - - - false - - - false - - - - - - - - spinNumMeasurements - chkFile - dispFileName - spinIndex - comboTimingMode - spinNumFrames - spinExpTime - comboExpUnit - spinPeriod - comboPeriodUnit - spinNumTriggers - spinDelay - comboDelayUnit - spinNumGates - spinNumProbes - - - - - - diff --git a/slsDetectorGui/forms/form_tab_messages.ui b/slsDetectorGui/forms/form_tab_messages.ui deleted file mode 100644 index 1f75475e5..000000000 --- a/slsDetectorGui/forms/form_tab_messages.ui +++ /dev/null @@ -1,82 +0,0 @@ - - - TabMessagesObject - - - - 0 - 0 - 775 - 345 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Form - - - - - - - - TextLabel - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - - - - TextLabel - - - - - - - - - - - - - - - - diff --git a/slsDetectorGui/forms/form_tab_plot.ui b/slsDetectorGui/forms/form_tab_plot.ui deleted file mode 100644 index e16c6ae46..000000000 --- a/slsDetectorGui/forms/form_tab_plot.ui +++ /dev/null @@ -1,3028 +0,0 @@ - - - TabPlotObject - - - - 0 - 0 - 775 - 345 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - - - - - - 0 - 0 - 30 - - - - - - - - - 0 - 0 - 30 - - - - - - - - - 0 - 0 - 30 - - - - - - - - Form - - - - true - - - - 15 - 70 - 371 - 51 - - - - 2D Plot Options 1 - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 5 - 15 - 361 - 31 - - - - 4 - - - - - - 20 - 5 - 336 - 26 - - - - - - - - 0 - 0 - - - - Interpolate - - - - - - - - 0 - 0 - - - - Contour - - - - - - - - 0 - 0 - - - - Log Scale (Z) - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 15 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - - - - - 25 - 5 - 100 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - Accumulate - - - - - - - - - 175 - 3 - 156 - 26 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Reset Accumulation - - - - :/icons/images/calculate.png:/icons/images/calculate.png - - - - 16 - 16 - - - - - - - - - 20 - 5 - 81 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - Pedestal - - - - - - - - - 160 - 3 - 171 - 26 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Recalculate Pedestal - - - - :/icons/images/calculate.png:/icons/images/calculate.png - - - - 16 - 16 - - - - - - - - - 25 - 5 - 311 - 26 - - - - - 1 - - - - - - 0 - 0 - - - - Binary - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - false - - - - 0 - 0 - - - - from - - - - - - - false - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 0 - - - - - - - false - - - - 0 - 0 - - - - to - - - - - - - false - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 0 - - - - - - - - - - - 25 - 5 - 335 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - <nobr> -Displays minimum, maximum and sum of values for each plot. -<nobr> - - - Display Statistics - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 10 - - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Displays minimum, maximum and sum of values for each plot. -<nobr> - - - Gain Plot - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 10 - - - - - - - - false - - - - 0 - 0 - - - - <nobr> -Displays minimum, maximum and sum of values for each plot. -<nobr> - - - Gap Pixels - - - - - - - - - true - - - - - 25 - 5 - 311 - 26 - - - - - 1 - - - - - true - - - - 0 - 0 - - - - from - - - - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 0 - - - - - - - true - - - - 0 - 0 - - - - to - - - - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 10000 - - - - - - - true - - - - 0 - 0 - - - - size - - - - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 1000 - - - - - - - - - - - - 15 - 70 - 371 - 51 - - - - 1D Plot Options 1 - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 4 - 15 - 366 - 31 - - - - 5 - - - - - - 25 - 5 - 108 - 26 - - - - - - - - 0 - 0 - - - - Superimpose - - - false - - - - - - - - - 210 - 5 - 128 - 26 - - - - - 1 - - - - - false - - - - 0 - 0 - - - - Persistency: - - - - - - - false - - - - 0 - 0 - - - - - 40 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 1 - - - 10 - - - 1 - - - - - - - - - - - 25 - 5 - 321 - 26 - - - - - - - - 0 - 0 - - - - Log Scale (Y) - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 95 - 20 - - - - - - - - true - - - - 0 - 0 - - - - Points - - - - - - - true - - - - 0 - 0 - - - - Lines - - - true - - - - - - - - - - - 175 - 3 - 161 - 26 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Reset Accumulation - - - - :/icons/images/calculate.png:/icons/images/calculate.png - - - - 16 - 16 - - - - - - - 25 - 5 - 100 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - Accumulate - - - - - - - - - - - 25 - 5 - 81 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - Pedestal - - - - - - - - - 165 - 3 - 171 - 26 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Recalculate Pedestal - - - - :/icons/images/calculate.png:/icons/images/calculate.png - - - - 16 - 16 - - - - - - - <nobr> -All values between <b>from</b> and <b>to</b> will be reset to 1, others to 0. -</nobr> - - - - - 25 - 5 - 311 - 26 - - - - - 1 - - - - - - 0 - 0 - - - - <nobr> -All values between <b>from</b> and <b>to</b> will be reset to 1, others to 0. -</nobr> - - - Binary - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - false - - - - 0 - 0 - - - - from - - - - - - - false - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 0 - - - - - - - false - - - - 0 - 0 - - - - to - - - - - - - false - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 0 - - - - - - - - - - - 25 - 5 - 132 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - <nobr> -Displays minimum, maximum and sum of values for each plot. -<nobr> - - - Display Statistics - - - - - - - - - true - - - - - 25 - 5 - 311 - 26 - - - - - 1 - - - - - true - - - - 0 - 0 - - - - from - - - - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - 0 - - - 16777215 - - - 0 - - - - - - - true - - - - 0 - 0 - - - - to - - - - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 10000 - - - - - - - true - - - - 0 - 0 - - - - size - - - - - - - true - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - -16777215 - - - 16777215 - - - 1000 - - - - - - - - - - - - 410 - 70 - 351 - 51 - - - - Save Image - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 10 - 20 - 233 - 26 - - - - - 0 - - - - - true - - - - 0 - 0 - - - - Save All with Automatic File Name - - - - - - - - - 264 - 19 - 76 - 25 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Save - - - - :/icons/images/save.png:/icons/images/save.png - - - - 16 - 16 - - - - - - - - 410 - 5 - 351 - 51 - - - - 2D Scan - Y Axis Values - - - true - - - false - - - - - 10 - 20 - 357 - 26 - - - - - 0 - - - - - - 0 - 0 - - - - <nobr>Enabled only when there is a Scan Level 0</nobr> - - - Level 0 - - - true - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 7 - 10 - - - - - - - - - 0 - 0 - - - - <nobr>Enabled only when there is a Scan Level 1</nobr> - - - Level 1 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 7 - 10 - - - - - - - - - 0 - 0 - - - - <nobr>Enabled only when there is a Scan Level 0 or a Scan Level 1, not both</nobr> - - - Frame Index - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 7 - 10 - - - - - - - - - 0 - 0 - - - - <nobr>Disabled only for Angle Plots, Moench and Eiger Detectors</nobr> - - - All Frames - - - false - - - - - - - - - - 15 - 200 - 746 - 141 - - - - Plot Axis - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 10 - 15 - 726 - 121 - - - - - QLayout::SetNoConstraint - - - 0 - - - - - Title Prefix: - - - - - - - true - - - - 0 - 0 - - - - - 50 - 0 - - - - - - - - - 0 - 0 - - - - Z Max: - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - - - - - - 0 - 0 - - - - Y Max: - - - - - - - - 0 - 0 - - - - X Max: - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - Z Min: - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - - - - - - 0 - 0 - - - - X Min: - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - Qt::ImhDigitsOnly - - - - - - - - 0 - 0 - - - - Y Min: - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 40 - 20 - - - - - - - - - 0 - 0 - - - - X Axis: - - - - - - - - 0 - 0 - - - - - 250 - 0 - - - - Qt::ImhDigitsOnly - - - - - - - - 0 - 0 - - - - Y Axis: - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - Qt::ImhDigitsOnly - - - - - - - - 0 - 0 - - - - Z Axis: - - - - - - - - 0 - 0 - - - - - 20 - 0 - - - - Qt::ImhDigitsOnly - - - - - - - - 0 - 0 - - - - - 250 - 0 - - - - QLineEdit::Normal - - - false - - - - - - - - 0 - 0 - - - - Keep Aspect Ratio - - - - - - - - - true - - - - 15 - 5 - 371 - 51 - - - - Plot Arguments - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 10 - 20 - 355 - 26 - - - - - - - - 0 - 0 - - - - No Plot - - - - - - - - 0 - 0 - - - - Data Graph - - - true - - - - - - - true - - - - 0 - 0 - - - - Histogram - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 40 - 10 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 40 - 10 - - - - - - - - - - - 15 - 135 - 371 - 49 - - - - <nobr> -Interval between plots has 2 modes. A condition to be satisfied, in order to avoid losing images: -</nobr><br><br><nobr> -<b>Time Interval</b>: (Acquisition Period) * (nth Image) >= 250ms. -</nobr><br><nobr> -<b>Every nth Image</b>: minimum of 250ms. -</nobr> - - - Interval between Plots - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 10 - 16 - 351 - 26 - - - - - 0 - - - - - - 0 - 0 - - - - - 150 - 0 - - - - - 16777215 - 16777215 - - - - - - - - - 11 - 11 - 11 - - - - - - - 20 - 20 - 20 - - - - - - - - - 11 - 11 - 11 - - - - - - - 20 - 20 - 20 - - - - - - - - - 119 - 119 - 119 - - - - - - - 20 - 20 - 20 - - - - - - - - 0 - - - - Time Interval - - - - - Every nth Image - - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 80 - 20 - - - - - - - - - 0 - 0 - - - - - 140 - 21 - - - - - - - - - - true - - - - 410 - 135 - 351 - 51 - - - - Snapshot - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter - - - false - - - - - 10 - 12 - 365 - 36 - - - - - - - - 0 - 0 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Create - - - - :/icons/images/new.png:/icons/images/new.png - - - false - - - - - - - - 0 - 0 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Close All - - - - :/icons/images/close.png:/icons/images/close.png - - - false - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - true - - - - 0 - 0 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - - 20 - 20 - 20 - - - - - - - - Qt::NoFocus - - - Save All - - - - :/icons/images/saveAll.png:/icons/images/saveAll.png - - - false - - - - - - - - - - 362 - 95 - 16 - 16 - - - - - 0 - 0 - - - - Qt::NoFocus - - - - - - - :/icons/images/rightArrow.png:/icons/images/rightArrow.png - - - - 16 - 16 - - - - true - - - - - - 23 - 94 - 16 - 16 - - - - - 0 - 0 - - - - Qt::NoFocus - - - - - - - :/icons/images/leftArrow.png:/icons/images/leftArrow.png - - - - 16 - 16 - - - - true - - - - - - 410 - 5 - 351 - 51 - - - - Histogram - X Axis Values - - - false - - - false - - - - - 10 - 20 - 331 - 26 - - - - - 0 - - - - - - 0 - 0 - - - - <nobr>Enabled only when there is a Scan Level 0</nobr> - - - Intensity - - - true - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 7 - 10 - - - - - - - - - 0 - 0 - - - - <nobr>Enabled only when there is a Scan Level 1</nobr> - - - Level 0 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 7 - 10 - - - - - - - - - 0 - 0 - - - - <nobr>Enabled only when there is a Scan Level 0 or a Scan Level 1, not both</nobr> - - - Level 1 - - - - - - - box1D - box2D - boxSave - boxScan - boxPlotAxis - groupBox_3 - boxFrequency - boxSnapshot - btnRight - btnLeft - boxHistogram - - - radioNoPlot - radioHistogram - radioDataGraph - boxScan - radioLevel0 - radioLevel1 - radioFileIndex - radioAllFrames - chkInterpolate - chkContour - chkLogz - chkSaveAll - comboFrequency - chkTitle - dispTitle - chkXAxis - dispXAxis - chkXMin - dispXMin - chkXMax - dispXMax - chkYAxis - dispYAxis - chkYMin - dispYMin - chkYMax - dispYMax - chkZAxis - dispZAxis - chkZMin - dispZMin - chkZMax - dispZMax - spinPersistency - chk1DLog - chkPoints - chkLines - chkSuperimpose - - - - - - diff --git a/slsDetectorGui/forms/form_tab_settings.ui b/slsDetectorGui/forms/form_tab_settings.ui deleted file mode 100644 index 7c9f8f3ed..000000000 --- a/slsDetectorGui/forms/form_tab_settings.ui +++ /dev/null @@ -1,248 +0,0 @@ - - - TabSettingsObject - - - - 0 - 0 - 775 - 345 - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 1000 - 1000 - - - - Form - - - - - 30 - 20 - 316 - 171 - - - - - - - Settings: - - - - - - - - 0 - 0 - - - - Settings of the detector. - #settings# - - - - Standard - - - - - Fast - - - - - High Gain - - - - - Dynamic Gain - - - - - Low Gain - - - - - Medium Gain - - - - - Very High Gain - - - - - Low Noise - - - - - Dynamic HG0 - - - - - Fix Gain 1 - - - - - Fix Gain 2 - - - - - Force Switch G1 - - - - - Force Switch G2 - - - - - Very Low Gain - - - - - Undefined - - - - - Uninitialized - - - - - - - - false - - - eV - - - -100000 - - - 100000 - - - 100 - - - -1 - - - - - - - Number of Modules: - - - - - - - Dynamic Range: - - - - - - - - 1.67772e+07 - - - - - 65535 - - - - - 255 - - - - - 7 - - - - - - - - 1 - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - Threshold: - - - - - - - - comboSettings - spinThreshold - spinNumModules - comboDynamicRange - - - - - - diff --git a/slsDetectorGui/gitInfo.txt b/slsDetectorGui/gitInfo.txt deleted file mode 100644 index cbfb0a084..000000000 --- a/slsDetectorGui/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorGui -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: e998226bce91a0d82ca0bb38c202d404357cf1ff -Revision: 525 -Branch: gh-pages -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4092 -Last Changed Date: 2019-04-08 11:25:39.000000002 +0200 ./src/qTabSettings.cpp diff --git a/slsDetectorGui/images/add.png b/slsDetectorGui/images/add.png deleted file mode 100644 index 41058cb95b43ea515e63af40db2cd073aeca295f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 702 zcmV;v0zv(WP)1q-7w5~B+@y1;1LYYA}!E91t5 zh5vwiNWemXXrdw!Ap~3GO!ogM(leRGnSAq`lkc1%_)k3Pzh|F~eRohA zM@zxo;f|_jBdK&G)nU!sa(nm9UhiahobIc;xRKYY4*dSm_}tbzk`|z-C(GG(xy@s} zkgsJ4%+9al)7p@$zh$N?EkI6JhP%G}s$6fql+1t3&0#9|RUW^y_$n8hQ)C@lv;0gp@T10tZpx zVbYsWXe?Bthsrg=bTZERGj*O!vjngSuq*|~Fv-nQ3PO`UBCaODBt-Z&mhjCtgFbjXLGq9CdqqPemL&?y?= z5$YJ088!(fn$VtN7|jEYK~9bleBn+Kh7BXaksW9Tfv^O;pjD@fspKfp@UIK)u;UO8 z#5D`FlBte3ii<6dQkw*Wq=SDdiq);4m#5S#=ve6VtjZJS?-htpcl>`fnN2k=q&_d%<&w6^F={VkxH8j4NnX_ke km83du9qqpVdN7slFQ6jV?;TlEGXMYp07*qoM6N<$f-}%XkN^Mx diff --git a/slsDetectorGui/images/browse.png b/slsDetectorGui/images/browse.png deleted file mode 100644 index e9404d3c772872d463c93bf26de9d2e800e9ff93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 884 zcmV-)1B?8LP);q5rm76K07J!Ka0GhwY61!ZRF*5UA2DyY?g<0Rk-a@MJ(5+ zHLxOFR_9oj=~|}g8iwIIPUUd>BM0900k&<^{^y?m zZ)F~98*U(2V=Y3eFfPQIqu-8p(%yZ;U!`j|?d;v&hH$+_MN&X6Lq3zmLbi;|sY~bx zox}35f!d&nP)$Gr0>aQWQM_3?LUZ^a*I zTxR&9e*nz&0EcMn=I(l!k$kYZ7|1d#B| zjc4h@H=f!RiQf0+wb~ApLmZ8D0wqTvogv&Q9K==-O7jyiSgtB&o|s9`F*TEUj1IrP zXKUw%_V50@E_)h|fmt?Kr3}3&+jldGa~Ee5^wz;$ zo!k1l#)O=;a>YSzp$J`7WZMita7<2RaQ>=>!J)??WIFljQ3!e2EA;q8vYSSR6RRKX z?>-L+5Z;y|!Iw-vRodlL4!@-X*w&vwz2zcx_8TAm!!H-s(F?mDZWrG&79(xw-dg zSy0pKYOOX?S9Ayx1O>eMPX%AXErDh1g{Bz{uDv&&`02#)_x=WEKdZf*W|Axb0000< KMNUMnLSTZ$TB^tZ diff --git a/slsDetectorGui/images/calculate.png b/slsDetectorGui/images/calculate.png deleted file mode 100644 index 49ac1f4b1edde0c731dc60fac54531ac07a1c358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 833 zcmV-H1HSx;P)6XjpoM=gFqLihS!lFNL2J0duWH*_OLE;~Ycec{X&8caVx)2O9@FGOl zg3vC?l%$kFqGXt9n~GE0oC=l`%(>}0=c|pp2zue=`@Zv?_j#Y^dCy@oGBVUEl`0!R zkYN}ENo;OzLL?Hg-*kOvXNP^~a5zEyj$mtR>!Y=`wH2ngxVYM6GSxUdvxwU(g=9}O z+-^7Iayh$`7W#ZXT8xN@2!tX%J^jf1{JfnhDJe13*47$*+kOl?$8a_&6LWKONJ&Xy zi)n6bY=Fn(K`0dB4=bdmrXD2#lN7*MS664~n(T)%F%A2pWNOC*vos6wGgBLH8R{QP`V zSy|a#T1d>o_VzZ&4@waNfq*Tf9uQL@l}ZsA8ObJLkWTiEQwg;V4GniDTvOol_(+bE zV`yjyYPA|~J`dvJ2^BmZ4=W)yHa2V`G5I(F7^497jg5^}?)4QoR-8~JDKRiGfSjBh zyq)?0_2Dycxm+xOOePBhXtmmt9UUFROlfK9J;I=J%;P|`NDRfk1L*7PgGQr)bJYcf zG!Y963#^=H@4C_QybWB2gOr0wwvPJND@(%%gf6coEm}k z<7@O*x3lXN&4w3W*XNU{g!?4)bR*5Jtu0usRumKzg!MX|PE0ILqts%+%)|HKb9uOI zzW!d3jXl`n1x)B1PBkSz!L{U-EE&xG<09C!s7+;)1q9h*Pb+2pH=M7K>O=h#X z;%@+p#R77`b^%Z?5)u;d?Z*-VI{`fIe)@7cxFlhSyNAdbj|ttfe?65-B{%I{=IMB0 zjN2ax#S>3YWlO%HhQWV^&1MsHt=QVEqdga*1frkiS=x48=B4^yOP5X0&{!;d00000 LNkvXXu0mjfiE@6Y diff --git a/slsDetectorGui/images/close.png b/slsDetectorGui/images/close.png deleted file mode 100644 index 7173b4e900f1afa29b76665b007fa2c0975402ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 812 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 diff --git a/slsDetectorGui/images/new.png b/slsDetectorGui/images/new.png deleted file mode 100644 index 7ef7b0b082f7b651e32621769194d2b7aefba893..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 644 zcmV-~0(-fp%tt9u=eSa`D_PJjOTD)cBNqUaZ&a5C{Pg1Q0gTg%xE5gP#X+wd)Ex z1fL}q4GE88Px7h7)JYD=WU~!G^JfO41ujJ{qOxDb@%BCNo98TXl+5B&CXMiHEXV;l zMd1M3MXg$eJLE>+4nHn<&f>`KZcDtB{eYKp2(L2>8VBT6^)G;~>+rt!;PjRgIPdAj zvG!g|{3R2{D>;m}TBKwH4yqd)l3^Gez{XmwhWfF8pl z2NVj0Uw~$^vzUv|VPJg#L@S|h=P66PphlomgBZbO4k#9jl4+WM09aJ%Im~>V!K6Bg zRb$oq)+uyi`R4Kshq5~DShBg(>Fl7j!~vyJNn(ZY4*-iwr2^U}s1625^?=9C93=k>P%f9LeHlqv z#`d;0bNv4J*qdPR0d39T04kE~o_~k1{?q9+;_)T)^mJorcz9y!`P3M7WLWxEK&u0G z7ZRd~wI6Hd^ozj6bRckB({#grXdFO^9AG=K0pAl+b#!FtPH2Aqp}lh}U@Ogi*gWbK eEYo(()`g$Q@+i;+HXEb>0000SBT^vI!PPa~u&Iw5sX}w;5uKr)~>k_M_ zOCOs^Y8f{jaTDp%I2OIts!>2)Lo8oEt65R1*G_@I#csw2C7X;zDjkBkJ0g5|%$Pd& ziJVSgWWF)0bA@yC%g}QrR>gY7|B62@(CtdwRkISifd)we21l<+RBZdudj=4GAt5f zaQLTH^XY5y1+VlD$@_CwIo*8F_DIWKrOHF#tK#+hIl`A;>(_7ouK455pUVor zk9iur-}NHn^!A8-cXA62&oV18FtRXlFu8agVEVkldfMxzpmaXDnyP;--^BY5Zw zcg@)wrYGM2@l-zh-knbKrmM~QWqRI5Vf9JpDHk~!^Q+d)e4LtG6wdbJ%Ja``92POh zvkK4d+$;Rt?%yK4y4l&g`GRiF{qV-iNx=Et?PKXzZ+?_}eCp-DGwi#)br&@mtT>l` z;nFPD+>E7uFK4|k)}A9_)fHjYd^_H%;na(%WqIO%5!@N_Gn)%~zRL7Mx9jlZj>EaTZ|d38!=M#$!5=J$uneJ9MC zee1)EZE;h2PgZwE?N*-h4v++*q6#CVE9FeJ$f%d|Rd0vnnLgsU<+Kw{KtR zp54g?mDfLiUjN2&^M%Ld$yW9e9V(Z2nS$SOb}-EEXz>VYSyj}e88nBbW?9MG>+e3d z-@9G^d6%Dleb)Iy0^zxD-5*4GuC)7Ud3B4KqQURbUcZxFFFFd^*1SA)^3Ffm!`(sU zKNdf)`ghN%=Im^b^zwy9^X?z{GRyYblMltt^KB)KRxu_RSD1xPS3RNOK) zGT3m%)C7q54UIM#8EiK)xn{OugOLFPgX3*hk#yT@3t&2P^HVa@Dlv6#;W0GXVr076 c$lwA@=Lc31&-dNWfjSvHUHx3vIVCg!0Bl_6kN^Mx diff --git a/slsDetectorGui/images/refresher.png b/slsDetectorGui/images/refresher.png deleted file mode 100644 index df73f0121697f6104522e5cd659f43b8557c1d05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 692 zcmV;l0!#ggP)b}m3`L>S|E~SzSC1|9%W%UKs=9|B-*@mN79e z`SbFUKQF(t3pjFYxxNFXWs$bH4xfDss)7x22!ybgpyFOgxX# z-a{_c{kXm)#VLx61%>PLVI%s1FZ9; zkqz#zqYkh^(NN&)VKpK-Kn{?`E79qE1wX3J`n7^hec%DOBOO(JMfr?fkBpe}7YBZ#r&rjI7riFeG z^nAyGMUSm@b@fn*IFS?Y#GC6PNfJDcMmVb1Q63H>76PGYHhaG3Vb?U_8U}36VUa+W z5?HN}Ethy%EHIr+kWy|+vR1WTzvjR(oT4#R3&OfTYo`+raHF`3HYn@BuDEQPCHgIEVlM002ovPDHLk FV1iJCmf-*Z diff --git a/slsDetectorGui/images/rightArrow.png b/slsDetectorGui/images/rightArrow.png deleted file mode 100644 index 74ac7f795852435db03296fa58dfed7c27d649de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 556 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 diff --git a/slsDetectorGui/images/start.png b/slsDetectorGui/images/start.png deleted file mode 100644 index afe837e75ca0f1936f658dbdd3b4704f47a76ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVg^KH zsv6UEskNuWXUUV;(@0Wfl9FIWbG)Hbo$0eG~YCF^h+ix0)cV> zG;1C>hxP#8X@B2n%>+5RC9`S)h+pbc p@!(TQb&I`F--M4KelGnlE&yfqzY#-b#(n?*002ovPDHLkV1k6C;06Ey diff --git a/slsDetectorGui/images/stop.png b/slsDetectorGui/images/stop.png deleted file mode 100644 index 316926dee6739c3ff3488dfe7e51ea4519b28916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519 zcmV+i0{H!jP)C$-sf5A8 z%4#!MTB2y$y57C#-RXs+s);Xocgy#F?|bk25d1Tc^|?Gg_N#Yy zdpvd$E0w_1bui!Fz!0l37<@(@9m%fY;a3~Dh(yAjq0ky+vw}p`kK`P<&j;73R5+AK z#O&wn9maL0ze2-iq4=1Ombkzao1<>vHkwCrXN@P!IH^x8SB+CrADj9U$0m1_4 z@kpeJ{cK^Sraod0=K|O$m4O)n^ePewn19SbIUXbqDczu34ltz%Kvd9NBk))TwjE$X z06j7$eukl$^Xi+$q`qJVXNF04bf=AN(rmDZV)aD~nn>{dvia5OfH)vu$KbY(&#l~> zaT|zrAuW54$1@q!;EXZ`_b4;?9OXcOKex8CeJtQV^6SpoN8sQIhQJ?Cj3F7PAI57Ct!d@i>?B&b^!`09?7{NSZ0?h5uQ` zDBGKxEMFf9SMRu);q;@iA1`2`=q#a_>mOs2ETcIm<^A7H1oO)aazOT0ke8Dofoa z_l~8Md7pm2#whQze7wctY;&j1%P#=|58ypZb1jz7bQukDuD@C*&j)<(=iGd~jvp4R zob7VqKnmXDe|O+jn2ikg&mBTXB{yEY=ZW6~C`N?G+UE9J4^xdO5fr_CeB^afrDZPQxX~5@X05aHPQ5jjEV8>2tCJjNVX%vfBZu+ot(eNY(9-(b0Wchvs4@TK;>aPz*jtl?zBM(a z*_7M$k)D10ii(hBom~Q*EKw<)x31h8y3^g&cVGHTBd@i{PU6~i6F;=RPiEr+qn#7` zSM9@BLjjn+`#>a0LbFr#*ED}S08~_~{#Lnt?Xvy^SRm^&4QXnm00000NkvXXu0mjf DZfZrA diff --git a/slsDetectorGui/include/gitInfoGui.h b/slsDetectorGui/include/gitInfoGui.h deleted file mode 100644 index cb066ae47..000000000 --- a/slsDetectorGui/include/gitInfoGui.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "e998226bce91a0d82ca0bb38c202d404357cf1ff" -#define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4092 -#define GITDATE 0x20190408 -#define GITBRANCH "gh-pages" diff --git a/slsDetectorGui/include/gitInfoGuiTmp.h b/slsDetectorGui/include/gitInfoGuiTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorGui/include/gitInfoGuiTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorGui/include/icons.qrc b/slsDetectorGui/include/icons.qrc deleted file mode 100644 index 26f0b5da7..000000000 --- a/slsDetectorGui/include/icons.qrc +++ /dev/null @@ -1,22 +0,0 @@ - - - ../images/mountain.png - ../images/refresh.png - ../images/save.png - ../images/saveAll.png - ../images/close.png - ../images/add.png - ../images/new.png - ../images/download.png - ../images/browse.png - ../images/start.png - ../images/erase.png - ../images/remove.png - ../images/stop.png - ../images/leftArrow.png - ../images/rightArrow.png - ../images/upload.png - ../images/setup.png - ../images/calculate.png - - diff --git a/slsDetectorGui/include/qActionsWidget.h b/slsDetectorGui/include/qActionsWidget.h deleted file mode 100644 index 2e024c8a1..000000000 --- a/slsDetectorGui/include/qActionsWidget.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * qActionsWidget.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QACTIONSWIDGET_H_ -#define QACTIONSWIDGET_H_ - -#include "qDefs.h" - -/** Form Header */ -#include "ui_form_action.h" -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ - -/** C++ Include Headers */ -#include -using namespace std; - - - -class qActionsWidget : public QWidget,private Ui::ActionsObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qActionsWidget(QWidget *parent, multiSlsDetector*& detector); - - ~qActionsWidget(); - - /**to update the widgets*/ - void Refresh(); - - - /**number of action widgets*/ - static int NUM_ACTION_WIDGETS; - - - -private: - /** The sls detector object */ - multiSlsDetector *myDet; - /**id of the action widget*/ - int id; - - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals - * */ - void Initialization(); - - -private slots: -/** Sets the scan or script. Accordingly enables, disables other widgets - * @param mode value chosen - * */ -void SetMode(int mode); - -/** Browse for the script - * */ -void BrowsePath(); - -/** Sets the script file - * */ -void SetScriptFile(); - -/** Set Parameter - * */ -void SetParameter(); - -}; - - - - -#endif /* QACTIONSWIDGET_H_ */ - diff --git a/slsDetectorGui/include/qCloneWidget.h b/slsDetectorGui/include/qCloneWidget.h deleted file mode 100644 index 07d4cff4c..000000000 --- a/slsDetectorGui/include/qCloneWidget.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * qCloneWidget.h - * - * Created on: May 18, 2012 - * Author: l_maliakal_d - */ - -#ifndef QCLONEWIDGET_H_ -#define QCLONEWIDGET_H_ - -#include "qDefs.h" - - -/** Qt Project Class Headers */ -class SlsQtH1D; -#include "SlsQt1DPlot.h" -#include "SlsQt2DPlotLayout.h" -/** Qt Include Headers */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -/** C++ Include Headers */ -#include -#include -using namespace std; - -/** - *@short Sets up the clone plot widget - */ -class qCloneWidget:public QMainWindow{ - Q_OBJECT - -public: - /** \short The constructor - */ - qCloneWidget(QWidget *parent,int id,QString title,QString xTitle, QString yTitle, QString zTitle, int numDim,string FilePath, - bool displayStats, QString min, QString max, QString sum); - - /** Destructor - */ - ~qCloneWidget(); - - /** Sets up the widget window - * @param title title of the image with frame number - * @param xTitle title of x axis - * @param yTitle title of y axis - * @param zTitle title of z axis - * @param numDim 1D or 2D - * */ - void SetupWidgetWindow(QString title, QString xTitle, QString yTitle, QString zTitle, int numDim); - - - - /** Get the 1D hist values to plot - * @param nHists Number of graphs in 1D - * @param histNBins Total Number of X axis values/channels in 1D - * @param histXAxis X Axis value in 1D - * @param histYAxis Y Axis value in 1D - * @param histTitle Title for all the graphs in 1D - * @param lines style of plot if lines or dots - * @param markers style of plot markers or not - * */ - void SetCloneHists(int nHists,int histNBins,double* histXAxis,double* histYAxis[],string histTitle[],bool lines,bool markers); - - /** Get the 1D hist values to plot for angle plotting - * @param nHists Number of graphs in 1D - * @param histNBins Total Number of X axis values/channels in 1D - * @param histXAxis X Axis value in 1D - * @param histYAxis Y Axis value in 1D - * @param histTitle Title for all the graphs in 1D - * @param lines style of plot if lines or dots - * @param markers style of plot markers or not - * */ - void SetCloneHists(int nHists,int histNBins,double* histXAxis,double* histYAxis,string histTitle[],bool lines,bool markers); - - /** Get the 1D hist values to plot for angle plotting - * @param nbinsx number of bins in x axis - * @param xmin minimum in x axis - * @param xmax maximum in x axis - * @param nbinsy number of bins in y axis - * @param ymin minimum in y axis - * @param ymax maximum in y axis - * @param d data - * */ - void SetCloneHists2D(int nbinsx,double xmin,double xmax,int nbinsy, double ymin, double ymax, double *d); - - /**Set the range of the 1d plot - * @param IsXYRange array of x,y,min,max if these values are set - * @param XYRangeValues array of set values of x,y, min, max - */ - void SetRange(bool IsXYRange[], double XYRangeValues[]); - - /** Returns the 1d plot - */ - SlsQt1DPlot* Get1dPlot(){return cloneplot1D;}; - -public slots: -/** Save Plots automatically by save all clones - * returns -1 if fail*/ -int SavePlotAutomatic(); - - -private: - /** clone window id*/ - int id; - /** Default Save file path */ - string filePath; - /** clone 1D Plot */ - SlsQt1DPlot* cloneplot1D; - /** clone 2D Plot */ - SlsQt2DPlotLayout* cloneplot2D; - /** vector of 1D hist values */ - QVector cloneplot1D_hists; - - /** markers for the plot*/ - QwtSymbol *marker; - QwtSymbol *nomarker; - - QMenuBar *menubar; - QAction *actionSave; - - QGridLayout *mainLayout; - QGroupBox *cloneBox; - QGridLayout *gridClone; - - QLabel *lblHistTitle; - - /** Gets the current time stamp for the window title*/ - char* GetCurrentTimeStamp(); - - /** Display Statistics */ - void DisplayStats(bool enable, QString min, QString max, QString sum); - - -private slots: -/** Save Plot */ -void SavePlot(); - -protected: - void closeEvent(QCloseEvent* event); - -signals: -void CloneClosedSignal(int); - -}; - - - - -#endif /* QCLONEWIDGET_H_ */ diff --git a/slsDetectorGui/include/qDebugStream.h b/slsDetectorGui/include/qDebugStream.h deleted file mode 100644 index 4335dbd0a..000000000 --- a/slsDetectorGui/include/qDebugStream.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * qDebugStream.h - * - * Created on: Jun 28, 2012 - * Author: Anna Bergamaschi - */ - -#ifndef QDEBUGSTREAM_H_ -#define QDEBUGSTREAM_H_ - - -#include "qDefs.h" - - -#include -#include -#include -#include - - -#include -#include -#include -using namespace std; - -#define STREAMEVENT 60001 - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -class qStreamEvent:public QEvent{ -public: - qStreamEvent(QString s):QEvent(static_cast(STREAMEVENT)),str(s){ -#ifdef PRINT_LOG - printf("%s\n",str.toAscii().constData()); -#endif - } - /** \returns the progress index */ - QString getString() {return str;} -private: - QString str; - -}; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -class qDebugStream : public basic_streambuf { - -public: - qDebugStream(ostream &stream, QWidget* w) : m_stream(stream), log_window(w) { - pthread_mutex_init(&mutex, NULL); - m_old_buf = stream.rdbuf(); - stream.rdbuf(this); - } - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - ~qDebugStream(){ - // output anything that is left - if (!m_string.empty()) { - pthread_mutex_lock(&mutex); - const char* c_string = m_string.c_str(); - QApplication::postEvent(log_window, new qStreamEvent(c_string)); - pthread_mutex_unlock(&mutex); - } - m_stream.rdbuf(m_old_buf); - } - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -protected: - virtual int_type overflow(int_type v){ - if (v == '\n'){ - pthread_mutex_lock(&mutex); - const char* c_string = m_string.c_str(); - QApplication::postEvent(log_window, new qStreamEvent(c_string)); - m_string.erase(m_string.begin(), m_string.end()); - pthread_mutex_unlock(&mutex); - } - else - m_string += v; - return v; - } - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - virtual streamsize xsputn(const char *p, streamsize n) { - pthread_mutex_lock(&mutex); - m_string.append(p, p + n); - - //changed from uint because of 64 bit - size_t pos = 0; - - while (pos != string::npos){ - pos = m_string.find('\n'); - if (pos != string::npos){ - string tmp(m_string.begin(), m_string.begin() + pos); - const char* c_tmp = tmp.c_str(); - QApplication::postEvent(log_window, new qStreamEvent(c_tmp)); - m_string.erase(m_string.begin(), m_string.begin() + pos + 1); - } - } - pthread_mutex_unlock(&mutex); - return n; - } - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -private: - pthread_mutex_t mutex; - ostream &m_stream; - streambuf *m_old_buf; - string m_string; - QWidget* log_window; -}; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -#endif /* QDEBUGSTREAM_H_ */ diff --git a/slsDetectorGui/include/qDefs.h b/slsDetectorGui/include/qDefs.h deleted file mode 100644 index f1b7d2b51..000000000 --- a/slsDetectorGui/include/qDefs.h +++ /dev/null @@ -1,301 +0,0 @@ -/* - * qDefs.h - * - * Created on: May 4, 2012 - * Author: l_maliakal_d - */ - -#ifndef QDEFS_H -#define QDEFS_H - -#include "ansi.h" -#include "sls_detector_defs.h" -#include "slsDetector.h" -#include "multiSlsDetector.h" -#include -#include -#include -#include -#include -using namespace std; - -class qDefs:public QWidget{ -public: -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /** Empty Constructor - */ - qDefs(){}; -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -#define GOODBYE -200 -//------------------------------------------------------------------------------------------------------------------------------------------------- - - enum{ - OK, - FAIL - }; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - enum MessageIndex{ - WARNING, - CRITICAL, - INFORMATION, - QUESTION - }; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - /** unit of time - */ - enum timeUnit{ - HOURS, /** hr */ - MINUTES, /** min */ - SECONDS, /** s */ - MILLISECONDS, /** ms */ - MICROSECONDS, /** us */ - NANOSECONDS /** ns */ - }; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /** returns the unit in words - * @param unit is the time unit - */ - static string getUnitString(timeUnit unit){ - switch(unit){ - case HOURS: return string("hrs"); - case MINUTES: return string("min"); - case SECONDS: return string("sec"); - case MILLISECONDS: return string("msec"); - case MICROSECONDS: return string("usec"); - case NANOSECONDS: return string("nsec"); - default: return string("error"); - } - }; -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /** returns the value in ns to send to server as the - * server class slsdetector accepts in ns. - * @param unit unit of time - * @param value time - * returns time value in ns - */ - static double getNSTime(timeUnit unit, double value){ - double valueNS=value; - switch(unit){ - case HOURS: valueNS*=60; - case MINUTES: valueNS*=60; - case SECONDS: valueNS*=1000; - case MILLISECONDS: valueNS*=1000; - case MICROSECONDS: valueNS*=1000; - case NANOSECONDS: - default:; - } - return valueNS; - }; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /** returns the time in the appropriate time unit - * @param unit unit of time - * @param value time in seconds - * returns the corresponding time value - */ - static double getCorrectTime(timeUnit& unit, double value){ - int intUnit = (int)SECONDS; - - /**0 ms*/ - if(!value){ - unit = MILLISECONDS; - return value; - } - - /** hr, min, sec */ - if(value>=1){ - double newVal = value; - while((newVal>=1)&&(intUnit>=(int)HOURS)){ - /** value retains the old value */ - value = newVal; - newVal = value/(double)60; - intUnit--; - } - /** returning the previous value*/ - unit = (timeUnit)(intUnit+1); - return value; - } - /** ms, us, ns */ - else{ - while((value<1)&&(intUnit<(int)NANOSECONDS)){ - value = value*(double)1000; - intUnit++; - } - unit = (timeUnit)(intUnit); - return value; - } - }; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /**displays an warning,error,info message - * @param message the message to be displayed - * @param source is the tab or the source of the message - * */ - static int Message(MessageIndex index, string message,string source) - { - static QMessageBox* msgBox; - size_t pos; - - //replace all \n with
- pos = 0; - while((pos = message.find("\n", pos)) != string::npos){ - message.replace(pos, 1, "
"); - pos += 1; - } - message.append(string("

Source:   ") + source + string("

")); - - switch(index){ - case WARNING: - msgBox= new QMessageBox(QMessageBox::Warning,"WARNING",tr(message.c_str()),QMessageBox::Ok, msgBox); - break; - case CRITICAL: - msgBox= new QMessageBox(QMessageBox::Critical,"CRITICAL",tr(message.c_str()),QMessageBox::Ok, msgBox); - break; - case INFORMATION: - msgBox= new QMessageBox(QMessageBox::Information,"INFORMATION",tr(message.c_str()),QMessageBox::Ok, msgBox); - break; - default: - msgBox= new QMessageBox(QMessageBox::Question,"QUESTION",tr(message.c_str()),QMessageBox::Ok| QMessageBox::Cancel, msgBox); - break; - } - //msgBox->setDetailedText(QString(source.c_str())); //close button doesnt work with this static function and this - if(msgBox->exec()==QMessageBox::Ok) return OK; else return FAIL; - } - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /** range of x and y axes - */ - enum range{ - XMINIMUM, - XMAXIMUM, - YMINIMUM, - YMAXIMUM - }; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /**gets error mask and displays the message if it exists - * @param myDet is the multidetector object - /returns error message else an empty string - * */ - static string checkErrorMessage(multiSlsDetector*& myDet, string title = "Main"){ - - - int errorLevel= (int)WARNING; - string retval=""; - size_t pos; - - - retval = myDet->getErrorMessage(errorLevel); - - if(!retval.empty()){ - //replace all \n with
- pos = 0; - while((pos = retval.find("\n", pos)) != string::npos){ - retval.replace(pos, 1, "
"); - pos += 1; - } - - //get rid of the last \n - if(retval.find_last_of("
")==retval.length()-1) - retval.erase((int)retval.find_last_of("
")-3,4); - - retval.insert(0,""); - retval.append(""); - - //display message - qDefs::Message((MessageIndex)errorLevel,retval,title); - } - - myDet->clearAllErrorMask(); - return retval; - }; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - /**gets error mask and displays the message if it exists - * @param myDet is the slsdetector object - * @param show to display the error message - /returns error message else an empty string - * */ - static string checkErrorMessage(slsDetector*& myDet, string title = "Main", bool show = true){ - - - int errorLevel= (int)WARNING; - string retval=""; - size_t pos; - int64_t emask=0; - - emask = myDet->getErrorMask(); - retval = myDet->getErrorMessage(emask); - - if(!retval.empty()){ - //replace all \n with
- pos = 0; - while((pos = retval.find("\n", pos)) != string::npos){ - retval.replace(pos, 1, "
"); - pos += 1; - } - - //get rid of the last \n - if(retval.find_last_of("
")==retval.length()-1) - retval.erase((int)retval.find_last_of("
")-3,4); - - retval.insert(0,""); - retval.append(""); - - //display message - if(show) - qDefs::Message((MessageIndex)errorLevel,retval,title); - } - - myDet->clearErrorMask(); - - return retval; - }; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - /** scan arguments*/ - enum scanArgumentList{ - None, - Level0, - Level1, - FileIndex, - AllFrames - }; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - /** histogram arguments*/ - enum histogramArgumentList{ - Intensity, - histLevel0, - histLevel1 - }; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -}; - - -#endif /* QDEFS_H */ diff --git a/slsDetectorGui/include/qDetectorMain.h b/slsDetectorGui/include/qDetectorMain.h deleted file mode 100644 index 0af189fc0..000000000 --- a/slsDetectorGui/include/qDetectorMain.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * qDetectorMain.h - * Main Window of the GUI - * Created on: Apr 30, 2012 - * Author: l_maliakal_d - */ -#ifndef QDETECTORMAIN_H -#define QDETECTORMAIN_H - -#include "qDefs.h" - -/** Form Header */ -#include "ui_form_detectormain.h" -/** Qt Project Class Headers */ -#include "qDrawPlot.h" -#include "qTabMeasurement.h" -#include "qTabDataOutput.h" -class qTabPlot; -class qTabActions; -class qTabAdvanced; -class qTabSettings; -class qTabDebugging; -class qTabDeveloper; -class qTabMessages; -class qServer; -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ -#include -#include -#include -#include - -#include -using namespace std; - -/** To Over-ride the QTabWidget class to get the tabBar */ -class MyTabWidget:public QTabWidget{ -public: - MyTabWidget(QWidget* parent = 0) {setParent(parent);} - /** Overridden method from QTabWidget */ - QTabBar* tabBar(){return QTabWidget::tabBar();} -}; - - -/** - *@short Main window of the GUI. - */ -class qDetectorMain:public QMainWindow, private Ui::DetectorMainObject{ - Q_OBJECT - - -public: - /** \short Main Window constructor. - * This is mainly used to create detector object and all the tabs - * @param argc number of command line arguments for server options - * @param argv server options - * @param app the qapplication3 - * @param ret OK or FAIL of constructor (from command line arguments) - * @param parent makes the parent window 0 by default - * */ - qDetectorMain(int argc, char **argv, QApplication *app, int& ret, QWidget *parent = 0); - - /**Destructor - * */ - ~qDetectorMain(); - - /** Starts or stops Acquisition From gui client - * @param start 1 for start and 0 to stop - /returns success or fail - */ - int StartStopAcquisitionFromClient(bool start); - - /** Returns if plot is running - */ - bool isPlotRunning(){return myPlot->isRunning();}; - - /** Returns progress bar value */ - int GetProgress(){return tab_measurement->GetProgress();}; - - /** Returns file path */ - QString GetFilePath(){QString s = QString(myDet->getFilePath().c_str());qDefs::checkErrorMessage(myDet); return s;}; - - /** Verifies if output directories for all the receivers exist */ - int DoesOutputDirExist(){return tab_dataoutput->VerifyOutputDirectory();}; - - bool isCurrentlyTabDeveloper(); - -private: - /** The Qt Application */ - QApplication *theApp; - /** The sls detector object */ - multiSlsDetector *myDet; - /** sls detector id */ - int detID; - /** true for mythen and eiger */ - bool digitalDetector; - /** The Plot widget */ - qDrawPlot *myPlot; - /**Tab Widget */ - MyTabWidget *tabs; - /**Layout of the central Widget */ - QGridLayout *layoutTabs; - /** default height of Plot Window when docked */ - int heightPlotWindow; - /** default height of central widgetwhen plot Window when docked */ - int heightCentralWidget; - /** The default zooming tool tip */ - QString zoomToolTip; - - /** The default tab heading color */ - QColor defaultTabColor; - /** enumeration of the tabs */ - enum {Measurement, Settings, DataOutput, Plot, Actions, Advanced, Debugging, Developer, Messages, NumberOfTabs }; - /* Scroll Area for the tabs**/ - QScrollArea *scroll[NumberOfTabs]; - /**Measurement tab */ - qTabMeasurement *tab_measurement; - /**DataOutput tab */ - qTabDataOutput *tab_dataoutput; - /**Plot tab */ - qTabPlot *tab_plot; - /**Actions tab */ - qTabActions *tab_actions; - /**Settings tab */ - qTabSettings *tab_settings; - /**Advanced tab */ - qTabAdvanced *tab_advanced; - /**Debugging tab */ - qTabDebugging *tab_debugging; - /**Developer tab */ - qTabDeveloper *tab_developer; - /**Messages tab */ - qTabMessages *tab_messages; - - /** server object*/ - qServer *myServer; - - /**if the developer tab should be enabled,known from command line */ - int isDeveloper; - - /**Sets up the layout of the widget - * */ - void SetUpWidgetWindow(); - - /**Sets up detector - * @param fName file name of the config file at start up - * */ - void SetUpDetector(const string fName); - - /**Sets up the signals and the slots - * */ - void Initialization(); - - /** Loads config file at start up - * */ - void LoadConfigFile(const string fName); - - -private slots: -/** Enables modes as selected -Debug, Expert, Dockable(calls setdockablemode()) - * */ -void EnableModes(QAction *action); - -/** Executes actions in the utilities menu as selected - * */ -void ExecuteUtilities(QAction *action); - -/** Executes actions in the utilities menu as selected - * */ -void ExecuteHelp(QAction *action); - -/** Refreshes the tab each time the tab is changed. Also displays the next enabled tab - * */ -void Refresh(int index); - -/** Resizes the main window if the plot is docked/undocked - * @param b bool TRUE if undocked(outside main window), FALSE docked - * */ -void ResizeMainWindow(bool b); - -/** Enables/disables tabs depending on if acquisition is currently in progress - * */ -void EnableTabs(); - -/** Set the tool tip of mouse controlled zooming depening on if its enabled/disabled - * */ -void SetZoomToolTip(bool disable); - -/** Uncheck the Listen to gui client mode when the server has exited - */ -void UncheckServer(); - -protected: -/** Adjust the resizing to resize plot, except for actions tab - * */ -void resizeEvent(QResizeEvent* event); - - -}; - -#endif /* QDETECTORMAIN_H */ diff --git a/slsDetectorGui/include/qDrawPlot.h b/slsDetectorGui/include/qDrawPlot.h deleted file mode 100644 index 54a4a2542..000000000 --- a/slsDetectorGui/include/qDrawPlot.h +++ /dev/null @@ -1,624 +0,0 @@ -/* - * qDrawPlot.h - * - * Created on: May 7, 2012 - * Author: Dhanya Maliakal - */ -#ifndef QDRAWPLOT_H -#define QDRAWPLOT_H - - -#include "qDefs.h" - -/** Project Class Headers */ -class multiSlsDetector; -#include "detectorData.h" -/** Qt Project Class Headers */ -#include "SlsQt1DPlot.h" -#include "SlsQt2DPlotLayout.h" -class qCloneWidget; -/** Qt Include Headers */ -#include -#include -#include -#include -#include -#include "qwt_symbol.h" - - -#include -#include -#include -#include -#include -#include - -/** C++ Include Headers */ - - -#define MAX_1DPLOTS 10 - - -/** - *@short Sets up the plot widget - */ -class qDrawPlot:public QWidget{ - Q_OBJECT - - - - -public: - /** \short The constructor */ - qDrawPlot(QWidget *parent,multiSlsDetector*& detector); - /** Destructor */ - ~qDrawPlot(); - - /**is an acquisition running , need it to prevent measurement tab - * from being refreshed when switching tabs during acquisition */ - bool isRunning(){return running;}; - /** gets the progress of acquisition to the measurement tab*/ - int GetProgress(){return progress;}; - /** gets the file index to the measurement tab*/ - int GetFileIndex(){return currentFileIndex;}; - /** gets the frame index to the measurement tab*/ - int GetFrameIndex(){return currentFrameIndex;}; - /** sets file write enable , if not enabled, - * file index wont increase and so you need secondary titles to differentitate between plots*/ - void SetEnableFileWrite(bool enable){fileSaveEnable = enable;}; - - /** sets plot Title prefix*/ - void SetPlotTitlePrefix(QString title) {plotTitle_prefix = title;} - /** sets 1D X Axis Title */ - void SetHistXAxisTitle(QString title) {histXAxisTitle = title;} - /** sets 1D Y Axis Title */ - void SetHistYAxisTitle(QString title) {histYAxisTitle = title;} - /** sets 2D X Axis Title */ - void SetImageXAxisTitle(QString title) {imageXAxisTitle = title;} - /** sets 2D Y Axis Title */ - void SetImageYAxisTitle(QString title) {imageYAxisTitle = title;} - /** sets 2D Z Axis Title */ - void SetImageZAxisTitle(QString title) {imageZAxisTitle = title;} - /** Disables zoom if any of the axes range are checked and fixed with a value */ - void DisableZoom(bool disable); - /** Enables plot from the plot tab*/ - void EnablePlot(bool enable); - /** Enable angle plot */ - void EnableAnglePlot(bool enable){anglePlot = enable;}; - - /** Its a reminder to update plot to set the xy range - * This is done only when there is a plot to update */ - void SetXYRange(bool changed){XYRangeChanged = changed;}; - /**Sets the min/max for x/y - * @param val is the value to be set - * @param xy is xmin,xmax,ymin or ymax */ - void SetXYRangeValues(double val,qDefs::range xy){XYRangeValues[xy]=val;}; - /**Sets if min/max for x/y is enabled - * @param changed is if this has been changed - * @param xy is xmin,xmax,ymin or ymax */ - void IsXYRangeValues(bool changed,qDefs::range xy){IsXYRange[xy]=changed;}; - - /** Get minimum Plot timer - between plots */ - double GetMinimumPlotTimer(){return PLOT_TIMER_MS;}; - /** Set Plot timer - between plots in ms*/ - void SetPlotTimer(double time); - /** Set Plot frame factor - between plots, also for receiver if exists */ - void SetFrameFactor(int frame); - - /** Starts or stop acquisition - * Calls startDaq() function - * @param stop_if_running is 0 to stop acquisition and 1 to start acquisition - */ - void StartStopDaqToggle(bool stop_if_running=0); - /** Set frame enabled - * @param enable enable*/ - void setFrameEnabled(bool enable){isFrameEnabled = enable;}; - /** Set trigger enabled - * @param enable enable */ - void setTriggerEnabled(bool enable){isTriggerEnabled = enable;}; - - /** Updates the trimbit plot - * @param fromDetector is true if the trimbits should be loaded from detector - * @param Histogram true if histogram, else data graph - * returns ok/fail - * */ - int UpdateTrimbitPlot(bool fromDetector,bool Histogram); - - /** This is set once client initiates start/stop acquisition - * and this is reset when the gui really starts/stops- to know when to return - */ - void SetClientInitiated(){clientInitiated = true;}; - - /** Get client intiated variable. This is set once client initiates start/stop acquisition - * and this is reset when the gui really starts/stops- to know when to return - */ - bool GetClientInitiated(){return clientInitiated;}; - - /** Update all ranges, interpolate etc after cloning - * parameters are if they are checked or not - */ - void UpdateAfterCloning(bool points, bool logy, bool interpolate, bool contour, bool logz); - - /** set binary range */ - void SetBinary(bool enable, int from=0, int to=0); - - /** Enable/Disable Histogram */ - void SetHistogram(bool enable,int histArg, int min=0, int max=0, double size=0){histogram = enable;histogramArgument = histArg; histFrom=min;histTo=max;histSize=size;}; - - /** Get X Minimum value from plot */ - double GetXMinimum() { if(plot_in_scope==1) return plot1D->GetXMinimum(); else return plot2D->GetPlot()->GetXMinimum();}; - /** Get X Maximum value from plot */ - double GetXMaximum() { if(plot_in_scope==1) return plot1D->GetXMaximum(); else return plot2D->GetPlot()->GetXMaximum();}; - /** Get Y Minimum value from plot */ - double GetYMinimum() { if(plot_in_scope==1) return plot1D->GetYMinimum(); else return plot2D->GetPlot()->GetYMinimum();}; - /** Get Y Maximum value from plot */ - double GetYMaximum() { if(plot_in_scope==1) return plot1D->GetYMaximum(); else return plot2D->GetPlot()->GetYMaximum();}; - -public slots: -/** To select 1D or 2D plot - @param i is 1 for 1D, else 2D plot */ -void SelectPlot(int i=2); -/** To select 1D plot */ -void Select1DPlot() {SelectPlot(1);} -/** To select 2D plot */ -void Select2DPlot() {SelectPlot(2);} -/** To clear plot */ -void Clear1DPlot(); -/** Creates a clone of the plot */ -void ClonePlot(); -/** Closes all the clone plots */ -void CloseClones(); -/** Saves all the clone plots */ -void SaveClones(); -/** To Save plot */ -void SavePlot(); -/** Save all plots **/ -void SaveAll(bool enable){saveAll = enable;}; -/** Sets persistency from plot tab */ -void SetPersistency(int val); -/** sets style of plot to lines*/ -void SetLines(bool enable){lines = enable;}; -/** sets markers */ -void SetMarkers(bool enable){markers = enable;}; -/** sets the scan argument to prepare the plot*/ -void SetScanArgument(int scanArg); -/** sets stop_signal to true */ -void StopAcquisition(){ stop_signal = true; }; -/** Set/unset pedestal */ -void SetPedestal(bool enable); -/** Recalculate Pedestal */ -void RecalculatePedestal(); -/** Set/unset accumulate */ -void SetAccumulate(bool enable); -/** Reset accumulation */ -void ResetAccumulate(); -/** Display Statistics */ -void DisplayStatistics(bool enable); - - - - - - -private: -/** Initializes all its members and the thread */ -void Initialization(); -/** Sets up the widget */ -void SetupWidgetWindow(); - - -/** Gets the image title */ -const char* GetImageTitle() {return imageTitle.c_str();} -/** Gets the hist title for a 1D plot */ -const char* GetHistTitle(int i) {return (i>=0&&i=0&&isetStyle(QwtPlotCurve::Lines); else h->setStyle(QwtPlotCurve::Dots); -#if QWT_VERSION<0x060000 - if(markers) h->setSymbol(*marker); else h->setSymbol(*noMarker); -#else - if(markers) h->setSymbol(marker); else h->setSymbol(noMarker); -#endif -}; - - -/** Find Statistics - * @param min is the minimum value - * @param max is the maximum value - * @param sum is the sum of all values - * @param array is the array to get statistics from - * @param size is the size of the array */ -void GetStatistics(double &min, double &max, double &sum, double* array, int size); - - -/** - * Convert data from char* to double based on bit mode (get gain data from plot if enabled for jungfrau - * @param dest destination double array - * @param source source char array - * @param size number of pixels - * @param databytes number of data bytes - * @param dr dynamic range - * @param gaindest NULL if not required, points to a double array to be filled up if gain data enabled - * - */ -void toDoublePixelData(double* dest, char* source,int size, int databytes, int dr, double* gaindest = NULL); - -private slots: -/** To update plot - * */ -void UpdatePlot(); -/** To start or stop acquisition - * @param start is 1 to start and 0 to stop acquisition - * */ -void StartDaq(bool start); -/** To set the reference to zero after closing a clone - * @param id is the id of the clone - * */ -void CloneCloseEvent(int id); -/**After a pause, the gui is allowed to collect the data - * this is called when it is over - * */ -void UpdatePause(){data_pause_over=true;}; -/** Shows the first save error message while automatic saving - * @param fileName file name of the first file that it tried to save. - * */ -void ShowSaveErrorMessage(QString fileName); -/**Shows an error message when acquisition stopped unexpectedly - * @param status is the status of the detector - * */ -void ShowAcquisitionErrorMessage(QString status); -/** - * Enable Gain Plot - * @param e true for enable, false for disable - */ -void EnableGainPlot(bool e); - - -private: -/** The sls detector object */ -multiSlsDetector *myDet; - -/** detectot type */ -slsDetectorDefs::detectorType detType; - - -/** Widgets needed to plot the clone */ -/** Max Number of Clone Windows */ -static const int MAXCloneWindows = 50; -/** Array of clone window widget pointers */ -qCloneWidget *winClone[MAXCloneWindows]; - -/** Widgets needed to set up plot*/ -QGroupBox *boxPlot; -QGridLayout *layout; -QGridLayout *plotLayout; -/** Timer to update plot */ -QTimer* plot_update_timer; - -/** Timer to pause getting data from client */ -QTimer* data_pause_timer; -bool data_pause_over; - - -/** 1D object */ -SlsQt1DPlot* plot1D; -/** 2D object */ -SlsQt2DPlotLayout* plot2D; -/** vector of 1D hist values */ -QVector plot1D_hists; - -/**label with frame index for those with many frames per file*/ -QLabel *histFrameIndexTitle; - - -/** Current Measurement */ -int currentMeasurement; -/** currentFrame */ -int currentFrame; -/** variable to check if its the nth frame */ -int numFactor; -/** current Scan Division Level */ -int currentScanDivLevel; -/** current scan Value */ -double currentScanValue; -/** Number of Exposures */ -int number_of_exposures; -/** Number of Frames Per Measurement */ -int number_of_frames; -/** Duration between Exposures */ -double acquisitionPeriod; -/** Acquisition Time */ -double exposureTime; -/** Current file index*/ -int currentFileIndex; -/** Current frame index*/ -int currentFrameIndex; - -/**variables for threads */ -/** */ -volatile bool stop_signal; -/** */ -pthread_mutex_t last_image_complete_mutex; - -/**variables for histograms */ -/** X Axis Title in 2D */ -QString imageXAxisTitle; -/** Y Axis Title in 2D */ -QString imageYAxisTitle; -/** Z Axis Title in 2D */ -QString imageZAxisTitle; -/** X Axis Title in 1D */ -QString histXAxisTitle; -/** Y Axis Title in 1D */ -QString histYAxisTitle; -/** Title for all the graphs in 1D */ -std::string histTitle[MAX_1DPLOTS]; -/** Title in 2D */ -std::string imageTitle; -/** plot Title */ -QString plotTitle; -/** plot Title prefix */ -QString plotTitle_prefix; -/** 1D or 2D */ -unsigned int plot_in_scope; -/** Number of Pixels in X Axis */ -unsigned int nPixelsX; -/** Number of angle Pixels in X Axis */ -int nAnglePixelsX; -/** Number of pixel bins in Y Axis */ -unsigned int nPixelsY; -/** Min Pixel number for Y Axis*/ -double minPixelsY; -/** Max Pixel number for Y Axis*/ -double maxPixelsY; -/** starting pixel */ -double startPixel; -/** end Pixel*/ -double endPixel; -/** pixel width */ -double pixelWidth; - -/** Current Image Number */ -unsigned int lastImageNumber; - -/** Number of graphs in 1D */ -unsigned int nHists; -/** Total Number of X axis values/channels in 1D */ -int histNBins; -/** X Axis value in 1D */ -double* histXAxis; -/** Y Axis value in 1D */ -double* histYAxis[MAX_1DPLOTS]; -/** X Axis for angles in 1D */ -double* histXAngleAxis; -/** Y Axis for angles in 1D (no persistency) */ -double* histYAngleAxis; -/** X Axis for trimbits in 1D */ -double* histTrimbits; - - -/** Current Image Values in 2D */ -double* lastImageArray; - -/**persistency to be reached*/ -int persistency; -/** persistency takes time to reach as it increases per frame - * this is the current one */ -int currentPersistency; -/** to update the progress for each getData() so that - * measurement tab can request on a timer basis*/ -int progress; -/**If plot is enabled from plot tab*/ -bool plotEnable; -/**If plot is dotted */ -bool lines; -bool markers; -/** Plot marker */ -QwtSymbol *marker; -QwtSymbol *noMarker; -/** Save all plots */ -bool saveAll; -/** If error, while automatically saving plots, checks this at the end of an acquistion */ -bool saveError; -/** index of last saved image for automatic saving*/ -int lastSavedFrame; -/** index of measurement number of last saved image for automatic saving*/ -int lastSavedMeasurement; -/**if an acquisition is running, so as not to refresh tab - * and also to update plot only if running (while creating clones)*/ -bool running; - -/** if the min/max of x and y has been changed, - * to notify while plotting */ -bool XYRangeChanged; -/**the specific min/max of x/y*/ -double XYRangeValues[4]; -/**if the specific min/max of x/y is enabled */ -bool IsXYRange[4]; - -/** Default timer between plots*/ -static const double PLOT_TIMER_MS; - -/** Specific timer value between plots */ -double timerValue; -/** every nth frame when to plot */ -int frameFactor; -/**if frame is enabled in measurement tab */ -bool isFrameEnabled; -/**if trigger is enabled in measurement tab */ -bool isTriggerEnabled; - -/** scan arguments*/ -int scanArgument; - -/** histogram arguments*/ -int histogramArgument; - -/** enable angle plot */ -bool anglePlot; -/** prevents err msg displaying twice when detector stopped, "transmitting" */ -bool alreadyDisplayed; - -/**saves the file path and file name, not to access shared memory while running*/ -QString filePath; -QString fileName; - -/** Max Number of Clone Windows */ -static const int TRIM_HISTOGRAM_XMAX = 63; - -/**if the values increment backwards*/ -bool backwardScanPlot; - -/**if files will be saved and index increased*/ -bool fileSaveEnable; - - -/** true of originally 2d */ -bool originally2D; - - -//pedstal -/** Number of pedestal frames*/ -static const int NUM_PEDESTAL_FRAMES = 20; -/** set/unset pedestal*/ -bool pedestal; -/** pedestal values */ -double* pedestalVals; -/** temporary pedestal values to hide while recalculating*/ -double* tempPedestalVals; -/** count for 20 frames to calculate the pedestal */ -int pedestalCount; -/** start pedestal calculation */ -bool startPedestalCal; - -//accumulation -/** set/unset accumulation */ -bool accumulate; -/** to reset accumulation */ -bool resetAccumulate; - -/** range for binary plot output */ -bool binary; -int binaryFrom; -int binaryTo; - -/** this is set when client starts/stops acquisition - * and is reset once the gui really starts/stops */ -bool clientInitiated; - - -/** display statistics widgets */ -QWidget *widgetStatistics; -QLabel *lblMinDisp; -QLabel *lblMaxDisp; -QLabel *lblSumDisp; - -bool displayStatistics; - - -/* histogram */ -bool histogram; -int histFrom; -int histTo; -double histSize; -QwtPlotGrid *grid; -QwtPlotHistogram *plotHistogram; -QVector histogramSamples; - - -bool plotRequired; - - -/** 2D object second plot */ -SlsQt2DPlotLayout* gainplot2D; -/** Current Image Values in 2D gain plot */ -double* gainImageArray; -/** gain plot enable, enabled if gain data has been extracted and is available */ -bool gainPlotEnable; -/** gain data enable, enabled if gain data to be extracted from normal data */ -bool gainDataEnable; - -const static int npixelsx_jctb = 400; -int npixelsy_jctb; - -signals: -void UpdatingPlotFinished(); -void InterpolateSignal(bool); -void ContourSignal(bool); -void LogzSignal(bool); -void LogySignal(bool); -void ResetZMinZMaxSignal(bool,bool,double,double); -void SetCurrentMeasurementSignal(int); -void saveErrorSignal(QString); -void AcquisitionErrorSignal(QString); -void UpdatePlotSignal(); -void GainPlotSignal(bool); -}; - - - -#endif /* QDRAWPLOT_H */ diff --git a/slsDetectorGui/include/qScanWidget.h b/slsDetectorGui/include/qScanWidget.h deleted file mode 100644 index 329a211da..000000000 --- a/slsDetectorGui/include/qScanWidget.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * qScanWidget.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QSCANWIDGET_H_ -#define QSCANWIDGET_H_ - -#include "qDefs.h" - -/** Form Header */ -#include "ui_form_scan.h" -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ -#include -/** C++ Include Headers */ -#include -#include -using namespace std; - - -class qScanWidget : public QWidget,private Ui::ScanObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qScanWidget(QWidget *parent, multiSlsDetector*& detector); - - ~qScanWidget(); - - /**to update the widgets*/ - void Refresh(); - - - /**number of scan widgets*/ - static int NUM_SCAN_WIDGETS; - -private: - /** The sls detector object */ - multiSlsDetector *myDet; - /**id of the scan widget*/ - int id; - /**type of steps*/ - enum sizeIndex{RangeValues, CustomValues, FileValues}; - enum modes{None,EnergyScan,ThresholdScan,TrimbitsScan,PositionScan,CustomScript,NumModes}; - static const string modeNames[NumModes]; - - /**values*/ - int actualNumSteps; - vector positions; - - /**non error font*/ - QPalette normal; - QPalette red; - QString customTip; - QString fileTip; - QString rangeTip; - - /**widgets needed for diff size types*/ - QButtonGroup *btnGroup; - QStackedLayout *stackedLayout; - QLabel *lblFrom; - QDoubleSpinBox *spinFrom; - QLabel *lblTo; - QDoubleSpinBox *spinTo; - QLabel *lblSize; - QDoubleSpinBox *spinSize; - QComboBox *comboCustom; - QPushButton *btnCustom; - QLineEdit *dispFile; - QPushButton *btnFile; - - - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals */ - void Initialization(); - - /** Sets up all the parameters from server/client */ - void LoadPositions(); - - /** Sets up the scan parameters - * returns if it was set - */ - int SetScan(int mode); - -private slots: -/** Enables widgets depending on which size is clicked. - * Options: constant size,specific values,values from file - * */ -void EnableSizeWidgets(); - -/** Sets the scan or script. Accordingly enables, disables other widgets - * @param mode value chosen*/ -void SetMode(int mode); - -/** Browse for the script - * */ -void BrowsePath(); - -/** Sets the script file - * */ -void SetScriptFile(); - -/** Set Parameter - * */ -void SetParameter(); - -/** Set precision - * @param value value of precision to be set - * */ -void SetPrecision(int value); - -/** Set number of steps - * */ -void SetNSteps(); - -/**Checks if size is zero and return FAIL if it does - * */ -int RangeCheckSizeZero(); - -/**returns ok and number of steps if valid - * @param number of steps - * */ -int RangeCheckNumValid(int &num); - -/**returns fail if to is not exact - * */ -int RangeCheckToValid(); - -/** Sets number of steps if from changed - * */ -void RangeFromChanged(); - -/** Sets number of steps if to changed - * */ -void RangeToChanged(); - -/** Sets s of steps if size changed - * */ -void RangeSizeChanged(); - -/** Set range for scan - * */ -void SetRangeSteps(); - - -/** Range type: If size is changed, - * the Number of steps is calculated - * */ -//void RangeCalculateNumSteps(); - -/** Range type: If size is changed, the To is calculated - * */ -//void RangeCalculateTo(); - - -/** Set custom steps - * returns OK if set properly - * */ -int SetCustomSteps(); - -/** Delete custom steps - * */ -void DeleteCustomSteps(); - -/** Reads the file to get the steps - * */ -void SetFileSteps(); - -/** Browses for the file path for steps - * */ -void BrowseFileStepsPath(); - - - -signals: -void EnableScanBox(); -}; - - - - -#endif /* QSCANWIDGET_H_ */ - diff --git a/slsDetectorGui/include/qServer.h b/slsDetectorGui/include/qServer.h deleted file mode 100644 index bd26080c6..000000000 --- a/slsDetectorGui/include/qServer.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * qServer.h.h - * - * Created on: Feb 27, 2013 - * Author: Dhanya Maliakal - */ -#ifndef QSERVER_H -#define QSERVER_H - - -/** Qt Project Class Headers */ -#include "sls_detector_defs.h" -#include "qDefs.h" -class qDetectorMain; -/** Project Class Headers */ -class multiSlsDetector; -class MySocketTCP; -/** Qt Include Headers */ -#include -/** C++ Include Headers */ - - -/** - *@short Sets up the gui server - */ -class qServer: public QWidget, public virtual slsDetectorDefs{ - Q_OBJECT - - -public: - /** \short The constructor */ - qServer(qDetectorMain *t); - /** Destructor */ - ~qServer(); - - /** Start or Stop Gui Server - * @param start is 1 to start and 0 to stop - */ - int StartStopServer(int start); - -private: - /** assigns functions to the fnum enum */ - int FunctionTable(); - - /** Decodes Function */ - int DecodeFunction(MySocketTCP* sock); - - /** Exit Server */ - int ExitServer(); - - - /** - * Static function - Thread started which listens to client gui. - * Called by StartStopServer() - * @param this_pointer pointer to this object - */ - static void* StartServerThread(void *this_pointer); - - /** - * Thread started which listens to client gui. - * Called by startServerThread() - * - */ - int StartServer(); - - /** - * Static function - Thread started which listens to client gui to stop acquisition - * Called by StartStopServer() - * @param this_pointer pointer to this object - */ - static void* StopServerThread(void *this_pointer); - - /** - * Thread started which listens to client gui to stop acquisition. - * Called by startServerThread() - * - */ - int StopServer(); - - - - /** Get Detector Status */ - int GetStatus(); - - /** Starts Acquisition */ - int StartAcquisition(); - - /** Stops Acquisition */ - int StopsAcquisition(); - - /** Acquire - blocking */ - int Acquire(); - - - - /**The measurement tab object*/ - qDetectorMain *myMainTab; - - /** tcp socket to gui client */ - MySocketTCP *mySocket; - /** tcp socket to gui client to stop or get status */ - MySocketTCP *myStopSocket; - - /** server port number*/ - int port_no; - - /** Lock Status if server locked to a client */ - int lockStatus; - - /** Function List */ - static const int NUMBER_OF_FUNCTIONS = 256; - int (qServer::*flist[NUMBER_OF_FUNCTIONS])(); - - - /** if the gui server thread is running*/ - static int gui_server_thread_running; - /** thread listening to gui client*/ - pthread_t gui_server_thread; - /** thread also listening to gui client to stop acquisition*/ - pthread_t gui_stop_server_thread; - - /** server started */ - int checkStarted; - int checkStopStarted; - - /** Message */ - char mess[MAX_STR_LENGTH]; - - -signals: - void ServerStoppedSignal(); - -}; - - - -#endif /* QSERVER_H */ diff --git a/slsDetectorGui/include/qTabActions.h b/slsDetectorGui/include/qTabActions.h deleted file mode 100644 index d5d497fde..000000000 --- a/slsDetectorGui/include/qTabActions.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * qTabActions.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABACTIONS_H_ -#define QTABACTIONS_H_ - -#include "qDefs.h" - - -/* Qt Project Class Headers */ -#include "qActionsWidget.h" -#include "qScanWidget.h" -/** C++ Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -/** - *@short sets up the acions parameters - */ -class qTabActions:public QWidget{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qTabActions(QWidget *parent,multiSlsDetector*& detector); - - /** Destructor - */ - ~qTabActions(); - - /** To refresh and update widgets - */ - void Refresh(); - - -public slots: - /** Disable Positions - * @param enable true if to disable - * */ - void EnablePositions(bool enable); - - -private: - /** The sls detector object */ - multiSlsDetector *myDet; - - slsDetectorDefs::detectorType detType; - - - enum actionIndex{ - ActionStart, - Scan0, - Scan1, - ActionBefore, - NumPositions, - HeaderBefore, - HeaderAfter, - ActionAfter, - ActionStop, - NumTotalActions}; - - QGridLayout *gridLayout; - QButtonGroup *group; - QPalette *palette; - - /** all action widget objects */ - qActionsWidget *actionWidget[6]; - qScanWidget *scanWidget[2]; - QWidget *positionWidget; - QPushButton *btnExpand[NumTotalActions]; - QLabel *lblName[NumTotalActions]; - - - /** NumPositions widget */ - QLabel *lblNumPos; - QLabel *lblPosList; - QSpinBox *spinNumPos; - QComboBox *comboPos; - QPushButton *btnDelete; - QCheckBox *chkInvert; - QCheckBox *chkSeparate; - QCheckBox *chkReturn; - - double *positions; - QPalette normal; - QIcon *iconPlus; - QIcon *iconMinus; - - - /** Sets up the widget */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals */ - void Initialization(); - - /** creates the Num Positions object */ - void CreatePositionsWidget(); - - /** Returns the index in each of the classes - * of actionwidget and scanwidget - * @param index the index in the list of all widgets - * returns actual index of the class - */ - int GetActualIndex(int index); - - /** Updates to green color if collapsed and mode not none - */ - void UpdateCollapseColors(); - - - - -private slots: - /** To Expand the Action Widget - * */ - void Expand(QAbstractButton *button); - - /** Sets the positions list and the number of positions - * */ - void SetPosition(); - - /** Deletes current position - * */ - void DeletePosition(); - - -signals: - void EnableScanBox(); - -}; - -#endif /* QTABACTIONS_H_ */ - diff --git a/slsDetectorGui/include/qTabAdvanced.h b/slsDetectorGui/include/qTabAdvanced.h deleted file mode 100644 index e07305d77..000000000 --- a/slsDetectorGui/include/qTabAdvanced.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - * qTabAdvanced.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABADVANCED_H_ -#define QTABADVANCED_H_ - -#include "qDefs.h" -#include "sls_detector_defs.h" - -/** Form Header */ -#include "ui_form_tab_advanced.h" -/** Project Class Headers */ -class multiSlsDetector; -class slsDetector; -/** Qt Project Class Headers */ -class qDrawPlot; -/** Qt Include Header */ -#include -#include -/** - *@short sets up the advanced parameters - */ -class qTabAdvanced:public QWidget, private Ui::TabAdvancedObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - * @param plot plot object reference - */ - qTabAdvanced(QWidget *parent,multiSlsDetector*& detector, qDrawPlot*& plot); - - /** Destructor - */ - ~qTabAdvanced(); - -public slots: - /** To refresh and update widgets - */ - void Refresh(); - -private: - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals - */ - void Initialization(); - - /** Add ROI Input - * @param num number of inputs to add - */ - void AddROIInput(int num); - - /** Checks for a few conditions before trimming - /returns OK or FAIL - */ - int validateBeforeTrimming(); - - /** update the setalltrimbits value from server - */ - void updateAllTrimbitsFromServer(); - - -private slots: - - /** Enable/Disable Energy and Calibration Logs - */ - void SetLogs(); - - /** Set acquisition time - */ - void SetExposureTime(); - - /** Set the Threshold dac value - */ - void SetThreshold(); - - /** Set output directory for trimming - */ - void SetOutputFile(); - - /** Browse output directory for trimming - */ - void BrowseOutputFile(); - - /** Enables trimming method and calls SetTrimmingMethod if enabled - * @param enable to enable trimming - */ - void EnableTrimming(bool enable); - - /** Enabling resolution and Counts if this is enabled - * @param enable to enable - */ - void SetOptimize(bool enable); - - /** Sets the trimming method - * @param mode trimming method - */ - void SetTrimmingMethod(int mode); - - /** Ensures the right trimming mode and Executes Trimming - */ - void StartTrimming(); - - /** Updates the plot with trimbits from detector/shared memory - */ - void UpdateTrimbitPlot(int id); - - /** Sets control port - * @param port control port - */ - void SetControlPort(int port); - - /** Sets stop port - * @param port stop port - */ - void SetStopPort(int port); - - /** Sets receiver tcp port - * @param port receiver tcp port - */ - void SetRxrTCPPort(int port); - - /** Sets receiver udp port - * @param port receiver udp port - */ - void SetRxrUDPPort(int port); - - /** Sets client zmq receiver port - * @param port client zmq receiver port - */ - void SetCltZmqPort(int port); - - /** Sets receiver zmq transmitting port - * @param port receiver zmq transmitting port - */ - void SetRxrZmqPort(int port); - - /** Sets receiver online - * @param index 1 for online and 0 for offline - */ - void SetReceiverOnline(int index); - - /** Sets detector online - * @param index 1 for online and 0 for offline - */ - void SetOnline(int index); - - /** Sets network parameters like receiver udp ip, - * receiver udp mac, detector ip and detector mac - */ - void SetNetworkParameters(); - - /** Sets client zmq ip to listen to - */ - void SetClientZMQIP(); - - /** Sets receiver zmq ip to stream from - */ - void SetReceiverZMQIP(); - - /** Sets the receiver. which also sets the receiver parameters - */ - void SetReceiver(); - - /** Add ROI Input if the value changed in the last slot - */ - void AddROIInputSlot(){AddROIInput(1);}; - - /** Clears all the ROI inputs - */ - void clearROI(); - - /** Gets ROIs from detector and updates it - */ - void updateROIList(); - - /** Sets ROI in detector - */ - void setROI(); - - /** Clears ROI in detector - */ - void clearROIinDetector(); - - /** Clears ROI in detector - */ - void SetDetector(int index); - - /** Set all trimbits to a value - */ - void SetAllTrimbits(); - - /** Set storage cells */ - void SetNumStoragecells(int value); - - /** Set sub frame exposure time */ - void SetSubExposureTime(); - - /** Set sub frame period */ - void SetSubPeriod(); - - -private: - /** The multi detector object */ - multiSlsDetector *myDet; - - /** The sls detector object */ - slsDetector *det; - - /** detector type */ - slsDetectorDefs::detectorType detType; - - /** The Plot widget */ - qDrawPlot *myPlot; - - QButtonGroup *btnGroup; - - /** Tool Tip for the output dir */ - QString outputDirTip; - QString errOutputTip; - QString errOnlineTip; - QString detOnlineTip; - QString rxrOnlineTip; - QPalette red; - - /** Trimming mode */ - slsDetectorDefs::trimMode trimmingMode; - static const int TRIMMING_DYNAMIC_RANGE = 32; - static const int TRIMMING_FRAME_NUMBER = 1; - static const int TRIMMING_TRIGGER_NUMBER = 1; - static const int TRIMMING_PROBE_NUMBER = 0; - - bool isEnergy; - bool isAngular; - - /** ROI */ - vector lblFromX; - vector spinFromX; - vector lblFromY; - vector spinFromY; - vector lblToX; - vector spinToX; - vector lblToY; - vector spinToY; - int numRois; - - /** sub period tool tip variables*/ - QString acqSubPeriodTip; - QString errSubPeriodTip; - - void CheckAcqPeriodGreaterThanExp(); - - -}; - - - -#endif /* QTABADVANCED_H_ */ diff --git a/slsDetectorGui/include/qTabDataOutput.h b/slsDetectorGui/include/qTabDataOutput.h deleted file mode 100644 index 9f0957cd8..000000000 --- a/slsDetectorGui/include/qTabDataOutput.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * qTabDataOutput.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABDATAOUTPUT_H_ -#define QTABDATAOUTPUT_H_ - -#include "qDefs.h" - - -/** Form Header */ -#include "ui_form_tab_dataoutput.h" -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ -#include - - -/** - *@short sets up the DataOutput parameters - */ -class qTabDataOutput:public QWidget, private Ui::TabDataOutputObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qTabDataOutput(QWidget *parent,multiSlsDetector*& detector); - - /** Destructor - */ - ~qTabDataOutput(); - - /** To refresh and update widgets - */ - void Refresh(); - - /** verify output directories - * /returns success or fail - */ - int VerifyOutputDirectory(); - -private: - /** The sls detector object */ - multiSlsDetector *myDet; - - /** detector type */ - slsDetectorDefs::detectorType detType; - - - QString flatFieldTip; - QString errFlatFieldTip; - QString outDirTip; - QPalette red; - QPalette black; - QPalette *red1; - QPalette *black1; - - /** enum for the Eiger clock divider */ - enum {FullSpeed, HalfSpeed, QuarterSpeed, SuperSlowSpeed, NumberofSpeeds}; - /** enum for the Eiger readout flags1 */ - enum {Continous, Storeinram}; - /** enum for the Eiger readout flags2 */ - enum {Parallel, NonParallel, Safe}; - - -/** methods */ - /** Sets up the widget */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals */ - void Initialization(); - - /** Populate the readouts - */ - void PopulateDetectors(); - - /** update speed */ - void UpdateSpeedFromServer(); - - /** update flags */ - void UpdateFlagsFromServer(); - - /** update flags */ - void SetupFileFormat(); - - /** update file format */ - void UpdateFileFormatFromServer(); - - /** update overwrite enable */ - void UpdateFileOverwriteFromServer(); - - -private slots: - -/** Open dialog to choose the output directory */ -void BrowseOutputDir(); - -/**set flat field file*/ -void SetFlatField(); - -/** update flat field correction from server */ -void UpdateFlatFieldFromServer(); - -/**browse flat field*/ -void BrowseFlatFieldPath(); - -/**rate correction*/ -void SetRateCorrection(int deadtime=0); - -/** default rate correction */ -void SetDefaultRateCorrection(); - -/** update rate correction from server */ -void UpdateRateCorrectionFromServer(); - -/**angular correction*/ -void SetAngularCorrection(); - -/**discard bad channels*/ -void DiscardBadChannels(); - -/** set output directory*/ -void SetOutputDir(); - -/** set output directory*/ -void GetOutputDir(); - -/** enable 10GbE */ -void EnableTenGigabitEthernet(bool enable, int get=0); - -/** set speed */ -void SetSpeed(); - -/** set flags */ -void SetFlags(); - -/** set file format */ -void SetFileFormat(int format); - -/** set overwrite enable */ -void SetOverwriteEnable(bool enable); - -signals: -/**signal to enable/disable positions in Actions*/ -void AngularConversionSignal(bool); -}; - - - -#endif /* QTABDATAOUTPUT_H_ */ diff --git a/slsDetectorGui/include/qTabDebugging.h b/slsDetectorGui/include/qTabDebugging.h deleted file mode 100644 index 484dfa87d..000000000 --- a/slsDetectorGui/include/qTabDebugging.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * qTabDebugging.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABDEBUGGING_H_ -#define QTABDEBUGGING_H_ - -#include "qDefs.h" - - -/** Form Header */ -#include "ui_form_tab_debugging.h" -/** Project Class Headers */ -class multiSlsDetector; -class slsDetector; -/** Qt Include Headers */ -#include - - - -/** - *@short sets up the Debugging parameters - */ -class qTabDebugging:public QWidget, private Ui::TabDebuggingObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qTabDebugging(QWidget *parent,multiSlsDetector*& detector); - - /** Destructor - */ - ~qTabDebugging(); - - /** To refresh and update widgets - */ - void Refresh(); - -private: - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals - */ - void Initialization(); - - - -private slots: - /** Updates the module list depending on current detector - */ - void UpdateModuleList(); - - /** Updates the status depending on current detector - */ - void UpdateStatus(); - - /** Gets id and versions etc - */ - void GetInfo(); - - /** Sets id and versions on the display widget - */ - void SetParameters(QTreeWidgetItem *item); - - /** Test detector and module - */ - void TestDetector(); - -private: - /** The multi sls detector object */ - multiSlsDetector *myDet; - - /** detector type */ - slsDetectorDefs::detectorType detType; - - /**sls detecctor object */ - slsDetector *det; - - /** Tree Widget displaying the detectors, modules */ - QTreeWidget *treeDet; - /** Widget displaying the serial numbers, mac addresses etc */ - QFrame *dispFrame; - QLabel *lblDetectorId; - QLabel *lblDetectorSerial; - QLabel *lblDetectorFirmware; - QLabel *lblDetectorSoftware; - QLabel *lblModuleId; - QLabel *lblModuleFirmware; - QLabel *lblModuleSerial; - QPalette *blue; -}; - - - -#endif /* QTABDEBUGGING_H_ */ diff --git a/slsDetectorGui/include/qTabDeveloper.h b/slsDetectorGui/include/qTabDeveloper.h deleted file mode 100644 index 10fc334aa..000000000 --- a/slsDetectorGui/include/qTabDeveloper.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * qTabDeveloper.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABDEVELOPER_H_ -#define QTABDEVELOPER_H_ - -#include "qDefs.h" - -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -class qDetectorMain; - -/** C++ Include Headers */ -#include -#include -using namespace std; - - -/**To override the spin box class to have an id and emit it*/ -class MyDoubleSpinBox:public QDoubleSpinBox{ -Q_OBJECT -private: - int myId; - private slots: - void valueChangedWithID() {emit editingFinished(myId);}; - public: - /** Overridden constructor from QDoubleSpinBox */ - MyDoubleSpinBox(int id,QWidget* parent = 0) - :QDoubleSpinBox(parent),myId(id){ - //setParent(parent); - connect(this,SIGNAL(editingFinished()), - this,SLOT(valueChangedWithID())); - } - signals: - void editingFinished(int myId); -}; - - -/** - *@short sets up the Developer parameters - */ -class qTabDeveloper:public QWidget { - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qTabDeveloper(qDetectorMain *parent,multiSlsDetector*& detector); - - /** Destructor - */ - ~qTabDeveloper(); - - /** To stop ADC Timer when starting acquisition - */ - void StopADCTimer(){if(adcTimer) adcTimer->stop();}; - -private: - /** parent widget */ - qDetectorMain *thisParent; - /** The sls detector object */ - multiSlsDetector *myDet; - /** The sls detector object */ - slsDetector *det; - /** detector type */ - slsDetectorDefs::detectorType detType; - /**number of dac widgets*/ - static int NUM_DAC_WIDGETS; - /**number of adc widgets*/ - static int NUM_ADC_WIDGETS; - - static const int ADC_TIMEOUT = 5000; - - vectordacNames; - vectoradcNames; - - - /**widgets needed*/ - QGridLayout *layout; - QScrollArea *scroll; - QGroupBox *boxDacs; - QGroupBox *boxAdcs; - QLabel *lblDacs[20]; - QLabel *lblAdcs[20]; - MyDoubleSpinBox *spinDacs[20]; - QLabel *lblDacsmV[20]; - QLineEdit *spinAdcs[20]; - QLabel *lblHV; - QComboBox *comboHV; - QTimer *adcTimer; - QGridLayout *dacLayout; - QString tipHV; - QPalette red; - QComboBox *comboDetector; - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals - */ - void Initialization(); - - /** Sets up the DAC Widgets - */ - void CreateDACWidgets(); - - /** Sets up the ADC Widgets - */ - void CreateADCWidgets(); - - /** Gets the sls index to set/get dac/adc - * @param index is the gui dac/adc index - * returns the sls index - */ - slsDetectorDefs::dacIndex getSLSIndex(int index); - -public slots: - - /** To refresh and update widgets - */ - void Refresh(); - -private slots: - /** Refreshes the adcs - */ - void RefreshAdcs(); - - /** Set Dac values - * @param id id of dac - */ - void SetDacValues(int id); - - /** Set High Voltage - */ - void SetHighVoltage(); -}; - - - -#endif /* QTABDEVELOPER_H_ */ diff --git a/slsDetectorGui/include/qTabMeasurement.h b/slsDetectorGui/include/qTabMeasurement.h deleted file mode 100644 index 362fba590..000000000 --- a/slsDetectorGui/include/qTabMeasurement.h +++ /dev/null @@ -1,207 +0,0 @@ -/* - * qTabMeasurement.h - * - * Created on: May 2, 2012 - * Author: l_maliakal_d - */ -#ifndef QTABMEASUREMENT -#define QTABMEASUREMENT - -#include "qDefs.h" - - -/** Form Header */ -#include "ui_form_tab_measurement.h" -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Project Class Headers */ -#include -#include "qDrawPlot.h" -class qDetectorMain; - -/** - *@short sets up the measurement parameters - */ -class qTabMeasurement:public QWidget, private Ui::TabMeasurementObject{ - Q_OBJECT - -public: - /** \short The constructor - * This tab allows to change the detector settings, the threshold, the number of (non real time) measurements, - * the acquisition time, the file name, the start run index and shows the current progress of the measurement - * via a progress bar and labels inidicating the current position, scan variable, frame number etc. - * Contains the start and stop acquisition button - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - * @param plot plot object reference - */ - qTabMeasurement(qDetectorMain *parent,multiSlsDetector*& detector, qDrawPlot*& plot); - - /** Destructor - */ - ~qTabMeasurement(); - - /** To refresh and update widgets - */ - void Refresh(); - - /** To enable expert mode - * @param enable to enable if true - */ - void SetExpertMode(bool enable); - - /** Returns the status of the acquisition in gui - */ - bool GetStartStatus(){return (!btnStart->isEnabled());}; - - /** Click the Start/Stop Acquisition button - * This is used if this command came from gui client - */ - void ClickStartStop(){startAcquisition();myPlot->SetClientInitiated();}; - - /** Returns progress bar value */ - int GetProgress(){return progressBar->value();}; - - -public slots: - - /** update plot is finished, - * changes start/stop text and enables/disables all widgets - */ - void UpdateFinished(); - - /** updates the current measurement - * @param val the value to be updated - */ - void SetCurrentMeasurement(int val); - - - - -private: - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up the timing mode - */ - void SetupTimingMode(); - - /** Sets up all the slots and signals - */ - void Initialization(); - - /** Enables/Disables all the widgets - */ - void Enable(bool enable); - - /** Validates before enabling or disabling probes */ - void EnableProbes(); - - /** Get timing mode from detector - * @param startup is true when gui has just started up*/ - void GetModeFromDetector(bool startup = false); - - /** Checks if acquisition period is greater than exposure time - * and dsplays in red as a warning */ - void CheckAcqPeriodGreaterThanExp(); - - -private slots: - /** Sets the timing mode - * @ param mode cane be None, Auto, Gated, Trigger Exposure Series, - * Trigger Frame, Trigger Readout, External Trigger Window - */ - void SetTimingMode(int mode); - - /** Set number of measurements - * @param num number of measurements to be set */ - void setNumMeasurements(int num); - - /** Set file name - */ - void setFileName(); - - /** Set index of file name - * @param index index of selection - */ - void setRunIndex(int index); - - /** starts Acquisition - */ - void startAcquisition(); - - /** stops Acquisition - */ - void stopAcquisition(); - - /** Set number of frames - * @param val number of frames to be set - */ - void setNumFrames(int val); - - /** Set acquisition time - */ - void setExposureTime(); - - /** Set frame period between exposures - */ - void setAcquisitionPeriod(); - - /** Set number of triggers - * @param val number of triggers to be set - */ - void setNumTriggers(int val); - - /** Set delay - */ - void setDelay(); - - /** Set number of gates - * @param val number of gates to be set - */ - void setNumGates(int val); - - /** Set number of probes - * @param val number of probes to be set - */ - void setNumProbes(int val); - - /** Update progress*/ - void UpdateProgress(); - - /** Enable write to file */ - void EnableFileWrite(bool enable); - - -private: - /** parent widget */ - qDetectorMain *thisParent; - /** The sls detector object */ - multiSlsDetector *myDet; - /** The Plot widget */ - qDrawPlot *myPlot; - /** detector type */ - slsDetectorDefs::detectorType detType; - /** enum for the timing mode */ - enum{None, Auto, Trigger_Exp_Series, Trigger_Readout, Gated, Gated_Start, Burst_Trigger, NumTimingModes}; - /** timer to update the progress*/ - QTimer *progressTimer; - /** tool tip variables*/ - QString acqPeriodTip; - QString errPeriodTip; - QPalette red; - /** expert mode */ - bool expertMode; - /** to access items in settings combobox */ - QStandardItemModel* model; - -signals: - void StartSignal(); - void StopSignal(); - void CheckPlotIntervalSignal(); -}; - - - -#endif /* QTABMEASUREMENT */ diff --git a/slsDetectorGui/include/qTabMessages.h b/slsDetectorGui/include/qTabMessages.h deleted file mode 100644 index 8dd7f611b..000000000 --- a/slsDetectorGui/include/qTabMessages.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * qTabMessages.h - * - * Created on: Jun 26, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABMESSAGES_H_ -#define QTABMESSAGES_H_ - - -#include "qDefs.h" - - - -/** Project Class Headers */ -class qDetectorMain; -/** Qt Include Headers */ -#include -#include -#include -#include -#include "qDebugStream.h" - -/** - *@short sets up the Messages parameters - */ -class qTabMessages:public QWidget{ - Q_OBJECT - -public: - /** \short The constructor - * @param det the qDetectorMain class reference - */ - qTabMessages(qDetectorMain* m); - - /** Destructor - */ - ~qTabMessages(); - - -private: - /** The qDetectorMain object */ - qDetectorMain *myMainTab; - - /** Log of executed commands */ - QTextEdit *dispLog; - - /** To save the log to file */ - QPushButton *btnSave; - - /** To clear the log to file */ - QPushButton *btnClear; - - /** This class creates the log */ - qDebugStream *qout; - qDebugStream *qerr; - - string errMsg; - -/** methods */ - /** Sets up the widget */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals */ - void Initialization(); - -private slots: -/** Stream log to textedit in GUI */ -void customEvent(QEvent *e); - -/** Save Log to File*/ -void SaveLog(); - -/** Clear Log to File*/ -void ClearLog(); - - - -}; - - - - - -#endif /* QTABMESSAGES_H_ */ diff --git a/slsDetectorGui/include/qTabPlot.h b/slsDetectorGui/include/qTabPlot.h deleted file mode 100644 index b2dbbd208..000000000 --- a/slsDetectorGui/include/qTabPlot.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - * qTabPlot.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABPLOT_H_ -#define QTABPLOT_H_ - -#include "qDefs.h" - - -/** Form Header */ -#include "ui_form_tab_plot.h" -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Project Class Headers */ -class qDrawPlot; -/** Qt Include Headers */ -#include -#include -#include - - -/** - *@short sets up the Plot parameters - */ -class qTabPlot:public QWidget, private Ui::TabPlotObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - * @param plot plot object reference - */ - qTabPlot(QWidget *parent,multiSlsDetector*& detector, qDrawPlot*& plot); - - /** Destructor - */ - ~qTabPlot(); - - /** Sets the scan argument of the plot - */ - void SetScanArgument(); - - /** To refresh and update widgets - */ - void Refresh(); - - -private: - /** The sls detector object */ - multiSlsDetector *myDet; - - /** The Plot widget */ - qDrawPlot *myPlot; - - - /** 1d/2d plot */ - bool isOneD; - bool isOriginallyOneD; - - /**is set if its a possible wrong interval between plots*/ - bool wrongInterval; - - QStackedLayout *stackedLayout; - QSpinBox *spinNthFrame; - QDoubleSpinBox *spinTimeGap; - QComboBox *comboTimeGapUnit; - QButtonGroup *btnGroupScan; - QButtonGroup *btnGroupPlotType; - QButtonGroup *btnGroupHistogram; - - /** some Default Values */ - static QString defaultPlotTitle; - static QString defaultHistXAxisTitle; - static QString defaultHistYAxisTitle; - static QString defaultImageXAxisTitle; - static QString defaultImageYAxisTitle; - static QString defaultImageZAxisTitle; - - /** scans */ - static const QString modeNames[5]; - - /** error palette*/ - QPalette *red; - QString intervalTip; - - - - - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up all the slots and signals - */ - void Initialization(); - - -public slots: - /** Set frequency between plots*/ - void SetFrequency(); - - /** Enable Scan box - */ - void EnableScanBox(); - - -private slots: - /** Selects the plot to display, enables/disables widgets - * @param b true to select plot dimension 1, else false to select 2D - */ - void Select1DPlot(bool b); - - /**Enables Persistency depending on Superimpose checkbox */ - void EnablePersistency(bool enable); - - /**Sets the titles in plot axis */ - void SetTitles(); - - /** Enables/Sets default Titles to default */ - void EnableTitles(); - - /** check aspect ratio */ - void checkAspectRatio(); - - /** maintain aspect ratio - * @param axis axis to be changed: 0 for x(y axis values changed), 1 for y (xaxis values changes), -1 for the larger one (aspect ratio checked) - */ - void maintainAspectRatio(int axis); - - /** Enables range of the X axis */ - void EnableXRange(); - - /** Enables range of the Y axis */ - void EnableYRange(); - - /** Enables range of all axes, called by EnableXRange and EnableYRange */ - void EnableRange(); - - /** Sets the range of the x axis */ - void SetXAxisRange(); - - /** Sets the range of the y axis */ - void SetYAxisRange(); - - /** Sets the range of both axes, called by SetXAxisRange and SetYAxisRange */ - void SetAxesRange(); - - /** Sets the range of the z axis */ - void SetZRange(); - - /** Enables the range of the z axis */ - void EnableZRange(); - - /** Return true if valid */ - bool CheckZRange(QString value); - - /** Set Plot to none, data graph, histogram*/ - void SetPlot(); - - /** Change pages in plot options box to the right*/ - void SetPlotOptionsRightPage(); - - /** Change pages in plot options box to the left*/ - void SetPlotOptionsLeftPage(); - - /** Plot binary plot */ - void SetBinary(); - - /** Set histogram options */ - void SetHistogramOptions(); - - /** Enable Gap pixels */ - void EnableGapPixels(bool enable); - -signals: - void DisableZoomSignal(bool); - void ResetZMinZMaxSignal(bool,bool,double,double); - -}; - - - -#endif /* QTABPLOT_H_ */ diff --git a/slsDetectorGui/include/qTabSettings.h b/slsDetectorGui/include/qTabSettings.h deleted file mode 100644 index ddb0d4da6..000000000 --- a/slsDetectorGui/include/qTabSettings.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * qTabSettings.h - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#ifndef QTABSETTINGS_H_ -#define QTABSETTINGS_H_ - -#include "qDefs.h" - - -/** Form Header */ -#include "ui_form_tab_settings.h" -/** Project Class Headers */ -class multiSlsDetector; -/** Qt Include Headers */ -#include - -/** - *@short sets up the Settings parameters - */ -class qTabSettings:public QWidget, private Ui::TabSettingsObject{ - Q_OBJECT - -public: - /** \short The constructor - * @param parent is the parent tab widget - * @param detector is the detector returned from the detector tab - */ - qTabSettings(QWidget *parent,multiSlsDetector*& detector); - - /** Destructor - */ - ~qTabSettings(); - - /** To refresh and update widgets - */ - void Refresh(); - - /** To enable expert mode - * @param enable to enable if true - */ - void SetExpertMode(bool enable){expertMode = enable;}; - - - - -private: - /** The sls detector object */ - multiSlsDetector *myDet; - - /** detector type */ - slsDetectorDefs::detectorType detType; - - /** expert mode */ - bool expertMode; - - enum{Standard,Fast,HighGain,DynamicGain,LowGain,MediumGain,VeryHighGain,LowNoise, - DynamicHG0,FixGain1,FixGain2,ForceSwitchG1,ForceSwitchG2, VeryLowGain, - Undefined,Uninitialized,NumSettings}; - - /** To be able to index items on a combo box */ - QStandardItemModel* model; - QModelIndex index[NumSettings]; - QStandardItem* item[NumSettings]; - - /** Sets up the widget - */ - void SetupWidgetWindow(); - - /** Sets up the detector settings - */ - void SetupDetectorSettings(); - - /** Sets up all the slots and signals - */ - void Initialization(); - - /** Gets the dynamic range and sets it on the gui - * @param setvalue the value set by the gui when used as a check - */ - void GetDynamicRange(int setvalue = -1); - - - -private slots: -/** Set settings according to selection - * @param index index of selection - */ -void setSettings(int index); - -/** Set number of modules if possible - * @param index number of modules - */ -void SetNumberOfModules(int index); - -/** Set dynamic range if possible - * @param index selection - */ -void SetDynamicRange(int index); - -/** Set threshold energy - */ -void SetEnergy(); - - -signals: -/**Update Trimbits after Set Settings */ -void UpdateTrimbitSignal(int); -}; - - - -#endif /* QTABSETTINGS_H_ */ diff --git a/slsDetectorGui/slsDetectorGui.pro b/slsDetectorGui/slsDetectorGui.pro deleted file mode 100644 index 753da18f6..000000000 --- a/slsDetectorGui/slsDetectorGui.pro +++ /dev/null @@ -1,162 +0,0 @@ -#When using yum for qt, comment out all lines with $(QTDIR) or $(QWTDIR), but export QWTDIR = /usr/include/qwt/ -#and leave "$(QWTDIR) \"uncommented in the INCLUDEPATH - -#When using epics, uncomment epics defines, libs and a line in INCLUDEPATH - - - -QT_INSTALL_PREFIX = $(QTDIR) -QMAKE_UIC = $(QTDIR)/bin/uic -QMAKE_MOC = $(QTDIR)/bin/moc -QMAKE_RCC = $(QTDIR)/bin/rcc -QMAKE_INCDIR_QT = $(QTDIR)/include/ -QMAKE_LIBS_QT = -L$(QTDIR)/lib -QMAKE_LIBS = -L$(QTDIR)/lib - - - - -#epics -#DEFINES += EPICS VERBOSE DACS_INT PRINT_LOG #VERYVERBOSE -#LIBS = -L$(QWTDIR)/lib -lqwt -L$(QWT3D)/lib -Wl,-R$(QWTDIR)/lib -L /usr/local/epics/base/lib/$(EPICS_HOST_ARCH)/ -Wl,-R/usr/local/epics/base/lib/$(EPICS_HOST_ARCH) -lca -lCom - -#default -DEFINES += VERBOSE DACS_INT PRINT_LOG #VERYVERBOSE CHECKINFERROR -LIBS = -L$(QWTDIR)/lib -lqwt -L$(QWT3D)/lib $(LDFLAGDET) - -CXXFLAGS += -g - - -QMAKE_CXXFLAGS_WARN_ON = -w -QMAKE_CFLAGS_WARN_ON = -w - - - - -DESTDIR ?= bin -MOC_DIR = mocs -OBJECTS_DIR = objs -UI_HEADERS_DIR = forms/include -SLSDETLIB ?= ../slsDetectorSoftware -RESOURCES += icons.qrc -CONFIG += debug no_include_pwd - - - -target.path += $(DESTDIR) -documentation.path = /$(DOCPATH) -documentation.files = docs/* -INSTALLS += target -INSTALLS += documentation -QMAKE_CLEAN += docs/*/* - - - -extralib.target = extra -extralib.commands = echo `tput setaf 6`; \ - echo 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; \ - echo 'x Compiling slsDetectorGui x'; \ - echo 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; \ - echo `./updateGitVersion.sh; tput sgr0` -extralib.depends = $(target) - -QMAKE_EXTRA_TARGETS += extralib -PRE_TARGETDEPS = extra - - - - -DEPENDPATH += \ - slsDetectorPlotting/include\ - include\ - forms/include - - -INCLUDEPATH += \ - $(QWTDIR)/include\ - $(QWTDIR) \ - $(QWTDIR)/src\ - $(QWT3D)/include\ - slsDetectorPlotting/include\ - ../slsReceiverSoftware/include\ - include\ - forms/include\ - /usr/include/qwt\ #these are not included for standard installations, also bin path should include qt4 bin, not qt3 bin - /usr/include/qt4\ - /usr/include/Qt\ - /usr/include/QtCore\ - /usr/include/QtGui\ - $(INCLUDES) - -#epics -# $(INCLUDES) /usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ - - - - - - -SOURCES = \ - slsDetectorPlotting/src/SlsQt1DPlot.cxx\ - slsDetectorPlotting/src/SlsQt1DZoomer.cxx\ - slsDetectorPlotting/src/SlsQt2DHist.cxx\ - slsDetectorPlotting/src/SlsQt2DPlot.cxx\ - slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx\ - slsDetectorPlotting/src/SlsQtNumberEntry.cxx\ - src/qDetectorMain.cpp\ - src/qDrawPlot.cpp\ - src/qCloneWidget.cpp\ - src/qTabMeasurement.cpp\ - src/qTabDataOutput.cpp\ - src/qTabPlot.cpp\ - src/qTabActions.cpp\ - src/qActionsWidget.cpp\ - src/qScanWidget.cpp\ - src/qTabAdvanced.cpp\ - src/qTabSettings.cpp\ - src/qTabDebugging.cpp\ - src/qTabDeveloper.cpp\ - src/qTabMessages.cpp\ - src/qServer.cpp - -HEADERS = \ - slsDetectorPlotting/include/SlsQt1DPlot.h\ - slsDetectorPlotting/include/SlsQt1DZoomer.h\ - slsDetectorPlotting/include/SlsQt2DHist.h\ - slsDetectorPlotting/include/SlsQt2DPlot.h\ - slsDetectorPlotting/include/SlsQt2DPlotLayout.h\ - slsDetectorPlotting/include/SlsQt2DZoomer.h\ - slsDetectorPlotting/include/SlsQtValidators.h\ - slsDetectorPlotting/include/SlsQtNumberEntry.h\ - include/qDefs.h\ - include/qDebugStream.h\ - include/qDetectorMain.h\ - include/qDrawPlot.h\ - include/qCloneWidget.h\ - include/qTabMeasurement.h\ - include/qTabDataOutput.h\ - include/qTabPlot.h\ - include/qTabActions.h\ - include/qActionsWidget.h\ - include/qScanWidget.h\ - include/qTabAdvanced.h\ - include/qTabSettings.h\ - include/qTabDebugging.h\ - include/qTabDeveloper.h\ - include/qTabMessages.h\ - include/gitInfoGui.h\ - ../slsDetectorSoftware/commonFiles/sls_detector_defs.h\ - ../slsReceiverSoftware/include/sls_receiver_defs.h\ - include/qServer.h - - -FORMS = \ - forms/form_detectormain.ui\ - forms/form_tab_measurement.ui\ - forms/form_tab_dataoutput.ui\ - forms/form_tab_plot.ui\ - forms/form_tab_advanced.ui\ - forms/form_tab_settings.ui\ - forms/form_tab_debugging.ui\ - forms/form_action.ui\ - forms/form_scan.ui diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h deleted file mode 100644 index 554a17fab..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DPlot.h +++ /dev/null @@ -1,173 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - * Modifications: - * 19.06.2012: {Some functions have been added by Dhanya to enable zooming in and out - * without using mouse control: - * DisableZoom, - * SetXMinMax,SetYMinMax, - * GetXMinimum,GetXMaximum,GetYMinimum,GetYMaximum} - * */ - -#ifndef SLSQT1DPLOT_H -#define SLSQT1DPLOT_H - -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#include "ansi.h" - - -#include -#include -#include -#include -#include "SlsQt1DZoomer.h" -#include -using namespace std; - -class QPen; -class SlsQt1DPlot; - -class SlsQtH1D:public QwtPlotCurve{ - - public: - SlsQtH1D(QString title, int n, double xmin, double xmax, double* data=0); - SlsQtH1D(QString title, int n, double* data_x, double* data_y); - ~SlsQtH1D(); - - void Attach(SlsQt1DPlot* p); - void Detach(SlsQt1DPlot* p); - - int SetLineColor(int c=-1); - int SetLineWidth(int w=1); - void SetLineStyle(int s=0); - - void SetData(int n, double xmin, double xmax, double* d=0); - void SetData(int n, double* dx, double* dy); - - double* GetX() {return x;} - double* GetY() {return y;} - int GetNBinsX() {return ndata;} - - double FillBin(int bx, double v=1); - double Fill(double x, double v=1); - double SetBinContent(int bx,double v); - double SetContent(double x,double v); - int FindBinIndex(double px); - - double GetXMin() {return x[0];} - double GetFirstXgtZero() {return firstXgt0;} - double GetXMax() {return x[ndata-1];} - double GetYMin() {return ymin;} - double GetFirstYgtZero() {return firstYgt0;} - double GetYMax() {return ymax;} - - SlsQtH1D* Add(double v); - - - - private: - int ndata; - int n_array; - double dx; - double *x,*y; - double ymin,ymax; - double firstXgt0,firstYgt0; - - void Initailize(); - int SetUpArrays(int n); - int CheckIndex(int bx); - - QPen* pen_ptr; -}; - - -class SlsQtH1DList{ - public: - SlsQtH1DList(SlsQtH1D* hist=0); - ~SlsQtH1DList(); - - SlsQtH1D* Add(SlsQtH1D* h); - void Remove(SlsQtH1D* h); - void Print(); - - SlsQtH1D* Hist() {return the_hist;} //if no hist returns 0 - SlsQtH1DList* Next() {return the_next;} - - -private: - SlsQtH1DList* the_next; - SlsQtH1D* the_hist; -}; - - -class SlsQt1DPlot:public QwtPlot{ - Q_OBJECT - - public: - SlsQt1DPlot(QWidget* = NULL); - ~SlsQt1DPlot(); - - void SetTitle(const char *t); - void SetXTitle(const char* title); - void SetYTitle(const char* title); - - void InsertHLine(double y); - void RemoveHLine(); - void InsertVLine(double v); - void RemoveVLine(); - - - /** This group of functions have been added by Dhanya on 19.06.2012 to be able to - use zooming functionality without mouse control*/ - void DisableZoom(bool disableZoom); - void SetXMinMax(double min,double max){setAxisScale(QwtPlot::xBottom,min,max);}; - void SetYMinMax(double min,double max){setAxisScale(QwtPlot::yLeft,min,max);}; - double GetXMinimum(){return hist_list->Hist()->GetXMin();}; - double GetXMaximum(){return hist_list->Hist()->GetXMax();}; - double GetYMinimum(){return hist_list->Hist()->GetYMin();}; - double GetYMaximum(){return hist_list->Hist()->GetYMax();}; - /**---*/ - - - void SetZoom(double xmin,double ymin,double x_width,double y_width); - void SetZoomBase(double xmin,double ymin,double x_width, double y_width){ zoomer->SetZoomBase(xmin,ymin,x_width,y_width);} - - void alignScales(); - private: - - SlsQtH1DList* hist_list; - SlsQt1DZoomer* zoomer; - QwtPlotPanner* panner; - - QwtPlotMarker *hline; - QwtPlotMarker *vline; - - void SetupZoom(); - void UnknownStuff(); - //void alignScales(); - - void CalculateNResetZoomBase(); - void NewHistogramAttached(SlsQtH1D* h); - void HistogramDetached(SlsQtH1D* h); - - void SetLog(int axisId, bool yes); - - friend void SlsQtH1D::Attach(SlsQt1DPlot* p); - friend void SlsQtH1D::Detach(SlsQt1DPlot* p); - - - public slots: - void UnZoom(); - void Update(); - - void SetLogX(bool yes=1); - void SetLogY(bool yes=1); - - protected: - -}; - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DZoomer.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DZoomer.h deleted file mode 100644 index 3bcb35ee7..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt1DZoomer.h +++ /dev/null @@ -1,81 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - */ - -#ifndef SLSQT1DZOOMER_H -#define SLSQT1DZOOMER_H - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - - -#include -#include -#include - -class SlsQtH1D; - -class SlsQt1DZoomer:public QwtPlotZoomer{ - private: - double x0,x1,y0,y1; - double firstXgt0,firstYgt0; - bool xIsLog,yIsLog; - - public: -#if QWT_VERSION < 0x060100 - SlsQt1DZoomer(QwtPlotCanvas *canvas):QwtPlotZoomer(canvas){ -#else - SlsQt1DZoomer(QWidget *canvas):QwtPlotZoomer(canvas){ -#endif - setTrackerMode(AlwaysOn); - xIsLog=yIsLog=0; - } - - double x() {return x0;} - double x_firstGreaterThan0() {return firstXgt0;} - double w() {return x1-x0;} - - double y() {return y0;} - double y_firstGreaterThan0() {return firstYgt0;} - double h() {return y1-y0;} - - void SetZoomBase(double xmin,double ymin,double x_width, double y_width); - void SetZoomBase(SlsQtH1D* h); - void ExtendZoomBase(SlsQtH1D* h); - void ResetZoomBase(); - - bool IsLogX(){ return xIsLog;} - bool IsLogY(){ return yIsLog;} - bool SetLogX(bool yes) { return xIsLog=yes;} - bool SetLogY(bool yes) { return yIsLog=yes;} - - -#if QWT_VERSION<0x060000 - virtual QwtText trackerText(const QwtDoublePoint &pos) const{ -#else - virtual QwtText trackerText(const QPointF &pos) const{ -#endif - QColor bg(Qt::white); - -#if QT_VERSION >= 0x040300 - bg.setAlpha(200); -#endif - -#if QWT_VERSION<0x060000 - QwtText text = QwtPlotZoomer::trackerText(pos); -#else - QPoint p=pos.toPoint(); - QwtText text = QwtPlotZoomer::trackerText(p); -#endif - text.setBackgroundBrush( QBrush( bg )); - return text; - } - -}; - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DHist.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DHist.h deleted file mode 100644 index a71a32676..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DHist.h +++ /dev/null @@ -1,145 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - */ - - -#ifndef SLSQT2DHIST_H -#define SLSQT2DHIST_H - - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - - - -#if QT_VERSION >= 0x040000 -#include -#endif -#include -#include -#include -#include - - -class SlsQt2DHist: public QwtRasterData{ - - private: - - double x_min,x_max,y_min,y_max; - double x_width,y_width; - - int nx,ny,nb; - double *data; - double z_min,z_mean,z_max; - bool z_mean_has_been_calculated; - - int nx_array,ny_array; - - bool interp; - - static double value_between_points(double p1,double v1,double p2,double v2,double p){ //linear extrap - return (v2-v1)/(p2-p1)*(p-p1)+v1; - } - - public: - SlsQt2DHist(int nbinsx=10, double xmin=0, double xmax=10, int nbinsy=10, double ymin=0, double ymax=10, double* d=0,double zmin=0,double zmax=-1); - virtual ~SlsQt2DHist(); - - double GetXMin() {return x_min;} - double GetXMax() {return x_max;} - double GetXBinWidth() {return x_width;} - double GetYMin() {return y_min;} - double GetYMax() {return y_max;} - double GetYBinWidth() {return y_width;} - double GetMinimum() {return z_min;} - double GetMaximum() {return z_max;} - double GetMean(); - - int GetNBinsX(){return nx;} - int GetNBinsY(){return ny;} - double GetBinValue(int bx,int by); - int GetBinIndex(int bx,int by); - double* GetDataPtr(){return data;} - - void Interpolate(bool on=1) {interp=on;} - void SetBinValue(int bx,int by,double v); - void SetData(int nbinsx, double xmin, double xmax, int nbinsy,double ymin, double ymax,double *d,double zmin=0, double zmax=-1); - - double SetMinimumToFirstGreaterThanZero(); - void SetMinimum(double zmin) {z_min=zmin;} - void SetMaximum(double zmax) {z_max=zmax;} - void SetMinMax(double zmin=0,double zmax=-1); - - int FindBinIndex(double x, double y); - - - - virtual QwtRasterData *copy() const{ - //this function does not create a new SlsQt2DHistData instance, - //just passes a pointer so that data is common to both the copy and the original instance - return (QwtRasterData*) this; - } - -#if QWT_VERSION<0x060000 - virtual QwtDoubleInterval range() const{ return QwtDoubleInterval(z_min,z_max);} -#else - virtual QwtInterval range() const{ return QwtInterval(z_min,z_max);} - virtual QwtInterval interval(Qt::Axis axis) const { - switch (axis){ - case Qt::ZAxis: - return QwtInterval(z_min,z_max); - case Qt::XAxis: - return QwtInterval(x_min,x_max); - case Qt::YAxis: - return QwtInterval(y_min,y_max); - default: - return QwtInterval(z_min,z_max); - }; - }; -#endif - - - - virtual double value(double x, double y) const{ - //if(!interp){ //default is box like plot - int index = int((x-x_min)/x_width) + int((y-y_min)/y_width)*nx; - if(index<0||index>nb) index = nb; - if(!interp) return data[index]; - //} - - - int x_int = int((x-x_min)/x_width-0.5); - if(x_int<0) x_int = 0; else if(x_int>nx-2) x_int = nx-2; - int y_int = int((y-y_min)/y_width-0.5); - if(y_int<0) y_int = 0; else if(y_int>ny-2) y_int = ny-2; - - int b00 = x_int*ny + y_int; - int b01 = x_int*ny + y_int+1; - int b10 = (x_int+1)*ny + y_int; - int b11 = (x_int+1)*ny + y_int+1; - - //vertical extrap - double y0 = y_min+(y_int+0.5)*y_width; - double y1 = y_min+(y_int+1.5)*y_width; - double left_v = value_between_points(y0,data[b00],y1,data[b01],y); - double right_v = value_between_points(y0,data[b10],y1,data[b11],y); - //horazontal extrap - - - - return 0.5; - - - return value_between_points(x_min+(x_int+0.5)*x_width,left_v, - x_min+(x_int+1.5)*x_width,right_v,x); - } - -}; - - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h deleted file mode 100644 index 8b1944392..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlot.h +++ /dev/null @@ -1,118 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - * Modifications: - * 19.06.2012: {Some functions have been added by Dhanya to enable zooming in and out - * without using mouse control: - * DisableZoom, - * SetXMinMax,SetYMinMax, - * GetXMinimum,GetXMaximum,GetYMinimum,GetYMaximum} - */ - - -#ifndef SLSQT2DPLOT_H -#define SLSQT2DPLOT_H - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - - - -#include -#include -#include - -#include "SlsQt2DZoomer.h" -#include "SlsQt2DHist.h" - - -class QwtPlotPanner; -class QwtScaleWidget; -class QwtLinearColorMap; - - -class SlsQt2DPlot: public QwtPlot{ - Q_OBJECT - -private: - QwtPlotSpectrogram *d_spectrogram; - SlsQt2DHist* hist; - SlsQt2DZoomer* zoomer; - QwtPlotPanner* panner; - QwtScaleWidget *rightAxis; - - QwtLinearColorMap* colorMapLinearScale; - QwtLinearColorMap* colorMapLogScale; -#if QWT_VERSION<0x060000 - QwtValueList* contourLevelsLinear; - QwtValueList* contourLevelsLog; -#else - QList contourLevelsLinear; - QList contourLevelsLog; -#endif - - void SetupZoom(); - void SetupColorMap(); - - QwtLinearColorMap* myColourMap(QVector colourStops); - QwtLinearColorMap* myColourMap(int log=0); - - int isLog; - - -public: - SlsQt2DPlot(QWidget * = NULL); - - // SlsQt2DHist *GetHistogram(){ return hist; } - void UnZoom(bool replot=true); - void SetZoom(double xmin,double ymin,double x_width,double y_width); - - - /** This group of functions have been added by Dhanya on 19.06.2012 to be able to - use zooming functionality without mouse control*/ - void DisableZoom(bool disableZoom); - void SetXMinMax(double min,double max){setAxisScale(QwtPlot::xBottom,min,max);}; - void SetYMinMax(double min,double max){setAxisScale(QwtPlot::yLeft,min,max);}; - double GetXMinimum(){return hist->GetXMin();}; - double GetXMaximum(){return hist->GetXMax();}; - double GetYMinimum(){return hist->GetYMin();}; - double GetYMaximum(){return hist->GetYMax();}; - /**---*/ - - - double GetZMinimum(){ return hist->GetMinimum();} - double GetZMaximum(){ return hist->GetMaximum();} - void SetZMinMax(double zmin=0,double zmax=-1); - void SetZMinimumToFirstGreaterThanZero(){hist->SetMinimumToFirstGreaterThanZero();} - double GetZMean() { return hist->GetMean();} - - void SetData(int nbinsx, double xmin, double xmax, int nbinsy,double ymin, double ymax,double *d,double zmin=0, double zmax=-1){ - hist->SetData(nbinsx,xmin,xmax,nbinsy,ymin,ymax,d,zmin,zmax); - } - - - - double* GetDataPtr() {return hist->GetDataPtr();} - int GetBinIndex(int bx,int by) {return hist->GetBinIndex(bx,by);} - int FindBinIndex(double x,double y) {return hist->FindBinIndex(x,y);} - void SetBinValue(int bx,int by,double v) { hist->SetBinValue(bx,by,v);} - double GetBinValue(int bx,int by) {return hist->GetBinValue(bx,by);} - - - void FillTestPlot(int i=0); - void Update(); - -public slots: - void LogZ(bool on=1); - void InterpolatedPlot(bool on); - void showContour(bool on); - void showSpectrogram(bool on); - // void printPlot(); - -}; - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlotLayout.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlotLayout.h deleted file mode 100644 index 2d2315f77..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DPlotLayout.h +++ /dev/null @@ -1,82 +0,0 @@ -/** - * @author Ian Johnson - * @version 1.0 - * @comments - * 19.06.2012 All modifications with the Ian flag has been made since - * z_range_ne and the buttons are defined in another class. - * Logz button and z_range_ne have wrappers to connect them - * 05.05.2013 Added ResetZMinZMax - */ - - -#ifndef SLSQT2DPLOTLAYOUT_H -#define SLSQT2DPLOTLAYOUT_H - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - - -#include -#include - -#include "SlsQtNumberEntry.h" -#include "SlsQt2DPlot.h" - -class QGridLayout; -class QString; -class QToolButton; - - -class SlsQt2DPlotLayout: public QGroupBox{ - Q_OBJECT - -public: - - SlsQt2DPlotLayout(QWidget * = NULL); - ~SlsQt2DPlotLayout(); - - SlsQt2DPlot* GetPlot(){return the_plot;} - void SetXTitle(QString st); - void SetYTitle(QString st); - void SetZTitle(QString st); - void UpdateNKeepSetRangeIfSet(); - - -private: - QGridLayout* the_layout; - QToolButton* btnInterpolate; - QToolButton* btnContour; - QToolButton* btnLogz; - SlsQt2DPlot* the_plot; - SlsQtNumberEntry* z_range_ne; - -#ifndef IAN - bool zRangeChecked; -#endif - - void CreateTheButtons(); - void ConnectSignalsAndSlots(); - void Layout(); - -public slots: -void SetZScaleToLog(bool yes); -void ResetRange(); - -#ifndef IAN -void SetZRange(double,double); -void EnableZRange(bool enable); -void ResetZMinZMax(bool zmin, bool zmax, double min, double max); - -#endif - -signals: -void InterpolateSignal(bool); -void ContourSignal(bool); - -}; - -#endif - diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DZoomer.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DZoomer.h deleted file mode 100644 index 5fed37f1a..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQt2DZoomer.h +++ /dev/null @@ -1,78 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - * Dhanya-05.12.2012- included an additional header - */ - - -#ifndef SLSQT2DZOOMER_H -#define SLSQT2DZOOMER_H - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - - -/**included by Dhanya on 05.12.2012 to avoid compile time errors with the latest gcc*/ -#include -/**end of Change by Dhanya*/ - -#include -#include - -#include "SlsQt2DHist.h" - -class SlsQt2DZoomer:public QwtPlotZoomer{ - private: - SlsQt2DHist* hist; - - public: -#if QWT_VERSION < 0x060100 - SlsQt2DZoomer(QwtPlotCanvas *canvas):QwtPlotZoomer(canvas){ -#else - SlsQt2DZoomer(QWidget *canvas):QwtPlotZoomer(canvas){ -#endif - setTrackerMode(AlwaysOn); - } - - void SetHist(SlsQt2DHist* h){ - hist=h; - } - - -#if QWT_VERSION<0x060000 - virtual QwtText trackerText(const QwtDoublePoint &pos) const{ -#else - virtual QwtText trackerTextF(const QPointF &pos) const{ -#endif - QColor bg(Qt::white); -#if QT_VERSION >= 0x040300 - bg.setAlpha(200); -#endif - - - //QwtText text = QwtPlotZoomer::trackerText(pos); - - static QwtText text; - if(hist){ - static char t[200]; - sprintf(t,"%3.2f, %3.2f, %3.2f",pos.x(),pos.y(),hist->value(pos.x(),pos.y())); - text.setText(t); - }else { -#if QWT_VERSION<0x060000 - QwtText text = QwtPlotZoomer::trackerText(pos); -#else - QPoint p=pos.toPoint(); - QwtText text = QwtPlotZoomer::trackerText(p); -#endif - - } - text.setBackgroundBrush( QBrush( bg )); - return text; - } -}; - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQtNumberEntry.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQtNumberEntry.h deleted file mode 100644 index dbeb0a31e..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQtNumberEntry.h +++ /dev/null @@ -1,147 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - */ - -#ifndef SLSQTNUMBERENTRY_H -#define SLSQTNUMBERENTRY_H - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - - -#include -#include - -class QGridLayout; - -class QLabel; -class QLineEdit; -class QIntValidator; -class QDoubleValidator; -class QCheckBox; -class QComboBox; -class QSpinBox; - -#include "SlsQtValidators.h" - -class SlsQtNumberEntry:public QWidget{ - Q_OBJECT - - public: - //type=0->units only, type=1->int,type=2->double, type=3->spinbox - //adding middle text will automatically add a second number field - SlsQtNumberEntry(QWidget *parent,int with_checkbox=0, char *start_string=0, int num_type=0, char *middle_string=0, int num2_type=0, int n_units=0, char** units=0, double* unit_factors=0, char* end_string=0); - //without unit box - SlsQtNumberEntry(QWidget *parent,int with_checkbox, char *start_strin, int num_type, char *middle_string, int num2_type, char* end_string); - - - ~SlsQtNumberEntry(); - - void Enable(bool en_flag=1); - void Disable(); - void EnableNumberField(int which_number_field,bool en_flag=1); //which_number_field is 0 or 1 - void DisableNumberField(int which_number_field); - - void AddCheckBox(); - void SetFrontText(char* s); - void SetMiddleText(char* s); - void SetBackText(char* s); - void SetupNumberField(int type,int which_number_field=0); - void SetUnits(int n_units,char** units,double* unit_factors); - - void SetMinimumNumberWidth(int nchar_width,int which_number_field=0); - void SetNDecimalsOfDoubleValidators(int ndecimals); - void SetNDecimalsOfDoubleValidator(int ndecimals,int which_number_field=0); - void SetMinimumUnitWidth(int nchar_width); - - bool Enabled(); - bool CheckBoxState(); - bool IsValueOk(int which_number_field=0); - - const char* GetFrontText(); - const char* GetMiddleText(); - const char* GetBackText(); - - int GetNumberInt(int which_number_field=0,bool* ok=0); - double GetNumber(int which_number_field=0,bool *ok=0); - - int GetValueInt(int which_number_field=0,bool* ok=0); - double GetValue(int which_number_field=0,bool *ok=0); - - int GetComboBoxIndex(); - double GetComboBoxValue(); - - private: - void SetupNumberEntry(int with_checkbox=0, char *start_string=0, int num_type=0, char *middle_string=0, int num2_type=0, int n_units=0, char** units=0, double* unit_factors=0, char* end_string=0); - - QGridLayout* layout; //default layout - - QCheckBox* check_box; - QLabel* front_text; - QLabel* middle_text; - QLineEdit* num_field[2]; - QSpinBox* spin_box[2]; - bool num_field_enabled[2]; - - SlsQtIntValidator* validator_int[2]; - SlsQtDoubleValidator* validator_double[2]; - QComboBox* unit_cbb; - double* factors; - QLabel* back_text; - - void SetText(char* s, QLabel** pp); - void SetLayout(); - - - public slots: - void FirstValueEntered(); - void SecondValueEntered(); - void UnitSelected(); - - void SetRange(int min, int max, int which_number_field=0); - void SetRange(double min, double max, int which_number_field=0); - void SetFirstRange(int min, int max) {SetRange(min,max,0);} - void SetSecondRange(int min, int max) {SetRange(min,max,1);} - - double SetValue(double v, int which_number_field=0); - void SetFirstValue(int v) {SetValue(v,0);} - void SetSecondValue(int v) {SetValue(v,1);} - void SetFirstValue(double v) {SetValue(v,0);} - void SetSecondValue(double v) {SetValue(v,1);} - - // double SetNumber(int v, int which_number_field=0); - double SetNumber(double v, int which_number_field=0); - void SetFirstNumber(int v) {SetNumber(v,0);} - void SetSecondNumber(int v) {SetNumber(v,1);} - void SetFirstNumber(double v) {SetNumber(v,0);} - void SetSecondNumber(double v) {SetNumber(v,1);} - - int SetComboBoxIndex(int index); - - void CheckBoxClicked(); - void PrintTheValue(); - - void RefreshFirstNumberEntry(); - void RefreshSecondNumberEntry(); - void RefreshNumberEntery(int number_field=0); - - signals: - void CheckBoxChanged(bool state); - void CheckBoxChanged(SlsQtNumberEntry* ptr); - void AValueChanged(SlsQtNumberEntry* ptr); - void FirstValueChanged(int value); - void FirstValueChanged(double value); - void FirstValueChanged(SlsQtNumberEntry* ptr); - void SecondValueChanged(int value); - void SecondValueChanged(double value); - void SecondValueChanged(SlsQtNumberEntry* ptr); - void UnitChanged(double); - void UnitChanged(SlsQtNumberEntry* ptr); -}; - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/include/SlsQtValidators.h b/slsDetectorGui/slsDetectorPlotting/include/SlsQtValidators.h deleted file mode 100644 index bd2d70efd..000000000 --- a/slsDetectorGui/slsDetectorPlotting/include/SlsQtValidators.h +++ /dev/null @@ -1,79 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - */ - -#ifndef SLSQTVALIDATORS_H -#define SLSQTVALIDATORS_H - -#ifndef IAN -typedef double double32_t; -typedef float float32_t; -typedef int int32_t; -#endif - -#include -#include - -#include -#include - -using std::cout; -using std::endl; - -class SlsQtIntValidator:public QIntValidator{ - - public: - SlsQtIntValidator(QWidget *parent):QIntValidator(parent){} - - virtual void fixup (QString& text) const { - bool ok = 1; - int v = text.toInt(&ok); - - if(!ok){ - v = text.toDouble(&ok); - if(ok) text = QString::number(v); - else text = QString::number(0); - fixup(text); - } - - if(vtop()) text = QString::number(top()); - } - -}; - -class SlsQtDoubleValidator:public QDoubleValidator{ - - public: - SlsQtDoubleValidator(QWidget *parent):QDoubleValidator(parent){} - - virtual void fixup (QString& text) const { - - bool ok = 1; - double v = text.toDouble(&ok); - - if(!ok){ - text = QString::number(0); - fixup(text); - } - - int nd = this->decimals(); //ndigest behind zero - if(vtop()){ - v = floor(top()*pow(10,nd))/pow(10,nd); - text = QString::number(v,'g'); - }else{ - v = round(v*pow(10,nd))/pow(10,nd); - text = QString::number(v,'g'); - } - } - } - -}; - -#endif diff --git a/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cxx b/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cxx deleted file mode 100644 index 1382e0e50..000000000 --- a/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DPlot.cxx +++ /dev/null @@ -1,517 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "SlsQt1DPlot.h" - -#if QWT_VERSION >= 0x060100 -#define QwtLog10ScaleEngine QwtLogScaleEngine -#endif - -using namespace std; - -SlsQtH1D::SlsQtH1D(QString title,int n, double min, double max, double* data):QwtPlotCurve(title){ - Initailize(); - SetData(n,min,max,data); -} - -SlsQtH1D::SlsQtH1D(QString title,int n, double* data_x, double* data_y):QwtPlotCurve(title){ - Initailize(); - SetData(n,data_x,data_y); -} - -void SlsQtH1D::Initailize(){ - ndata=n_array=0; - x=y=0; - pen_ptr = new QPen(); - SetLineColor(); -} - -SlsQtH1D::~SlsQtH1D(){delete x;delete y;delete pen_ptr;} - -void SlsQtH1D::Attach(SlsQt1DPlot* p){ - attach((QwtPlot*) p); - p->NewHistogramAttached(this); -} - -void SlsQtH1D::Detach(SlsQt1DPlot* p){ - detach(); - p->HistogramDetached(this); -} - - -int SlsQtH1D::SetLineColor(int c){ - static int last_color = 1; - if(c<0) c=(last_color+1)%3; - - switch(c){ - case 0: pen_ptr->setColor(Qt::black); break; - case 1: pen_ptr->setColor(Qt::red); break; - case 2: pen_ptr->setColor(Qt::blue); break; - case 3: pen_ptr->setColor(Qt::green); break; - case 4: pen_ptr->setColor(Qt::magenta); break; - case 5: pen_ptr->setColor(Qt::cyan); break; - case 6: pen_ptr->setColor(Qt::darkYellow); break; - case 7: pen_ptr->setColor(Qt::gray); break; - case 8: pen_ptr->setColor(Qt::darkBlue); break; - case 9: pen_ptr->setColor(Qt::darkGreen); break; - case 10: pen_ptr->setColor(Qt::darkMagenta); break; - } -/* if(c==0) pen_ptr->setColor(Qt::black); - else if(c==1) pen_ptr->setColor(Qt::red); - else pen_ptr->setColor(Qt::blue);*/ - - setPen(*pen_ptr); - - return last_color=c; -} - -int SlsQtH1D::SetLineWidth(int w){ - pen_ptr->setWidth(w); - setPen(*pen_ptr); - return w; -} - -void SlsQtH1D::SetLineStyle(int s){ - if(s==1) pen_ptr->setStyle(Qt::DashLine); - else if(s==2) pen_ptr->setStyle(Qt::DotLine); - else if(s==3) pen_ptr->setStyle(Qt::DashDotLine); - else if(s==4) pen_ptr->setStyle(Qt::DashDotDotLine); - else if(s==5) pen_ptr->setStyle(Qt::CustomDashLine); - else pen_ptr->setStyle(Qt::SolidLine); - setPen(*pen_ptr); -} - - -void SlsQtH1D::SetData(int n, double xmin, double xmax, double *data){ - n = SetUpArrays(n); - - ndata=n; - if(xmin>xmax){ - double t=xmin; - xmin=xmax; - xmax=t; - } - - dx = (xmax-xmin)/n; - ymin=ymax= data ? data[0]:0; - firstXgt0=-1; - firstYgt0=-1; - - for(int i=0;iy[i]) ymin = y[i]; - if(data&&ymax0&&(firstXgt0<0||firstXgt0>x[i])) firstXgt0=x[i]; - if(y[i]>0&&(firstYgt0<0||firstYgt0>y[i])) firstYgt0=y[i]; - } - - // cout<0&&data_x[0]>data_x[n-1]) ? 1:0; - n = SetUpArrays(n); - - ndata=n; - dx=-1; //signifies not regular intervals - - ymin=ymax= data_y ? data_y[0]:0; - - firstXgt0=-1; - firstYgt0=-1; - - for(int i=0;iy[b]) ymin = y[b]; - if(data_y&&ymax0&&(firstXgt0<0||firstXgt0>x[b])) firstXgt0=x[b]; - if(y[b]>0&&(firstYgt0<0||firstYgt0>y[b])) firstYgt0=y[b]; - } - -#if QWT_VERSION<0x060000 - setRawData(x,y,ndata); -#else - setRawSamples(x,y,ndata); -#endif -} - -int SlsQtH1D::SetUpArrays(int n){ - n = n<1 ? 1 : n; //overflow bin - - if(n+1>n_array){ - n_array = n+1; - if(x) delete x; - if(y) delete y; - x = new double [n_array]; - y = new double [n_array]; - } - - return n; -} - -double SlsQtH1D::FillBin(int bx, double v) { - bx = CheckIndex(bx); - return SetBinContent(bx,y[bx]+v); -} -double SlsQtH1D::Fill(double x, double v){return FillBin(FindBinIndex(x),v);} - -double SlsQtH1D::SetBinContent(int bx,double v){ - bx = CheckIndex(bx); - y[bx]=v; - if(bx0&&(firstYgt0<=0||y[bx]ymax) ymax = y[bx]; - } - return y[bx]; -} - -double SlsQtH1D::SetContent(double x,double v) {return SetBinContent(FindBinIndex(x),v); } - -int SlsQtH1D::FindBinIndex(double px){ - if(dx>0) CheckIndex(int((px-x[0])/dx)); - - //find closest bin - int b=0; for(;bpx) break; - - if(b==0) return 0; - else if(fabs(px-x[b-1])ndata) ? ndata : bx;}//ndata is the overflow bin - -SlsQtH1D* SlsQtH1D::Add(double v){ for(int bx=0;bxthe_hist) return hist; //already added - if(!hl->the_next) break; - hl=hl->the_next; - } - if(hl->the_hist) hl->the_next = new SlsQtH1DList(hist); - else hl->the_hist = hist; - - // Print(); - - return hist; -} - -void SlsQtH1DList::Print(){ - // cout<<"Printing List"<the_hist<<" "<the_next<the_next; - if(i>10) break; - } -} - -void SlsQtH1DList::Remove(SlsQtH1D* hist){ - // cout<<"Removing: "<the_hist!=hist) hl = hl->the_next; - else{ //match - if(!hl->the_next) hl->the_hist=0; // first the_hist is zero when there's no next - else{ - SlsQtH1DList* t = hl->the_next; - hl->the_hist = t->the_hist; - hl->the_next = t->the_next; - t->the_next = 0; - delete t; - } - } - } - // Print(); -} - - - -//1d plot stuff -SlsQt1DPlot::SlsQt1DPlot(QWidget *parent):QwtPlot(parent){ - // n_histograms_attached=0; - hline=vline=0; - hist_list = new SlsQtH1DList(); - - UnknownStuff(); - alignScales(); - SetupZoom(); - - // Assign a title -#ifndef IAN - insertLegend(new QwtLegend(), QwtPlot::BottomLegend); -#else - insertLegend(new QwtLegend(), QwtPlot::RightLegend); -#endif - - axisScaleEngine(QwtPlot::yLeft)->setAttribute(QwtScaleEngine::Floating); - axisScaleEngine(QwtPlot::xBottom)->setAttribute(QwtScaleEngine::Floating); -} - -SlsQt1DPlot::~SlsQt1DPlot(){ - delete hist_list; - - if(hline) delete hline; - if(vline) delete vline; -} - -void SlsQt1DPlot::CalculateNResetZoomBase(){ - if(hist_list->Hist()) zoomer->SetZoomBase(hist_list->Hist()); - SlsQtH1DList* hl = hist_list->Next(); - while(hl){ - if(hl->Hist()) zoomer->ExtendZoomBase(hl->Hist()); - hl=hl->Next(); - } -} - -void SlsQt1DPlot::NewHistogramAttached(SlsQtH1D* h){ - hist_list->Add(h); - CalculateNResetZoomBase(); - //commented out by dhanya to take off zooming every hist in 1d plots - //if(!hist_list->Next()) UnZoom(); - Update(); -} - -void SlsQt1DPlot::HistogramDetached(SlsQtH1D* h){ - hist_list->Remove(h); - CalculateNResetZoomBase(); - Update(); -} - -void SlsQt1DPlot::Update(){ - replot(); -} - -void SlsQt1DPlot::SetTitle(const char* title){ - setTitle(title); -} - -void SlsQt1DPlot::SetXTitle(const char* title){ - QwtText t(title); - t.setFont(QFont("Sans Serif",11,QFont::Normal)); - setAxisTitle(QwtPlot::xBottom,t); -} -void SlsQt1DPlot::SetYTitle(const char* title){ - QwtText t(title); - t.setFont(QFont("Sans Serif",11,QFont::Normal)); - setAxisTitle(QwtPlot::yLeft,t); -} - -void SlsQt1DPlot::SetLogX(bool yes){ SetLog(QwtPlot::xBottom,yes);} -void SlsQt1DPlot::SetLogY(bool yes){ SetLog(QwtPlot::yLeft,yes);} -void SlsQt1DPlot::SetLog(int axisId, bool yes){ - if(axisId==QwtPlot::xBottom) zoomer->SetLogX(yes); - if(axisId==QwtPlot::yLeft) zoomer->SetLogY(yes); - - zoomer->ResetZoomBase(); //needs to be done before setting Engine - - //the old ones are deleted by in the setAxisScaleFunction() function see: 128 of file qwt_plot_axis.cpp - if(yes) setAxisScaleEngine(axisId,new QwtLog10ScaleEngine()); - else setAxisScaleEngine(axisId,new QwtLinearScaleEngine()); - - axisScaleEngine(QwtPlot::yLeft)->setAttribute(QwtScaleEngine::Floating); - axisScaleEngine(QwtPlot::xBottom)->setAttribute(QwtScaleEngine::Floating); - - Update(); -} - -void SlsQt1DPlot::UnZoom(){ - setAxisScale(QwtPlot::xBottom,zoomer->x(),zoomer->x()+zoomer->w()); - setAxisScale(QwtPlot::yLeft,zoomer->y(),zoomer->y()+zoomer->h()); - - zoomer->setZoomBase();//Call replot for the attached plot before initializing the zoomer with its scales. - Update(); -} - -void SlsQt1DPlot::SetZoom(double xmin,double ymin,double x_width,double y_width){ - setAxisScale(QwtPlot::xBottom,xmin,xmin+x_width); - setAxisScale(QwtPlot::yLeft ,ymin,ymin+y_width); - Update(); -} - -void SlsQt1DPlot::RemoveHLine(){ - if(hline) hline->detach(); - delete hline; - hline=0; -} - -void SlsQt1DPlot::InsertHLine(double y){ - if(!hline){ - hline = new QwtPlotMarker(); - hline->setLabelAlignment(Qt::AlignRight|Qt::AlignTop); - hline->setLineStyle(QwtPlotMarker::HLine); - hline->attach(this); - } - hline->setYValue(y); -} - -void SlsQt1DPlot::RemoveVLine(){ - if(vline) vline->detach(); - delete vline; - vline=0; -} - -void SlsQt1DPlot::InsertVLine(double x){ - if(!vline){ - vline = new QwtPlotMarker(); - vline->setLabelAlignment(Qt::AlignRight|Qt::AlignTop); - vline->setLineStyle(QwtPlotMarker::VLine); - vline->attach(this); - } - vline->setXValue(x); -} - - - - -void SlsQt1DPlot::SetupZoom(){ - // LeftButton for the zooming - // MidButton for the panning - // RightButton: zoom out by 1 - // Ctrl+RighButton: zoom out to full size - - zoomer = new SlsQt1DZoomer(canvas()); - -#if QT_VERSION < 0x040000 - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlButton); -#else - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier); -#endif - zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton); - - panner = new QwtPlotPanner((QwtPlotCanvas*)canvas()); - panner->setAxisEnabled(QwtPlot::yRight, false); - panner->setMouseButton(Qt::MidButton); - - // Avoid jumping when labels with more/less digits - // appear/disappear when scrolling vertically - - const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font()); - QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft); - sd->setMinimumExtent( fm.width("100.00") ); - - const QColor c(Qt::darkBlue); - zoomer->setRubberBandPen(c); - zoomer->setTrackerPen(c); -} - - -// Set a plain canvas frame and align the scales to it -void SlsQt1DPlot::alignScales(){ - // The code below shows how to align the scales to - // the canvas frame, but is also a good example demonstrating - // why the spreaded API needs polishing. - - ((QwtPlotCanvas*)canvas())->setFrameStyle(QFrame::Box | QFrame::Plain ); - ((QwtPlotCanvas*)canvas())->setLineWidth(1); - - for(int i = 0; i < QwtPlot::axisCnt; i++ ){ - QwtScaleWidget *scaleWidget = (QwtScaleWidget *)axisWidget(i); - if(scaleWidget) scaleWidget->setMargin(0); - QwtScaleDraw *scaleDraw = (QwtScaleDraw *)axisScaleDraw(i); - if(scaleDraw) scaleDraw->enableComponent(QwtAbstractScaleDraw::Backbone, false); - } -} - -void SlsQt1DPlot::UnknownStuff(){ -#if QWT_VERSION<0x060000 - // Disable polygon clipping - //not supported for version 6 - QwtPainter::setDeviceClipping(false); - canvas()->setPaintAttribute(QwtPlotCanvas::PaintCached, false); - canvas()->setPaintAttribute(QwtPlotCanvas::PaintPacked, false); -#else - // We don't need the cache here - ((QwtPlotCanvas*)canvas())->setPaintAttribute(QwtPlotCanvas::BackingStore, false); - -#endif - - - -#if QT_VERSION >= 0x040000 -#ifdef Q_WS_X11 - // Qt::WA_PaintOnScreen is only supported for X11, but leads - // to substantial bugs with Qt 4.2.x/Windows - canvas()->setAttribute(Qt::WA_PaintOnScreen, true); -#endif -#endif -} - - - -//Added by Dhanya on 19.06.2012 to disable zooming when any of the axes range has been set -void SlsQt1DPlot::DisableZoom(bool disableZoom){ -#ifdef VERBOSE - if(disableZoom) cout<<"Disabling zoom"<setMousePattern(QwtEventPattern::MouseSelect1,Qt::NoButton); -#if QT_VERSION < 0x040000 - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::NoButton, Qt::ControlButton); -#else - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::NoButton, Qt::ControlModifier); -#endif - zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::NoButton); - } - if(panner) panner->setMouseButton(Qt::NoButton); - }else { - if(zoomer){ - zoomer->setMousePattern(QwtEventPattern::MouseSelect1,Qt::LeftButton); -#if QT_VERSION < 0x040000 - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlButton); -#else - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier); -#endif - zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton); - } - if(panner) panner->setMouseButton(Qt::MidButton); - } -} - - - - diff --git a/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DZoomer.cxx b/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DZoomer.cxx deleted file mode 100644 index 31386094e..000000000 --- a/slsDetectorGui/slsDetectorPlotting/src/SlsQt1DZoomer.cxx +++ /dev/null @@ -1,109 +0,0 @@ - -/** - * @author Ian Johnson - * @version 1.0 - */ - - -#include - -#include -#include - -#include "SlsQt1DPlot.h" -#include "SlsQt1DZoomer.h" - -using namespace std; - -void SlsQt1DZoomer::ResetZoomBase(){ - SetZoomBase(x0,y0,x1-x0,y1-y0); //for going between log and nonlog plots -} - -void SlsQt1DZoomer::SetZoomBase(double xmin,double ymin,double x_width, double y_width){ - if(xIsLog&&xmin<=0){ - double xmax = xmin+x_width; - xmin = firstXgt0*0.98; - if(xmax<=xmin) x_width=firstXgt0; - else x_width=xmax-xmin; - } - if(yIsLog&&ymin<=0){ - double ymax = ymin+y_width; - ymin = firstYgt0*0.98; - if(ymax<=ymin) y_width=firstYgt0; - else y_width=ymax-ymin; - } - - if(plot()){ - if(xIsLog){ - #if QWT_VERSION < 0x50200 - float xmin_curr = plot()->axisScaleDiv(QwtPlot::xBottom)->lBound(); - float xmax_curr = plot()->axisScaleDiv(QwtPlot::xBottom)->hBound(); - #elif QWT_VERSION < 0x060100 - float xmin_curr = plot()->axisScaleDiv(QwtPlot::xBottom)->lowerBound(); - float xmax_curr = plot()->axisScaleDiv(QwtPlot::xBottom)->upperBound(); - #else - float xmin_curr = plot()->axisScaleDiv(QwtPlot::xBottom).lowerBound(); - float xmax_curr = plot()->axisScaleDiv(QwtPlot::xBottom).upperBound(); - #endif - if(xmin_currxmin+x_width) xmax_curr=xmin+x_width; - plot()->setAxisScale(QwtPlot::xBottom,xmin_curr,xmax_curr); - } - if(yIsLog){ - #if QWT_VERSION < 0x50200 - float ymin_curr = plot()->axisScaleDiv(QwtPlot::yLeft)->lBound(); - float ymax_curr = plot()->axisScaleDiv(QwtPlot::yLeft)->hBound(); - #elif QWT_VERSION < 0x060100 - float ymin_curr = plot()->axisScaleDiv(QwtPlot::yLeft)->lowerBound(); - float ymax_curr = plot()->axisScaleDiv(QwtPlot::yLeft)->upperBound(); - #else - float ymin_curr = plot()->axisScaleDiv(QwtPlot::yLeft).lowerBound(); - float ymax_curr = plot()->axisScaleDiv(QwtPlot::yLeft).upperBound(); - #endif - if(ymin_currymin+y_width) ymax_curr=ymin+y_width; - plot()->setAxisScale(QwtPlot::yLeft,ymin_curr,ymax_curr); - } - plot()->replot(); - } - -#if QWT_VERSION<0x060000 - setZoomBase(QwtDoubleRect(xmin,ymin,x_width,y_width)); -#else - setZoomBase(QRectF(xmin,ymin,x_width,y_width)); -#endif -} - -void SlsQt1DZoomer::SetZoomBase(SlsQtH1D* h){ - x0 = h->GetXMin()<0 ? h->GetXMin()*1.02 : h->GetXMin()/1.02; - x1 = h->GetXMax()<0 ? h->GetXMax()/1.02 : h->GetXMax()*1.02; - y0 = h->GetYMin()<0 ? h->GetYMin()*1.02 : h->GetYMin()/1.02; - y1 = h->GetYMax()<0 ? h->GetYMax()/1.02 : h->GetYMax()*1.02; - - firstXgt0 = h->GetFirstXgtZero(); //for log plots - firstYgt0 = h->GetFirstYgtZero(); //for log plots - - ResetZoomBase(); -} - -void SlsQt1DZoomer::ExtendZoomBase(SlsQtH1D* h){ - double h_x0 = h->GetXMin()<0 ? h->GetXMin()*1.02 : h->GetXMin()/1.02; - double h_x1 = h->GetXMax()<0 ? h->GetXMax()/1.02 : h->GetXMax()*1.02; - double h_y0 = h->GetYMin()<0 ? h->GetYMin()*1.02 : h->GetYMin()/1.02; - double h_y1 = h->GetYMax()<0 ? h->GetYMax()/1.02 : h->GetYMax()*1.02; - - if(h_x0x1) x1 = h_x1; - if(h_y0y1) y1 = h_y1; - - if(h->GetFirstXgtZero()GetFirstXgtZero(); - if(h->GetFirstYgtZero()GetFirstYgtZero(); - - // cout<<"extend "< -#include -#include "SlsQt2DHist.h" - -using std::cout; -using std::endl; - -SlsQt2DHist::SlsQt2DHist(int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double ymax, double* d,double zmin,double zmax):QwtRasterData(){ - x_min=0;x_max=0;y_min=0;y_max=0; - interp=0; - nx_array=ny_array=0;data=0; - SetData(nbinsx,xmin,xmax,nbinsy,ymin,ymax,d,zmin,zmax); -} - - -SlsQt2DHist::~SlsQt2DHist(){if(data) delete [] data;} - -int SlsQt2DHist::GetBinIndex(int bx, int by){ - int b = bx*ny+by; - if(b<0 || b>=nb){ - cout<<"GetBinIndex:: Incorrect indicies bx and by returning overflow bin;"<nx_array*ny_array){ - if(data) delete [] data; - data = new double [nbinsx*nbinsy+1]; //one for under/overflow bin - nx_array = nbinsx; - ny_array = nbinsy; - } - nx=nbinsx; - ny=nbinsy; - nb=nx*ny; - data[nb]=0;//set over flow to zero - if(d){ - memcpy(data,d,nb*sizeof(double)); - SetMinMax(zmin,zmax); - } -} - -void SlsQt2DHist::SetMinMax(double zmin,double zmax){ - if(zminz_max) z_max=data[i]; - z_mean+=data[i]; - } - z_mean/=nb; - if(z_min>0) z_min/=1.02; else z_min*=1.02; - if(z_max>0) z_max*=1.02; else z_max/=1.02; - } -#if QWT_VERSION<0x060000 - ; -#else - setInterval( Qt::ZAxis,QwtInterval(z_min,z_max)); -#endif - -} - -double SlsQt2DHist::GetMean(){ - if(!z_mean_has_been_calculated){ - z_mean_has_been_calculated = 1; - z_mean=0; - for(int i=0;i0 && data[i] -#include -#include -#include -#include - -#if QT_VERSION >= 0x040000 -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -#include "SlsQt2DPlot.h" - -#if QWT_VERSION >= 0x060100 -#define QwtLog10ScaleEngine QwtLogScaleEngine -#endif - -using namespace std; - -SlsQt2DPlot::SlsQt2DPlot(QWidget *parent):QwtPlot(parent){ - isLog=0; - - axisScaleEngine(QwtPlot::yLeft)->setAttribute(QwtScaleEngine::Floating); - axisScaleEngine(QwtPlot::xBottom)->setAttribute(QwtScaleEngine::Floating); - - d_spectrogram = new QwtPlotSpectrogram(); - - hist = new SlsQt2DHist(); - SetupZoom(); - SetupColorMap(); - - -#if QWT_VERSION<0x060000 - d_spectrogram->setData(*hist); -#else - d_spectrogram->setData(hist); -#endif - - - d_spectrogram->attach(this); - - plotLayout()->setAlignCanvasToScales(true); - - FillTestPlot(); - Update(); - -} - - -void SlsQt2DPlot::SetupColorMap(){ - - - - - colorMapLinearScale = myColourMap(0); -#if QWT_VERSION<0x060000 - d_spectrogram->setColorMap(*colorMapLinearScale ); -#else - d_spectrogram->setColorMap(colorMapLinearScale ); -#endif - - colorMapLogScale = myColourMap(1); -#if QWT_VERSION<0x060000 - contourLevelsLinear = new QwtValueList(); - for(double level=0.5;level<10.0;level+=1.0 ) (*contourLevelsLinear) += level; - d_spectrogram->setContourLevels(*contourLevelsLinear); -#else - ; - - for(double level=0.5;level<10.0;level+=1.0 ) (contourLevelsLinear) += level; - d_spectrogram->setContourLevels(contourLevelsLinear); -#endif - - - // -#if QWT_VERSION<0x060000 - contourLevelsLog = new QwtValueList(); - for(double level=0.5;level<10.0;level+=1.0 ) (*contourLevelsLog) += (pow(10,2*level/10.0)-1)/99.0 * 10; - -#else - ; - - for(double level=0.5;level<10.0;level+=1.0 ) (contourLevelsLog) += (pow(10,2*level/10.0)-1)/99.0 * 10; -#endif - - - // A color bar on the right axis - rightAxis = axisWidget(QwtPlot::yRight); - - rightAxis->setTitle("Intensity"); - rightAxis->setColorBarEnabled(true); - enableAxis(QwtPlot::yRight); -} - -void SlsQt2DPlot::FillTestPlot(int mode){ - static int nx = 50; - static int ny = 50; - static double *the_data=0; - if(the_data==0) the_data = new double [nx*ny]; - - double dmax = sqrt(pow(nx/2.0-0.5,2) + pow(ny/2.0-0.5,2)); - for(int i=0;iSetData(nx,200,822,ny,-0.5,ny-0.5,the_data); -} - -void SlsQt2DPlot::SetupZoom(){ - // LeftButton for the zooming - // MidButton for the panning - // RightButton: zoom out by 1 - // Ctrl+RighButton: zoom out to full size - - zoomer = new SlsQt2DZoomer(canvas()); - zoomer->SetHist(hist); - -#if QT_VERSION < 0x040000 - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlButton); -#else - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier); -#endif - zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton); - - panner = new QwtPlotPanner(canvas()); - panner->setAxisEnabled(QwtPlot::yRight, false); - panner->setMouseButton(Qt::MidButton); - - // Avoid jumping when labels with more/less digits - // appear/disappear when scrolling vertically - - const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font()); - QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft); - sd->setMinimumExtent( fm.width("100.00") ); - - const QColor c(Qt::darkBlue); - zoomer->setRubberBandPen(c); - zoomer->setTrackerPen(c); -} - -/*void SlsQt2DPlot::CompletelyUnZoom(){ - setAxisScale(QwtPlot::xBottom,hist->GetXMin(),hist->GetXMin()+(hist->GetXMax()-hist->GetXMin())); - setAxisScale(QwtPlot::yLeft,hist->GetYMin(),hist->GetYMin()+(hist->GetYMax()-hist->GetYMin())); - zoomer->setZoomBase(); - //replot(); -}*/ - -void SlsQt2DPlot::UnZoom(bool replot){ -#if QWT_VERSION<0x060000 - zoomer->setZoomBase(QwtDoubleRect(hist->GetXMin(),hist->GetYMin(),hist->GetXMax()-hist->GetXMin(),hist->GetYMax()-hist->GetYMin())); -#else - zoomer->setZoomBase(QRectF(hist->GetXMin(),hist->GetYMin(),hist->GetXMax()-hist->GetXMin(),hist->GetYMax()-hist->GetYMin())); -#endif - zoomer->setZoomBase(replot);//Call replot for the attached plot before initializing the zoomer with its scales. - // zoomer->zoom(0); -} - -void SlsQt2DPlot::SetZoom(double xmin,double ymin,double x_width,double y_width){ - -#if QWT_VERSION<0x060000 - zoomer->setZoomBase(QwtDoubleRect(xmin,ymin,x_width,y_width)); - -#else - zoomer->setZoomBase(QRectF(xmin,ymin,x_width,y_width)); -#endif -} - -void SlsQt2DPlot::SetZMinMax(double zmin,double zmax){ - hist->SetMinMax(zmin,zmax); -} - - -QwtLinearColorMap* SlsQt2DPlot::myColourMap(QVector colourStops) { - -int ns=5; - -double r[]={0.00, 0.00, 0.87, 1.00, 0.51}; -double g[]={0.00, 0.81, 1.00, 0.20, 0.00}; - double b[] = { 0.51, 1.00, 0.12, 0.00, 0.00 }; - - QColor c1,c2,c; - c1.setRgbF(r[0],g[0],b[0],0); - c2.setRgbF(r[ns-1],g[ns-1],b[ns-1]); - QwtLinearColorMap* copyMap = new QwtLinearColorMap(Qt::lightGray, c2); - - for (int is=0; isaddColorStop(colourStops.value(is),c ); - } - - return copyMap; - - -} -QwtLinearColorMap* SlsQt2DPlot::myColourMap(int log) { - -int ns=5; - - - QVector cs1(0); - QVector lcs1(0); - - - cs1.append(0.); - cs1.append(0.34); - cs1.append(0.61); - cs1.append(0.84); - cs1.append(1.); -if (log) { - for (int is=0; issetColorMap(d_spectrogram->data().range(),d_spectrogram->colorMap()); -#else - if (isLog) - hist->SetMinimumToFirstGreaterThanZero(); - - const QwtInterval zInterval = d_spectrogram->data()->interval( Qt::ZAxis ); - - rightAxis->setColorMap(zInterval,myColourMap(isLog)); - -#endif - - if(!zoomer->zoomRectIndex()) UnZoom(); - -#if QWT_VERSION<0x060000 - - - setAxisScale(QwtPlot::yRight,d_spectrogram->data().range().minValue(), - d_spectrogram->data().range().maxValue()); -#else - - - setAxisScale(QwtPlot::yRight,zInterval.minValue(), zInterval.maxValue()); -#ifdef VERYVERBOSE - cout << "axis scale set" << endl; -#endif - plotLayout()->setAlignCanvasToScales(true); -#ifdef VERYVERBOSE - cout << "layout" << endl; -#endif -#endif -#ifdef VERYVERBOSE - cout << "going to replot" << endl; -#endif - replot(); -#ifdef VERYVERBOSE - cout << "done" << endl; -#endif -} - - - -void SlsQt2DPlot::showContour(bool on){ - d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ContourMode,on); - Update(); -} - -void SlsQt2DPlot::showSpectrogram(bool on){ - // static int io=0; - // FillTestPlot(io++); - d_spectrogram->setDisplayMode(QwtPlotSpectrogram::ImageMode, on); - d_spectrogram->setDefaultContourPen(on ? QPen() : QPen(Qt::NoPen)); - Update(); -} - -void SlsQt2DPlot::InterpolatedPlot(bool on){ - hist->Interpolate(on); - Update(); -} - - -void SlsQt2DPlot::LogZ(bool on){ - if(on){ -isLog=1; - //if(hist->GetMinimum()<=0) hist->SetMinimumToFirstGreaterThanZero(); -#if QWT_VERSION<0x060000 - d_spectrogram->setColorMap(*colorMapLogScale); -#else - d_spectrogram->setColorMap(myColourMap(isLog)); -#endif - setAxisScaleEngine(QwtPlot::yRight,new QwtLog10ScaleEngine); -#if QWT_VERSION<0x060000 - d_spectrogram->setContourLevels(*contourLevelsLog); -#else - d_spectrogram->setContourLevels(contourLevelsLog); -#endif - }else{ -isLog=0; - -#if QWT_VERSION<0x060000 - d_spectrogram->setColorMap(*colorMapLinearScale); -#else - d_spectrogram->setColorMap(myColourMap(isLog)); -#endif - - - - setAxisScaleEngine(QwtPlot::yRight,new QwtLinearScaleEngine); - -#if QWT_VERSION<0x060000 - d_spectrogram->setContourLevels(*contourLevelsLinear); -#else - d_spectrogram->setContourLevels(contourLevelsLinear); -#endif - - } - Update(); - -} - -//Added by Dhanya on 19.06.2012 to disable zooming when any of the axes range has been set -void SlsQt2DPlot::DisableZoom(bool disableZoom){ -#ifdef VERBOSE - if(disableZoom) cout<<"Disabling zoom"<setMousePattern(QwtEventPattern::MouseSelect1,Qt::NoButton); -#if QT_VERSION < 0x040000 - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::NoButton, Qt::ControlButton); -#else - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::NoButton, Qt::ControlModifier); -#endif - zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::NoButton); - } - if(panner) panner->setMouseButton(Qt::NoButton); - }else { - if(zoomer){ - zoomer->setMousePattern(QwtEventPattern::MouseSelect1,Qt::LeftButton); -#if QT_VERSION < 0x040000 - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlButton); -#else - zoomer->setMousePattern(QwtEventPattern::MouseSelect2,Qt::RightButton, Qt::ControlModifier); -#endif - zoomer->setMousePattern(QwtEventPattern::MouseSelect3,Qt::RightButton); - } - if(panner) panner->setMouseButton(Qt::MidButton); - } -} - - -/* -void SlsQt2DPlot::printPlot(){ - QPrinter printer; - printer.setOrientation(QPrinter::Landscape); -#if QT_VERSION < 0x040000 - printer.setColorMode(QPrinter::Color); - printer.setOutputFileName("spectrogram.ps"); - if (printer.setup()) -#else - printer.setOutputFileName("spectrogram.pdf"); - QPrintDialog dialog(&printer); - if ( dialog.exec() ) -#endif - { - print(printer); - } -} - -*/ diff --git a/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx b/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx deleted file mode 100644 index 220bf0f2c..000000000 --- a/slsDetectorGui/slsDetectorPlotting/src/SlsQt2DPlotLayout.cxx +++ /dev/null @@ -1,239 +0,0 @@ -/** - * @author Ian Johnson - * @version 1.0 - */ - - -#include - -#include -#include -#include -#include -#include - -#include "SlsQt2DPlotLayout.h" - -using namespace std; - -SlsQt2DPlotLayout::SlsQt2DPlotLayout(QWidget *parent):QGroupBox(parent){ - the_layout=0; - the_plot = new SlsQt2DPlot(this); - - z_range_ne = new SlsQtNumberEntry(this,1,(char*)"Set the z axis range from",2,(char*)"to",2); - z_range_ne->setFixedWidth(402); -#ifndef IAN - zRangeChecked = false; - z_range_ne->hide(); -#endif - - CreateTheButtons(); - Layout(); - ConnectSignalsAndSlots(); -} - -SlsQt2DPlotLayout::~SlsQt2DPlotLayout(){ - - if(the_layout) delete the_layout; - - - delete the_plot; - delete z_range_ne; -} - - -void SlsQt2DPlotLayout::CreateTheButtons(){ - /** Dhanya: All these buttons are already in another class, logz is used and a wrapper around it*/ -#ifdef IAN - btnInterpolate = new QToolButton(this); - btnInterpolate->setText("Interpolate"); - btnInterpolate->setCheckable(true); - btnInterpolate->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); - - btnContour = new QToolButton(this); - btnContour->setText("Contour"); - btnContour->setCheckable(true); - btnContour->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); -#endif - btnLogz = new QToolButton(this); - btnLogz->setText("Log Scale (Z)"); - btnLogz->setCheckable(true); - btnLogz->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); -#ifndef IAN - btnLogz->hide(); -#endif -} - - -void SlsQt2DPlotLayout::Layout(){ - if(the_layout) delete the_layout; - the_layout = new QGridLayout(this); -#ifdef IAN - the_layout->addWidget(btnInterpolate,1,1); - the_layout->addWidget(btnContour,1,2); - the_layout->addWidget(btnLogz,1,3); - the_layout->addWidget(the_plot,2,1,3,3); - the_layout->addWidget(z_range_ne,5,1,1,3); - the_layout->setMargin(12); -#else - the_layout->addWidget(the_plot,2,0,3,3); - the_layout->addWidget(z_range_ne,5,0,1,3); -#endif -} - -void SlsQt2DPlotLayout::ConnectSignalsAndSlots(){ -#ifndef IAN - connect(this, SIGNAL(InterpolateSignal(bool)), the_plot, SLOT(InterpolatedPlot(bool))); - connect(this, SIGNAL(ContourSignal(bool)), the_plot, SLOT(showContour(bool))); -#else - connect(btnInterpolate, SIGNAL(toggled(bool)),the_plot, SLOT(InterpolatedPlot(bool))); - connect(btnContour, SIGNAL(toggled(bool)),the_plot, SLOT(showContour(bool))); - connect(btnLogz, SIGNAL(toggled(bool)),this,SLOT(SetZScaleToLog(bool))); - btnInterpolate->setChecked(false); - btnContour->setChecked(false); -#endif - connect(z_range_ne, SIGNAL(CheckBoxChanged(bool)), this, SLOT(ResetRange())); - connect(z_range_ne, SIGNAL(AValueChanged(SlsQtNumberEntry*)), this, SLOT(ResetRange())); - btnLogz->setChecked(false); -} - -void SlsQt2DPlotLayout::UpdateNKeepSetRangeIfSet(){ -#ifdef IAN - if(z_range_ne->CheckBoxState()){ -#endif - //just reset histogram range before update - the_plot->SetZMinMax(z_range_ne->GetValue(0),z_range_ne->GetValue(1)); -#ifdef IAN - } -#endif - the_plot->Update(); -} - -void SlsQt2DPlotLayout::ResetRange(){ - //refind z limits - the_plot->SetZMinMax(); - if(btnLogz->isChecked()) the_plot->SetZMinimumToFirstGreaterThanZero(); -#ifdef IAN - if(z_range_ne->CheckBoxState()){ -#else - if(zRangeChecked){ -#endif - //first time check validity - bool same = (z_range_ne->GetValue(0)==z_range_ne->GetValue(1)) ? 1:0; - if(!z_range_ne->IsValueOk(0)||same) z_range_ne->SetValue(the_plot->GetZMinimum(),0); - if(!z_range_ne->IsValueOk(1)||same) z_range_ne->SetValue(the_plot->GetZMaximum(),1); - z_range_ne->SetRange(the_plot->GetZMinimum(),z_range_ne->GetValue(1),0); - z_range_ne->SetRange(z_range_ne->GetValue(0),the_plot->GetZMaximum(),1); - - //set histogram range - the_plot->SetZMinMax(z_range_ne->GetValue(0),z_range_ne->GetValue(1)); - } - the_plot->Update(); -} - - -void SlsQt2DPlotLayout::ResetZMinZMax(bool zmin, bool zmax, double min, double max){ - - if(zmin || zmax) zRangeChecked = true; - else zRangeChecked = false; - - if(zmin) z_range_ne->SetNumber(min,0); - if(zmax) z_range_ne->SetNumber(max,1); - - - //refind z limits - the_plot->SetZMinMax(); - //finds zmin value from hist - if(btnLogz->isChecked()) - the_plot->SetZMinimumToFirstGreaterThanZero(); - - if(zRangeChecked){ - - //if value not given, take max or min of plot - if(zmax) z_range_ne->SetValue(max,0); - else z_range_ne->SetValue(the_plot->GetZMaximum(),1); - - if(zmin) z_range_ne->SetValue(min,0); - else z_range_ne->SetValue(the_plot->GetZMinimum(),0); - - //check if zmin and zmax is same or not a proper double value - //if(zmin && zmax){ - bool same = (z_range_ne->GetValue(0)==z_range_ne->GetValue(1)) ? 1:0; - if(!z_range_ne->IsValueOk(0)||same) z_range_ne->SetValue(the_plot->GetZMinimum(),0); - if(!z_range_ne->IsValueOk(1)||same) z_range_ne->SetValue(the_plot->GetZMaximum(),1); - //} - - z_range_ne->SetRange(the_plot->GetZMinimum(),z_range_ne->GetValue(1),0); - z_range_ne->SetRange(z_range_ne->GetValue(0),the_plot->GetZMaximum(),1); - - //set histogram range - the_plot->SetZMinMax(z_range_ne->GetValue(0),z_range_ne->GetValue(1)); - - } - the_plot->Update(); -} - - -void SlsQt2DPlotLayout::SetZScaleToLog(bool yes){ -#ifndef IAN -#ifdef VERBOSE - cout<<"Setting ZScale to log:"<setChecked(yes); -#endif - the_plot->LogZ(yes); - ResetRange(); -} - - -void SlsQt2DPlotLayout::SetXTitle(QString st){ -#ifndef IAN - QwtText title(st); - title.setFont(QFont("Sans Serif",11,QFont::Normal)); - GetPlot()->axisWidget(QwtPlot::xBottom)->setTitle(title); -#else - GetPlot()->axisWidget(QwtPlot::xBottom)->setTitle(st); -#endif -} - -void SlsQt2DPlotLayout::SetYTitle(QString st){ -#ifndef IAN - QwtText title(st); - title.setFont(QFont("Sans Serif",11,QFont::Normal)); - GetPlot()->axisWidget(QwtPlot::yLeft)->setTitle(title); -#else - GetPlot()->axisWidget(QwtPlot::yLeft)->setTitle(st); -#endif -} - -void SlsQt2DPlotLayout::SetZTitle(QString st){ -#ifndef IAN - QwtText title(st); - title.setFont(QFont("Sans Serif",11,QFont::Normal)); - GetPlot()->axisWidget(QwtPlot::yRight)->setTitle(title); -#else - GetPlot()->axisWidget(QwtPlot::yRight)->setTitle(st); -#endif -} - - -#ifndef IAN -void SlsQt2DPlotLayout::SetZRange(double zmin, double zmax){ -#ifdef VERBOSE - cout<<"zmin:"<SetNumber(zmin,0); - z_range_ne->SetNumber(zmax,1); - ResetRange(); -} - - -void SlsQt2DPlotLayout::EnableZRange(bool enable){ -#ifdef VERBOSE - cout<<"Setting Z Range Enable to "< -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -#include "SlsQtNumberEntry.h" - -using namespace std; - -SlsQtNumberEntry::SlsQtNumberEntry(QWidget *parent, int with_checkbox, char *start_string, int num_type, char* middle_string, int num2_type, int n_units, char** units, double* unit_factors,char* end_string):QWidget(parent){ - SetupNumberEntry(with_checkbox,start_string,num_type,middle_string,num2_type,n_units,units,unit_factors,end_string); -} - -//without unit drop box -SlsQtNumberEntry::SlsQtNumberEntry(QWidget *parent,int with_checkbox, char *start_string, int num_type, char* middle_string, int num2_type,char* end_string):QWidget(parent){ - SetupNumberEntry(with_checkbox,start_string,num_type,middle_string,num2_type,0,0,0,end_string); -} - -void SlsQtNumberEntry::SetupNumberEntry(int with_checkbox, char *start_string, int num_type, char* middle_string, int num2_type, int n_units, char** units, double* unit_factors,char* end_string){ - - layout = 0; - - check_box = 0; - front_text = 0; - num_field[0] = 0; - spin_box[0] = 0; - validator_int[0] = 0; - validator_double[0] = 0; - middle_text = 0; - num_field[1] = 0; - spin_box[1] = 0; - validator_int[1] = 0; - validator_double[1] = 0; - unit_cbb = 0; - factors = 0; - back_text = 0; - if(with_checkbox) AddCheckBox(); - SetFrontText(start_string); - - SetupNumberField(num_type,0); - SetMiddleText(middle_string); - SetupNumberField(num2_type,1); - SetUnits(n_units,units,unit_factors); - SetBackText(end_string); - - SetLayout(); - -} - - -SlsQtNumberEntry::~SlsQtNumberEntry(){ - - if(check_box) delete check_box; - if(front_text) delete front_text; - if(middle_text) delete middle_text; - if(validator_int[0]) delete validator_int[0]; - if(validator_double[0]) delete validator_double[0]; - if(num_field[0]) delete num_field[0]; - if(spin_box[0]) delete spin_box[0]; - if(validator_int[1]) delete validator_int[1]; - if(validator_double[1]) delete validator_double[1]; - if(num_field[1]) delete num_field[1]; - if(spin_box[1]) delete spin_box[1]; - if(unit_cbb) delete unit_cbb; - if(factors) delete factors; - if(back_text) delete back_text; - -} - -void SlsQtNumberEntry::AddCheckBox(){ - if(check_box) delete check_box; - check_box = new QCheckBox(this); - connect(check_box,SIGNAL(clicked()),this,SLOT(CheckBoxClicked())); - SetLayout(); -} - -void SlsQtNumberEntry::SetFrontText(char* s) {SetText(s,&front_text); SetLayout();} -void SlsQtNumberEntry::SetMiddleText(char* s) {SetText(s,&middle_text); SetLayout();} -void SlsQtNumberEntry::SetBackText(char* s) {SetText(s,&back_text); SetLayout();}; -void SlsQtNumberEntry::SetText(char* s, QLabel** pp){ - if(*pp){delete *pp; *pp=0;} - if(s){ - *pp = new QLabel(this); - (*pp)->setText(s); - } - SetLayout(); -} - - -void SlsQtNumberEntry::SetupNumberField(int type, int which_number_field){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - - num_field_enabled[i]=1; - if(spin_box[i]) { delete spin_box[i]; spin_box[i]=0;} - if(validator_int[i]) { delete validator_int[i]; validator_int[i]=0;} - if(validator_double[i]) { delete validator_double[i]; validator_double[i]=0;} - if(num_field[i]) { delete num_field[i]; num_field[i]=0;} - - if(type>0&&type<3){ - num_field[i] = new QLineEdit(this); - num_field[i]->setAlignment(Qt::AlignRight); - SetMinimumNumberWidth(3,i); - if(type==1){ - validator_int[i] = new SlsQtIntValidator(num_field[i]); - num_field[i]->setValidator(validator_int[i]); - SetNumber(0,i); - }else{ - validator_double[i] = new SlsQtDoubleValidator(num_field[i]); - num_field[i]->setValidator(validator_double[i]); - //default settings - SetNDecimalsOfDoubleValidator(3,i); //defalut value - SetNumber(0,i); - } - - num_field[i]->setAlignment(Qt::AlignRight); - - if(i==0){ - connect(num_field[i],SIGNAL(editingFinished()),this,SLOT(RefreshFirstNumberEntry())); - connect(num_field[i],SIGNAL(returnPressed()),this,SLOT(FirstValueEntered())); - connect(num_field[i],SIGNAL(editingFinished()),this,SLOT(FirstValueEntered())); - }else{ - connect(num_field[i],SIGNAL(editingFinished()),this,SLOT(RefreshSecondNumberEntry())); - connect(num_field[i],SIGNAL(returnPressed()),this,SLOT(SecondValueEntered())); - connect(num_field[i],SIGNAL(editingFinished()),this,SLOT(SecondValueEntered())); - } - }else if(type==3){ - spin_box[i] = new QSpinBox(); - if(i==0) connect(spin_box[i],SIGNAL(editingFinished()),this,SLOT(FirstValueEntered())); - else connect(spin_box[i],SIGNAL(editingFinished()),this,SLOT(SecondValueEntered())); - spin_box[i]->setAlignment(Qt::AlignRight); - } - - SetLayout(); -} - -void SlsQtNumberEntry::SetUnits(int n_units, char** units, double* unit_factors){ - if(unit_cbb){ delete unit_cbb; unit_cbb=0;} - if(factors) { delete factors; factors=0;} - - if(n_units>0&&units&&unit_factors){ - unit_cbb = new QComboBox(this); - factors = new double [n_units]; - - for(int i=0;iinsertItem(i,units[i]); - factors[i] = unit_factors[i]; - } - - connect(unit_cbb,SIGNAL(activated(int)),this,SLOT(UnitSelected())); - } - - SetLayout(); -} - -void SlsQtNumberEntry::SetLayout(){ - if(layout) delete layout; - layout = new QGridLayout(this); - - int i = 0; - if(check_box) layout->addWidget(check_box,1,i++); - if(front_text) layout->addWidget(front_text,1,i++); - if(num_field[0]) layout->addWidget(num_field[0],1,i++); - if(spin_box[0]) layout->addWidget(spin_box[0],1,i++); - if(middle_text) layout->addWidget(middle_text,1,i++); - if(num_field[1]) layout->addWidget(num_field[1],1,i++); - if(spin_box[1]) layout->addWidget(spin_box[1],1,i++); - if(unit_cbb) layout->addWidget(unit_cbb,1,i++); - if(back_text) layout->addWidget(back_text,1,i++); - - CheckBoxClicked(); -} - - -void SlsQtNumberEntry::SetMinimumNumberWidth(int nchar_width,int which_number_field){ - if(num_field[which_number_field]) num_field[which_number_field] - ->setMinimumWidth(nchar_width*num_field[which_number_field]->minimumSizeHint().width()); - if(spin_box[which_number_field]) spin_box[which_number_field] - ->setMinimumWidth(nchar_width*spin_box[which_number_field]->minimumSizeHint().width()); -} - -void SlsQtNumberEntry::SetNDecimalsOfDoubleValidators(int ndecimals){ - SetNDecimalsOfDoubleValidator(ndecimals,0); - SetNDecimalsOfDoubleValidator(ndecimals,1); -} - -void SlsQtNumberEntry::SetNDecimalsOfDoubleValidator(int ndecimals, int which_number_field){ - //0 -> standard, 1->scientific - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - if(validator_double[i]){ - validator_double[i]->setDecimals(ndecimals); - SetNumber(GetNumber(i),i); - } -} - -void SlsQtNumberEntry::SetMinimumUnitWidth(int nchar_width){ - if(unit_cbb) unit_cbb->setMinimumWidth(nchar_width*unit_cbb->minimumSizeHint().width()); -} - - -/* -double SlsQtNumberEntry::SetNumber(int v,int which_number_field){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - - if(num_field[i]){ - if(validator_int[i]){ - QString s = QString::number(v); - validator_int[i]->fixup(s); - num_field[i]->setText(s); - } - if(validator_double[i]){ - QString s = QString::number(v); - validator_double[i]->fixup(s); - num_field[i]->setText(s); - } - }else if(spin_box[i]){ - spin_box[i]->setValue(v); - }else return 0; - - return GetNumber(i); -} -*/ - -double SlsQtNumberEntry::SetNumber(double v,int which_number_field){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - - if(num_field[i]){ - if(validator_int[i]){ - QString s = QString::number(v); - validator_int[i]->fixup(s); - num_field[i]->setText(s); - } - if(validator_double[i]){ - QString s = QString::number(v); - //validator_double[i]->fixup(s);//commented out as it ignores the zmax values - num_field[i]->setText(s); - } - }else if(spin_box[i]){ - spin_box[i]->setValue(round(v)); - }else return 0; - - return GetNumber(i); -} - - -void SlsQtNumberEntry::SetRange(int min, int max,int which_number_field){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - if(min>max){ - cout<<"Warning: SetRange(int,int) no effect min > max"<setRange(min,max); - if(validator_double[i]) validator_double[i]->setRange(min,max,validator_double[i]->decimals()); - if(spin_box[i]) spin_box[i]->setRange(min,max); - SetNumber(GetNumber(i),i); - } -} - - -void SlsQtNumberEntry::SetRange(double min, double max,int which_number_field){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - if(min>max){ - cout<<"Warning: SetRange(double,double) no effect min("<= max("<setRange(min,max,validator_double[i]->decimals()); - if(spin_box[i]) spin_box[i]->setRange(min,max); - SetNumber(GetNumber(i),i); - } - -} - -bool SlsQtNumberEntry::CheckBoxState(){ - if(check_box&&check_box->checkState()) return 1; - return 0; -} - -void SlsQtNumberEntry::CheckBoxClicked(){ - if(check_box){ - if(check_box->checkState()) Enable(); - else Disable(); - - emit CheckBoxChanged(check_box->checkState()); - emit CheckBoxChanged(this); - } - -} - -void SlsQtNumberEntry::Disable(){ Enable(0); } -void SlsQtNumberEntry::Enable(bool en_flag){ - if(check_box) check_box->setChecked(en_flag); - if(front_text) front_text->setEnabled(en_flag); - if(num_field[0]) num_field[0]->setEnabled(en_flag&&num_field_enabled[0]); - if(spin_box[0]) spin_box[0]->setEnabled(en_flag&&num_field_enabled[0]); - if(middle_text) middle_text->setEnabled(en_flag); - if(num_field[1]) num_field[1]->setEnabled(en_flag&&num_field_enabled[1]); - if(spin_box[1]) spin_box[1]->setEnabled(en_flag&&num_field_enabled[1]); - if(unit_cbb) unit_cbb->setEnabled(en_flag); - if(back_text) back_text->setEnabled(en_flag); -} - -void SlsQtNumberEntry::DisableNumberField(int which_number_field){ EnableNumberField(which_number_field,0); } -void SlsQtNumberEntry::EnableNumberField(int which_number_field,bool en_flag){ - if(which_number_field>=0||which_number_field<=1){ - num_field_enabled[which_number_field]=en_flag; - if(num_field[which_number_field]) num_field[which_number_field]->setEnabled(num_field_enabled[which_number_field]); - if(spin_box[which_number_field]) spin_box[which_number_field]->setEnabled(num_field_enabled[which_number_field]); - } -} - -void SlsQtNumberEntry::UnitSelected(){ - emit UnitChanged(GetComboBoxValue()); - emit UnitChanged(this); - emit AValueChanged(this); - emit FirstValueChanged(GetValueInt(0)); - emit FirstValueChanged(GetValue(0)); - emit FirstValueChanged(this); - emit SecondValueChanged(GetValueInt(1)); - emit SecondValueChanged(GetValue(1)); - emit SecondValueChanged(this); -} - -void SlsQtNumberEntry::RefreshFirstNumberEntry() { RefreshNumberEntery(0);} -void SlsQtNumberEntry::RefreshSecondNumberEntry() { RefreshNumberEntery(1);} -void SlsQtNumberEntry::RefreshNumberEntery(int which_number_field){ - //does not apply to spin boxes - if(num_field[which_number_field]){ - SetNumber(GetNumber(which_number_field),which_number_field); - } - //refreshes the entery in a general format for ints and fixes doubles, - //for example removes leading zeros - //However, also moves curser position -} - -void SlsQtNumberEntry::FirstValueEntered(){ - emit AValueChanged(this); - emit FirstValueChanged(GetValue(0)); - emit FirstValueChanged(GetValueInt(0)); - emit FirstValueChanged(this); -} - -void SlsQtNumberEntry::SecondValueEntered(){ - emit AValueChanged(this); - emit SecondValueChanged(GetValue(1)); - emit SecondValueChanged(GetValueInt(1)); - emit SecondValueChanged(this); -} - - -bool SlsQtNumberEntry::Enabled(){ - if(check_box && !check_box->checkState()) return 0; - return 1; -} - -bool SlsQtNumberEntry::IsValueOk(int which_number_field){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - - bool ok=0; - if(validator_int[i]) num_field[i]->text().toInt(&ok); - if(validator_double[i]) num_field[i]->text().toDouble(&ok); - if(spin_box[i]) ok=true; - - return ok; -} - -const char* SlsQtNumberEntry::GetFrontText(){ - if(front_text) return front_text->text().toStdString().c_str(); - return 0; -} -const char* SlsQtNumberEntry::GetMiddleText(){ - if(middle_text) return middle_text->text().toStdString().c_str(); - return 0; -} -const char* SlsQtNumberEntry::GetBackText(){ - if(back_text) back_text->text().toStdString().c_str(); - return 0; -} - -int SlsQtNumberEntry::GetNumberInt(int which_number_field,bool* ok){ - return round(GetNumber(which_number_field,ok)); -} - -double SlsQtNumberEntry::GetNumber(int which_number_field,bool* ok){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - - if(ok) *ok = 1; - - if(num_field[i]){ - if(validator_int[i]) return num_field[i]->text().toInt(ok); - else return num_field[i]->text().toDouble(ok); - } - else if(spin_box[i]) return spin_box[i]->value(); - else {if(ok) *ok=0;} - - return 0; -} - - - -double SlsQtNumberEntry::SetValue(double v,int which_number_field){ - if(unit_cbb) SetNumber(round(v/GetComboBoxValue()),which_number_field); - else SetNumber(v,which_number_field); - - return GetValue(which_number_field); -} - - -int SlsQtNumberEntry::GetValueInt(int which_number_field,bool* ok){ - return round(GetValue(which_number_field,ok)); -} - -double SlsQtNumberEntry::GetValue(int which_number_field,bool* ok){ - int i = (which_number_field<0||which_number_field>1) ? 0:which_number_field; - - double v; - if(ok) *ok = 1; - - if(num_field[i]){ - if(validator_int[i]) v = num_field[i]->text().toInt(ok); - else v = num_field[i]->text().toDouble(ok); - } - else if(spin_box[i]) v = spin_box[i]->value(); - else v = 1; //incase there is only a unit pulldown - - - if(unit_cbb) v *= GetComboBoxValue(); - - if(!num_field[i]&&!spin_box[i]&&!unit_cbb){v=0; if(ok) *ok=0;} - - return v; -} - - -int SlsQtNumberEntry::SetComboBoxIndex(int index){ - if(unit_cbb){ - if(index<0||index>=unit_cbb->count()){ - cout<<"usage error : can not set combo box index, index out of range."<setCurrentIndex(index); - } - } - else cout<<"usage error : can not set combo box index, no combo box."<currentIndex(); - - cout<<"usage error : can not get combo box index, no combo box."<currentIndex()]; - - cout<<"usage error : can not get combo box value, no combo box."< -// C++ Include Headers -#include -using namespace std; - -//------------------------------------------------------------------------------------------------------------------------------------------------- -int qActionsWidget::NUM_ACTION_WIDGETS(0); -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qActionsWidget::qActionsWidget(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent),myDet(detector){ - setupUi(this); - SetupWidgetWindow(); - Initialization(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qActionsWidget::~qActionsWidget(){ - delete myDet; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qActionsWidget::SetupWidgetWindow(){ - id = NUM_ACTION_WIDGETS; - NUM_ACTION_WIDGETS++; - - setFixedHeight(25); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qActionsWidget::Initialization(){ - //mode - connect(comboScript, SIGNAL(currentIndexChanged(int)), this,SLOT(SetMode(int))); - //file - connect(dispScript, SIGNAL(editingFinished()), this, SLOT(SetScriptFile())); - connect(btnBrowse, SIGNAL(clicked()), this, SLOT(BrowsePath())); - //parameter - connect(dispParameter, SIGNAL(editingFinished()), this, SLOT(SetParameter())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qActionsWidget::SetMode(int mode){ -#ifdef VERBOSE - cout << "Setting\taction:" << id << "\tmode:" << mode << endl; -#endif - //enabling/disabling - dispScript->setEnabled(mode); - btnBrowse->setEnabled(mode); - lblParameter->setEnabled(mode); - dispParameter->setEnabled(mode); - - QString fName = dispScript->text(); - //set the mode - if(mode) myDet->setActionScript(id,fName.toAscii().constData()); - else myDet->setActionScript(id,""); - //mode is not set when fname is blank - - if(!fName.isEmpty()){ - //check if mode didnt get set - if(mode!=myDet->getActionMode(id)){ - qDefs::Message(qDefs::WARNING,"The mode could not be changed.","qActionsWidget::SetMode"); - comboScript->setCurrentIndex(myDet->getActionMode(id)); - }//if mode got set and its custom script - else if(mode){ - //when the file name did not get set correctly - if(fName.compare(QString(myDet->getActionScript(id).c_str()))){ - qDefs::Message(qDefs::WARNING,"The file path could not be set.","qActionsWidget::SetMode"); - dispScript->setText(QString(myDet->getActionScript(id).c_str())); - SetScriptFile(); - } - } - } - qDefs::checkErrorMessage(myDet,"qActionsWidget::SetMode"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qActionsWidget::BrowsePath(){ -#ifdef VERBOSE - cout << "Browsing Script File Path" << endl; -#endif - QString fName = dispScript->text(); - QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); - if(dir.isEmpty()) dir = "/home"; - //dialog - fName = QFileDialog::getOpenFileName(this, - tr("Load Script File"),dir, - tr("Script Files(*.awk);;All Files(*)")); - //if empty, set the file name and it calls setscriptfile, else ignore - if (!fName.isEmpty()){ - dispScript->setText(fName); - SetScriptFile(); - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qActionsWidget::SetScriptFile(){ - QString fName = dispScript->text(); -#ifdef VERBOSE - cout << "Setting\taction:" << id << "\tscript:" << fName.toAscii().constData() << endl; -#endif - bool set = false; - struct stat st_buf; - - //blank - if(fName.isEmpty()) - set = true; - else if(!fName.compare("none")) - set = true; - //not blank - else{ - //path doesnt exist - if(stat(fName.toAscii().constData(),&st_buf)){ - qDefs::Message(qDefs::WARNING,"The script file entered does not exist","qActionsWidget::SetScriptFile"); - dispScript->setText(QString(myDet->getActionScript(id).c_str())); - } - //if its not a file - else if (!S_ISREG (st_buf.st_mode)) { - qDefs::Message(qDefs::WARNING,"The script file path entered is not a file","qActionsWidget::SetScriptFile"); - dispScript->setText(QString(myDet->getActionScript(id).c_str())); - } - else - set=true; - } - - - //if blank or valid file - if(set){ - //scan and positions wouldnt get here - myDet->setActionScript(id,fName.toAscii().constData()); - if(fName.compare(QString(myDet->getActionScript(id).c_str()))){ - //did not get set, write what is was before - if(!fName.isEmpty()) - qDefs::Message(qDefs::WARNING,"The script file could not be set. Reverting to previous file.","qActionsWidget::SetScriptFile"); - dispScript->setText(QString(myDet->getActionScript(id).c_str())); - } - } - - //dont display if theres a none - if(!dispScript->text().compare("none")) dispScript->setText(""); - - qDefs::checkErrorMessage(myDet,"qActionsWidget::SetScriptFile"); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qActionsWidget::SetParameter(){ - QString parameter = dispParameter->text(); -#ifdef VERBOSE - cout << "Setting\taction:" << id << "\tparameter:" << parameter.toAscii().constData() << endl; -#endif - myDet->setActionParameter(id,parameter.toAscii().constData()); - //dont display if theres a none - if(!dispParameter->text().compare("none")) dispParameter->setText(""); - - qDefs::checkErrorMessage(myDet,"qActionsWidget::SetParameter"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qActionsWidget::Refresh(){ - int mode = (myDet->getActionMode(id)>0?1:0); - string script = myDet->getActionScript(id); - string parameter = myDet->getActionParameter(id); - - - //settings values and checking for none - if(QString(script.c_str()).compare("none")) - dispScript->setText(QString(script.c_str())); - if(mode)SetScriptFile(); - dispParameter->setText(QString(parameter.c_str())); - SetParameter(); - //set mode which also checks everything - comboScript->setCurrentIndex(mode); -#ifdef VERBOSE - cout << "Updated\taction:" << id << "\t" - "mode:"< -#include -#include -#include "qwt_symbol.h" -/** C++ Include Headers */ - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qCloneWidget::qCloneWidget(QWidget *parent,int id,QString title,QString xTitle, QString yTitle, QString zTitle, - int numDim,string FilePath,bool displayStats, QString min, QString max, QString sum): - QMainWindow(parent),id(id),filePath(FilePath),cloneplot1D(0),cloneplot2D(0) - { - // Window title - char winTitle[300],currTime[50]; - strcpy(currTime,GetCurrentTimeStamp()); - sprintf(winTitle,"Snapshot:%d - %s",id,currTime); - setWindowTitle(QString(winTitle)); - - marker = new QwtSymbol(); - nomarker = new QwtSymbol(); - marker->setStyle(QwtSymbol::Cross); - marker->setSize(5,5); - - // Set up widget - SetupWidgetWindow(title,xTitle, yTitle, zTitle, numDim); - DisplayStats(displayStats,min,max,sum); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qCloneWidget::~qCloneWidget(){ - delete cloneplot1D; - delete cloneplot2D; - delete cloneBox; -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qCloneWidget::SetupWidgetWindow(QString title, QString xTitle, QString yTitle, QString zTitle, int numDim){ - - menubar = new QMenuBar(this); - actionSave = new QAction("&Save",this); - menubar->addAction(actionSave); - setMenuBar(menubar); - - - //Main Window Layout - QWidget *centralWidget = new QWidget(this); - mainLayout = new QGridLayout(centralWidget); - centralWidget->setLayout(mainLayout); - - //plot group box - cloneBox = new QGroupBox(this); - gridClone = new QGridLayout(cloneBox); - cloneBox->setLayout(gridClone); - cloneBox->setContentsMargins(0,0,0,0); - cloneBox->setAlignment(Qt::AlignHCenter); - cloneBox->setFont(QFont("Sans Serif",11,QFont::Normal)); - cloneBox->setTitle(title); - // According to dimensions, create appropriate 1D or 2Dplot - if(numDim==1){ - cloneplot1D = new SlsQt1DPlot(cloneBox); - - cloneplot1D->setFont(QFont("Sans Serif",9,QFont::Normal)); - cloneplot1D->SetXTitle(xTitle.toAscii().constData()); - cloneplot1D->SetYTitle(yTitle.toAscii().constData()); - - - cloneBox->setFlat(false); - cloneBox->setContentsMargins(0,30,0,0); - gridClone->addWidget(cloneplot1D,0,0); - - lblHistTitle = new QLabel(""); - mainLayout->addWidget(lblHistTitle,0,0); - - }else{ - cloneplot2D = new SlsQt2DPlotLayout(cloneBox); - cloneplot2D->setFont(QFont("Sans Serif",9,QFont::Normal)); - cloneplot2D->SetXTitle(xTitle); - cloneplot2D->SetYTitle(yTitle); - cloneplot2D->SetZTitle(zTitle); - cloneplot2D->setAlignment(Qt::AlignLeft); - - cloneBox->setFlat(true); - cloneBox->setContentsMargins(0,20,0,0); - gridClone->addWidget(cloneplot2D,0,0); - } - - // main window widgets - mainLayout->addWidget(cloneBox,1,0); - setCentralWidget(centralWidget); - - // Save - connect(actionSave,SIGNAL(triggered()),this,SLOT(SavePlot())); - - setMinimumHeight(300); - resize(500,350); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qCloneWidget::SetCloneHists(int nHists,int histNBins,double* histXAxis,double* histYAxis[],string histTitle[],bool lines,bool markers){ - //for each plot, create hists - for(int hist_num=0;hist_numcloneplot1D_hists.size()){ - cloneplot1D_hists.append(k=new SlsQtH1D("1d plot",histNBins,histXAxis,histYAxis[hist_num])); - k->SetLineColor(0); - }else{ - k=cloneplot1D_hists.at(hist_num); - k->SetData(histNBins,histXAxis,histYAxis[hist_num]); - } - - - //style of plot - if(lines) k->setStyle(QwtPlotCurve::Lines); - else k->setStyle(QwtPlotCurve::Dots); -#if QWT_VERSION<0x060000 - if(markers) k->setSymbol(*marker); - else k->setSymbol(*nomarker); -#else - if(markers) k->setSymbol(marker); - else k->setSymbol(nomarker); -#endif - - //set title and attach plot - lblHistTitle->setText(QString(histTitle[0].c_str())); - - k->Attach(cloneplot1D); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qCloneWidget::SetCloneHists(int nHists,int histNBins,double* histXAxis,double* histYAxis,string histTitle[],bool lines,bool markers){ - // for each plot create hists - for(int hist_num=0;hist_numcloneplot1D_hists.size()){ - cloneplot1D_hists.append(k=new SlsQtH1D("1d plot",histNBins,histXAxis,histYAxis)); - k->SetLineColor(hist_num+1); - }else{ - k=cloneplot1D_hists.at(hist_num); - k->SetData(histNBins,histXAxis,histYAxis); - } - //style of plot - if(lines) k->setStyle(QwtPlotCurve::Lines); - else k->setStyle(QwtPlotCurve::Dots); - if(markers) { - QwtSymbol *marker = new QwtSymbol(); - marker->setStyle(QwtSymbol::Cross); - marker->setSize(5,5); -#if QWT_VERSION<0x060000 - k->setSymbol(*marker); -#else - k->setSymbol(marker); -#endif - }else { - QwtSymbol *noMarker = new QwtSymbol(); -#if QWT_VERSION<0x060000 - k->setSymbol(*noMarker); -#else - k->setSymbol(noMarker); -#endif - } - //set title and attach plot - lblHistTitle->setText(QString(histTitle[0].c_str())); - k->Attach(cloneplot1D); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qCloneWidget::SetCloneHists2D(int nbinsx,double xmin,double xmax,int nbinsy, double ymin, double ymax, double *d){ - cloneplot2D->GetPlot()->SetData(nbinsx,xmin,xmax,nbinsy,ymin,ymax,d); - cloneplot2D->UpdateNKeepSetRangeIfSet(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -void qCloneWidget::SetRange(bool IsXYRange[],double XYRangeValues[]){ - double XYCloneRangeValues[4]; - - if(!IsXYRange[qDefs::XMINIMUM]){ - if(cloneplot1D) XYCloneRangeValues[qDefs::XMINIMUM]= cloneplot1D->GetXMinimum(); - else XYCloneRangeValues[qDefs::XMINIMUM]= cloneplot2D->GetPlot()->GetXMinimum(); - }else XYCloneRangeValues[qDefs::XMINIMUM]= XYRangeValues[qDefs::XMINIMUM]; - - if(!IsXYRange[qDefs::XMAXIMUM]){ - if(cloneplot1D) XYCloneRangeValues[qDefs::XMAXIMUM]= cloneplot1D->GetXMaximum(); - else XYCloneRangeValues[qDefs::XMINIMUM]= cloneplot2D->GetPlot()->GetXMaximum(); - }else XYCloneRangeValues[qDefs::XMAXIMUM]= XYRangeValues[qDefs::XMAXIMUM]; - - if(!IsXYRange[qDefs::YMINIMUM]){ - if(cloneplot1D) XYCloneRangeValues[qDefs::YMINIMUM]= cloneplot1D->GetYMinimum(); - else XYCloneRangeValues[qDefs::XMINIMUM]= cloneplot2D->GetPlot()->GetYMinimum(); - }else XYCloneRangeValues[qDefs::YMINIMUM]= XYRangeValues[qDefs::YMINIMUM]; - - if(!IsXYRange[qDefs::YMAXIMUM]){ - if(cloneplot1D) XYCloneRangeValues[qDefs::YMAXIMUM]= cloneplot1D->GetYMaximum(); - else XYCloneRangeValues[qDefs::XMINIMUM]= cloneplot2D->GetPlot()->GetYMaximum(); - }else XYCloneRangeValues[qDefs::YMAXIMUM]= XYRangeValues[qDefs::YMAXIMUM]; - - if(cloneplot1D){ - cloneplot1D->SetXMinMax(XYCloneRangeValues[qDefs::XMINIMUM],XYCloneRangeValues[qDefs::XMAXIMUM]); - cloneplot1D->SetYMinMax(XYCloneRangeValues[qDefs::YMINIMUM],XYCloneRangeValues[qDefs::YMAXIMUM]); - }else{ - cloneplot2D->GetPlot()->SetXMinMax(XYRangeValues[qDefs::XMINIMUM],XYRangeValues[qDefs::XMAXIMUM]); - cloneplot2D->GetPlot()->SetYMinMax(XYRangeValues[qDefs::YMINIMUM],XYRangeValues[qDefs::YMAXIMUM]); - cloneplot2D->GetPlot()->Update(); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -char* qCloneWidget::GetCurrentTimeStamp(){ - char output[30]; - char *result; - - //using sys cmds to get output or str - FILE* sysFile = popen("date", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - - result = output + 0; - return result; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qCloneWidget::SavePlot(){ - char cID[10]; - sprintf(cID,"%d",id); - //title - QString fName = QString(filePath.c_str()); - if(cloneBox->title().contains('.')){ - fName.append(QString('/')+cloneBox->title()); - fName.replace(".dat",".png"); - fName.replace(".raw",".png"); - }else fName.append(QString("/Snapshot_unknown_title.png")); - //save - QImage img(cloneBox->size().width(),cloneBox->size().height(),QImage::Format_RGB32); - QPainter painter(&img); - cloneBox->render(&painter); - - fName = QFileDialog::getSaveFileName(this,tr("Save Snapshot "),fName,tr("PNG Files (*.png);;XPM Files(*.xpm);;JPEG Files(*.jpg)"),0,QFileDialog::ShowDirsOnly); - if (!fName.isEmpty()) { - if((img.save(fName))) - qDefs::Message(qDefs::INFORMATION,"The SnapShot has been successfully saved","qCloneWidget::SavePlot"); - else - qDefs::Message(qDefs::WARNING,"Attempt to save snapshot failed.\n" - "Formats: .png, .jpg, .xpm.","qCloneWidget::SavePlot"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qCloneWidget::SavePlotAutomatic(){ - char cID[10]; - sprintf(cID,"%d",id); - //title - QString fName = QString(filePath.c_str()); - if(cloneBox->title().contains('.')){ - fName.append(QString('/')+cloneBox->title()); - fName.replace(".dat",".png"); - fName.replace(".raw",".png"); - }else fName.append(QString("/Snapshot_unknown_title.png")); - cout<<"fname:"<size().width(),cloneBox->size().height(),QImage::Format_RGB32); - QPainter painter(&img); - cloneBox->render(&painter); - if(img.save(fName)) - return 0; - else return -1; - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qCloneWidget::closeEvent(QCloseEvent* event){ - emit CloneClosedSignal(id); - event->accept(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qCloneWidget::DisplayStats(bool enable, QString min, QString max, QString sum){ - if(enable){ - QWidget *widgetStatistics = new QWidget(this); - widgetStatistics->setFixedHeight(15); - QHBoxLayout *hl1 = new QHBoxLayout; - hl1->setSpacing(0); - hl1->setContentsMargins(0, 0, 0, 0); - QLabel *lblMin = new QLabel("Min: "); - lblMin->setFixedWidth(40); - lblMin->setAlignment(Qt::AlignRight); - QLabel *lblMax = new QLabel("Max: "); - lblMax->setFixedWidth(40); - lblMax->setAlignment(Qt::AlignRight); - QLabel *lblSum = new QLabel("Sum: "); - lblSum->setFixedWidth(40); - lblSum->setAlignment(Qt::AlignRight); - QLabel *lblMinDisp = new QLabel(min); - lblMinDisp->setAlignment(Qt::AlignLeft); - QLabel *lblMaxDisp = new QLabel(max); - lblMaxDisp->setAlignment(Qt::AlignLeft); - QLabel *lblSumDisp = new QLabel(sum); - lblSumDisp->setAlignment(Qt::AlignLeft); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - hl1->addWidget(lblMin); - hl1->addWidget(lblMinDisp); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Expanding,QSizePolicy::Fixed)); - hl1->addWidget(lblMax); - hl1->addWidget(lblMaxDisp); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Expanding,QSizePolicy::Fixed)); - hl1->addWidget(lblSum); - hl1->addWidget(lblSumDisp); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - widgetStatistics->setLayout(hl1); - mainLayout->addWidget(widgetStatistics,2,0); - widgetStatistics->show(); - - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - diff --git a/slsDetectorGui/src/qDetectorMain.cpp b/slsDetectorGui/src/qDetectorMain.cpp deleted file mode 100644 index c2f6013a3..000000000 --- a/slsDetectorGui/src/qDetectorMain.cpp +++ /dev/null @@ -1,908 +0,0 @@ -/********************************************************************** - * TO DO - * 1. settcpsocket is done with slsdetector.maybe do for all detectors connected: mythen - * ********************************************************************/ -// Qt Project Class Headers -#include "qDetectorMain.h" -#include "qTabDataOutput.h" -#include "qTabPlot.h" -#include "qTabActions.h" -#include "qTabAdvanced.h" -#include "qTabSettings.h" -#include "qTabDebugging.h" -#include "qTabDeveloper.h" -#include "qTabMessages.h" -#include "qServer.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -#include "sls_detector_defs.h" -#include "gitInfoGui.h" -// Qt Include Headers -#include -#include -#include -// C++ Include Headers -#include -#include -#include -using namespace std; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -int main (int argc, char **argv) { - QApplication *theApp = new QApplication(argc, argv); - // QApplication *theApp = new QApplication(argc, argv); - theApp->setStyle(new QPlastiqueStyle);//not default when desktop is windows - theApp->setWindowIcon(QIcon( ":/icons/images/mountain.png" )); - int ret = 1; - qDetectorMain *det=new qDetectorMain(argc, argv, theApp,ret,0); - if (ret == 1) - return EXIT_FAILURE; - det->show(); - //theApp->connect( theApp, SIGNAL(lastWindowClosed()), theApp, SLOT(quit())); - return theApp->exec(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qDetectorMain::qDetectorMain(int argc, char **argv, QApplication *app, int& ret, QWidget *parent) : - QMainWindow(parent), theApp(app),myDet(0),detID(0),myPlot(0),tabs(0),isDeveloper(0){ - - // options - string fname = ""; - int64_t tempval = 0; - - //parse command line for config - static struct option long_options[] = { - // These options set a flag. - //{"verbose", no_argument, &verbose_flag, 1}, - // These options don’t set a flag. We distinguish them by their indices. - { "developer", no_argument, 0, 'd' }, - { "config", required_argument, 0, 'f' }, - { "id", required_argument, 0, 'i' }, - {"version", no_argument, 0, 'v'}, - { "help", no_argument, 0, 'h' }, - { 0, 0, 0, 0 } - }; - - - // getopt_long stores the option index here. - int option_index = 0; - int c = 0; - - while ( c != -1 ){ - c = getopt_long (argc, argv, "hvdf:i:", long_options, &option_index); - - // Detect the end of the options. - if (c == -1) - break; - - switch(c){ - - case 'f': - fname=string(optarg); -#ifdef VERYVERBOSE - cout << long_options[option_index].name << " " << optarg << endl; -#endif - break; - - case 'd' : - isDeveloper = 1; - break; - - case 'i' : - detID=atoi(optarg); - break; - - case 'v': - tempval = GITDATE; - cout << "SLS Detector GUI " << GITBRANCH << " (0x" << hex << tempval << ")" << endl; - return; - - case 'h': - default: - string help_message = "\n" - + string(argv[0]) + "\n" - + "Usage: " + string(argv[0]) + " [arguments]\n" - + "Possible arguments are:\n" - + "\t-d, --developer : Enables the developer tab\n" - + "\t-f, --config : Loads config from file\n" - + "\t-i, --id : Sets the multi detector id to i. Default: 0. Required \n" - + "\t only when more than one multi detector object is needed.\n\n"; - cout << help_message << endl; - return; - - } - } - - setupUi(this); - SetUpDetector(fname); - SetUpWidgetWindow(); - Initialization(); - ret = 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qDetectorMain::~qDetectorMain(){ - if(myDet) delete myDet; - if (menubar) delete menubar; - if (centralwidget) delete centralwidget; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::SetUpWidgetWindow(){ - -// Layout - layoutTabs= new QGridLayout; - centralwidget->setLayout(layoutTabs); - -//plot setup - myPlot = new qDrawPlot(dockWidgetPlot,myDet); cout<<"DockPlot ready"<setWidget(myPlot); - -//tabs setup - tabs = new MyTabWidget(this); - layoutTabs->addWidget(tabs); - - -// creating all the other tab widgets - tab_measurement = new qTabMeasurement (this, myDet,myPlot); cout<<"Measurement ready"<setFrameShape(QFrame::NoFrame); - } - // setting the tab widgets to the scrollareas - scroll[Measurement] ->setWidget(tab_measurement); - scroll[DataOutput] ->setWidget(tab_dataoutput); - scroll[Plot] ->setWidget(tab_plot); - scroll[Actions] ->setWidget(tab_actions); - scroll[Settings] ->setWidget(tab_settings); - scroll[Advanced] ->setWidget(tab_advanced); - scroll[Debugging] ->setWidget(tab_debugging); - scroll[Developer] ->setWidget(tab_developer); - // inserting all the tabs - tabs->insertTab(Measurement, scroll[Measurement], "Measurement"); - tabs->insertTab(DataOutput, scroll[DataOutput], "Data Output"); - tabs->insertTab(Plot, scroll[Plot], "Plot"); - tabs->insertTab(Actions, scroll[Actions], "Actions"); - tabs->insertTab(Settings, scroll[Settings], "Settings"); - tabs->insertTab(Advanced, scroll[Advanced], "Advanced"); - tabs->insertTab(Debugging, scroll[Debugging], "Debugging"); - tabs->insertTab(Developer, scroll[Developer], "Developer"); - //no scroll buttons this way - tabs->insertTab(Messages, tab_messages, "Messages"); - -//swap tabs so that messages is last tab - tabs->tabBar()->moveTab(tabs->indexOf(tab_measurement), Measurement); - tabs->tabBar()->moveTab(tabs->indexOf(tab_settings), Settings); - tabs->tabBar()->moveTab(tabs->indexOf(tab_dataoutput), DataOutput); - tabs->tabBar()->moveTab(tabs->indexOf(tab_plot), Plot); - tabs->tabBar()->moveTab(tabs->indexOf(tab_actions), Actions); - tabs->tabBar()->moveTab(tabs->indexOf(tab_advanced), Advanced); - tabs->tabBar()->moveTab(tabs->indexOf(tab_debugging), Debugging); - tabs->tabBar()->moveTab(tabs->indexOf(tab_developer), Developer); - tabs->tabBar()->moveTab(tabs->indexOf(tab_messages), Messages); - tabs->setCurrentIndex(Measurement); - -//other tab properties - // Default tab color - defaultTabColor = tabs->tabBar()->tabTextColor(DataOutput); - //Set the current tab(measurement) to blue as it is the current one - tabs->tabBar()->setTabTextColor(0,QColor(0,0,200,255)); - // increase the width so it uses all the empty space for the tab titles - tabs->tabBar()->setFixedWidth(width()+61); - - // mode setup - to set up the tabs initially as disabled, not in form so done here -#ifdef VERBOSE - cout << "Setting Debug Mode to 0\nSetting Expert Mode to 0\nSetting Developer Mode to " << isDeveloper << "\nSetting Dockable Mode to false\n" << endl; -#endif - tabs->setTabEnabled(Debugging,false); - tabs->setTabEnabled(Advanced,false); - tabs->setTabEnabled(Developer,isDeveloper); - actionLoadTrimbits->setVisible(false); - actionSaveTrimbits->setVisible(false); - actionLoadCalibration->setVisible(false); - actionSaveCalibration->setVisible(false); - - dockWidgetPlot->setFloating(false); - dockWidgetPlot->setFeatures(QDockWidget::NoDockWidgetFeatures); - -// Other setup - //Height of plot and central widget - heightPlotWindow = dockWidgetPlot->size().height(); - heightCentralWidget = centralwidget->size().height(); - // Default zoom Tool Tip - zoomToolTip = dockWidgetPlot->toolTip(); - - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::SetUpDetector(const string fName){ - - - //instantiate detector and set window title - myDet = new multiSlsDetector(detID); - - //create messages tab to capture config file loading logs - tab_messages = new qTabMessages (this); cout<<"Messages ready"<getHostname(); - qDefs::checkErrorMessage(myDet,"qDetectorMain::SetUpDetector"); - - //if hostname doesnt exist even in shared memory - if(!host.length()){ - cout << endl << "No Detector Connected." << endl; - qDefs::Message(qDefs::CRITICAL,"No Detectors Connected. ","qDetectorMain::SetUpDetector"); - exit(-1); - } - - //check if the detector is not even connected - string offline = myDet->checkOnline(); - qDefs::checkErrorMessage(myDet,"qDetectorMain::SetUpDetector"); - - if(!offline.empty()){ - qDefs::Message(qDefs::CRITICAL,string("The detector(s) ")+offline+string(" is/are not connected. Exiting GUI."),"qDetectorMain::SetUpDetector"); - cout << "The detector(s) " << host << " is/are not connected. Exiting GUI." << endl; - exit(-1); - } - - // Check if type valid. If not, exit - slsDetectorDefs::detectorType detType = myDet->getDetectorsType(); - qDefs::checkErrorMessage(myDet,"qDetectorMain::SetUpDetector"); - - switch(detType){ - case slsDetectorDefs::MYTHEN: break; - case slsDetectorDefs::EIGER: break; - case slsDetectorDefs::GOTTHARD: - case slsDetectorDefs::AGIPD: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - actionLoadTrimbits->setText("Load Settings"); actionSaveTrimbits->setText("Save Settings"); - break; - default: - string detName = myDet->slsDetectorBase::getDetectorType(detType); - qDefs::checkErrorMessage(myDet,"qDetectorMain::SetUpDetector"); - cout << "ERROR: " + host + " has unknown detector type \"" + detName + "\". Exiting GUI." << endl; - string errorMess = host+string(" has unknown detector type \"")+ - detName+string("\". Exiting GUI."); - qDefs::Message(qDefs::CRITICAL,errorMess,"qDetectorMain::SetUpDetector"); - exit(-1); - } - setWindowTitle("SLS Detector GUI : "+ - QString(slsDetectorBase::getDetectorType(detType).c_str())+ " - "+QString(host.c_str())); -//#ifdef VERBOSE - cout << endl << "Type : " << slsDetectorBase::getDetectorType(detType) << "\nDetector : " << host << endl; -//#endif - myDet->setOnline(slsDetectorDefs::ONLINE_FLAG); - if(detType != slsDetectorDefs::MYTHEN) - myDet->setReceiverOnline(slsDetectorDefs::ONLINE_FLAG); - qDefs::checkErrorMessage(myDet,"qDetectorMain::SetUpDetector"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::Initialization(){ -// Dockable Plot - connect(dockWidgetPlot, SIGNAL(topLevelChanged(bool)), this,SLOT(ResizeMainWindow(bool))); -// tabs - connect(tabs, SIGNAL(currentChanged(int)), this, SLOT(Refresh(int)));//( QWidget*))); - // Measurement tab - connect(tab_measurement, SIGNAL(StartSignal()), this,SLOT(EnableTabs())); - connect(tab_measurement, SIGNAL(StopSignal()), myPlot,SLOT(StopAcquisition())); - connect(tab_measurement, SIGNAL(CheckPlotIntervalSignal()), tab_plot,SLOT(SetFrequency())); - // Data Output Tab - connect(tab_dataoutput, SIGNAL(AngularConversionSignal(bool)), tab_actions,SLOT(EnablePositions(bool))); - //enable scanbox( for angles) - connect(tab_dataoutput, SIGNAL(AngularConversionSignal(bool)), tab_plot,SLOT(EnableScanBox())); - // Plot tab - connect(tab_plot, SIGNAL(DisableZoomSignal(bool)), this,SLOT(SetZoomToolTip(bool))); - // Actions tab (only for scan) - connect(tab_actions, SIGNAL(EnableScanBox()), tab_plot,SLOT(EnableScanBox())); - //settings to advanced tab(int is always 0 to only refresh) - connect(tab_settings, SIGNAL(UpdateTrimbitSignal(int)), tab_advanced,SLOT(UpdateTrimbitPlot(int))); -// Plotting - // When the acquisition is finished, must update the meas tab - connect(myPlot, SIGNAL(UpdatingPlotFinished()), this, SLOT(EnableTabs())); - connect(myPlot, SIGNAL(UpdatingPlotFinished()), tab_measurement, SLOT(UpdateFinished())); - //This should not be called as it will change file name to measurement when run finished - //connect(myPlot, SIGNAL(UpdatingPlotFinished()), tab_plot, SLOT(Refresh())); - connect(myPlot, SIGNAL(SetCurrentMeasurementSignal(int)), tab_measurement, SLOT(SetCurrentMeasurement(int))); - - -// menubar - // Modes Menu - connect(menuModes, SIGNAL(triggered(QAction*)), this,SLOT(EnableModes(QAction*))); - // Utilities Menu - connect(menuUtilities, SIGNAL(triggered(QAction*)), this,SLOT(ExecuteUtilities(QAction*))); - // Help Menu - connect(menuHelp, SIGNAL(triggered(QAction*)), this,SLOT(ExecuteHelp(QAction*))); - - -//server - connect(myServer, SIGNAL(ServerStoppedSignal()), this,SLOT(UncheckServer())); -} - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::LoadConfigFile(const string fName){ -#ifdef VERBOSE - cout << "Loading config file at start up:" << fName << endl; -#endif - struct stat st_buf; - QString file = QString(fName.c_str()); - - //path doesnt exist - if(stat(fName.c_str(),&st_buf)) - qDefs::Message(qDefs::WARNING,string("Start up configuration failed to load. The following file does not exist:
")+fName,"qDetectorMain::LoadConfigFile"); - - //not a file - else if (!S_ISREG (st_buf.st_mode)) - qDefs::Message(qDefs::WARNING,string("Start up configuration failed to load. The following file is not a recognized file format:
")+fName,"qDetectorMain::LoadConfigFile"); - - else{ - //could not load config file - if(myDet->readConfigurationFile(fName)==slsDetectorDefs::FAIL) - qDefs::Message(qDefs::WARNING,string("Could not load all the Configuration Parameters from file:
")+fName,"qDetectorMain::LoadConfigFile"); - //successful - else - qDefs::Message(qDefs::INFORMATION,"
The Configuration Parameters have been loaded successfully at start up.","qDetectorMain::LoadConfigFile"); - - qDefs::checkErrorMessage(myDet,"qDetectorMain::LoadConfigFile"); - } -} - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::EnableModes(QAction *action){ - bool enable; - - //listen to gui client - if(action==actionListenGuiClient){ - - myServer->StartStopServer(actionListenGuiClient->isChecked()); - - //disconnect(menuModes, SIGNAL(triggered(QAction*)), this,SLOT(EnableModes(QAction*))); - //actionListenGuiClient->setChecked(myServer->StartStopServer(actionListenGuiClient->isChecked())); - //connect(menuModes, SIGNAL(triggered(QAction*)), this,SLOT(EnableModes(QAction*))); - } - //Set DebugMode - else if(action==actionDebug){ - enable = actionDebug->isChecked(); - tabs->setTabEnabled(Debugging,enable); -#ifdef VERBOSE - cout << "Setting Debug Mode to " << enable << endl; -#endif - } - - //Set ExpertMode(comes here only if its a digital detector) - else if(action==actionExpert){ - enable = actionExpert->isChecked(); - - tabs->setTabEnabled(Advanced,enable); - actionLoadTrimbits->setVisible(enable); - actionSaveTrimbits->setVisible(enable); - actionLoadCalibration->setVisible(enable); - actionSaveCalibration->setVisible(enable); - tab_measurement->SetExpertMode(enable); - tab_settings->SetExpertMode(enable); -#ifdef VERBOSE - cout << "Setting Expert Mode to " << enable << endl; -#endif - } - - //Set DockableMode - else{ - enable = actionDockable->isChecked(); - if(enable) - dockWidgetPlot->setFeatures(QDockWidget::DockWidgetFloatable); - else{ - dockWidgetPlot->setFloating(false); - dockWidgetPlot->setFeatures(QDockWidget::NoDockWidgetFeatures); - } -#ifdef VERBOSE - cout << "Setting Dockable Mode to " << enable << endl; -#endif - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::ExecuteUtilities(QAction *action){ - bool refreshTabs = false; - if(action==actionOpenSetup){ -#ifdef VERBOSE - cout << "Loading Setup" << endl; -#endif - QString fName = QString(myDet->getFilePath().c_str()); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - fName = QFileDialog::getOpenFileName(this, - tr("Load Detector Setup"),fName, - tr("Detector Setup files (*.det);;All Files(*)")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->retrieveDetectorSetup(string(fName.toAscii().constData()))!=slsDetectorDefs::FAIL){ - qDefs::Message(qDefs::INFORMATION,"The Setup Parameters have been loaded successfully.","qDetectorMain::ExecuteUtilities"); - refreshTabs=true; - }else qDefs::Message(qDefs::WARNING,string("Could not load the Setup Parameters from file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - else if(action==actionSaveSetup){ -#ifdef VERBOSE - cout << "Saving Setup" << endl; -#endif - QString fName = QString(myDet->getFilePath().c_str()); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - fName = QFileDialog::getSaveFileName(this, - tr("Save Current Detector Setup"),fName, - tr("Detector Setup files (*.det);;All Files(*) ")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->dumpDetectorSetup(string(fName.toAscii().constData()))!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Setup Parameters have been saved successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not save the Setup Parameters from file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - else if(action==actionOpenConfiguration){ -#ifdef VERBOSE - cout << "Loading Configuration" << endl; -#endif - QString fName = QString(myDet->getFilePath().c_str()); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - fName = QFileDialog::getOpenFileName(this, - tr("Load Detector Configuration"),fName, - tr("Configuration files (*.config);;All Files(*)")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->readConfigurationFile(string(fName.toAscii().constData()))!=slsDetectorDefs::FAIL){ - qDefs::Message(qDefs::INFORMATION,"The Configuration Parameters have been configured successfully.","qDetectorMain::ExecuteUtilities"); - refreshTabs=true; - }else qDefs::Message(qDefs::WARNING,string("Could not load all the Configuration Parameters from file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - else if(action==actionSaveConfiguration){ -#ifdef VERBOSE - cout << "Saving Configuration" << endl; -#endif - QString fName = QString(myDet->getFilePath().c_str()); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - fName = QFileDialog::getSaveFileName(this, - tr("Save Current Detector Configuration"),fName, - tr("Configuration files (*.config) ;;All Files(*)")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->writeConfigurationFile(string(fName.toAscii().constData()))!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Configuration Parameters have been saved successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not save the Configuration Parameters from file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - else if(action==actionLoadTrimbits){ - QString fName = QString( (myDet->getSettingsDir()).c_str()); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - //gotthard - if(actionLoadTrimbits->text().contains("Settings")){ -#ifdef VERBOSE - cout << "Loading Settings" << endl; -#endif - fName = QFileDialog::getOpenFileName(this, - tr("Load Detector Settings"),fName, - tr("Settings files (*.settings settings.sn*);;All Files(*)")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->loadSettingsFile(string(fName.toAscii().constData()),-1)!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Settings have been loaded successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not load the Settings from file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - - }//mythen and eiger - else{ -#ifdef VERBOSE - cout << "Loading Trimbits" << endl; -#endif - //so that even nonexisting files can be selected - QFileDialog *fileDialog = new QFileDialog(this, - tr("Load Detector Trimbits"),fName, - tr("Trimbit files (*.trim noise.sn*);;All Files(*)")); - fileDialog->setFileMode(QFileDialog::AnyFile ); - if ( fileDialog->exec() == QDialog::Accepted ) - fName = fileDialog->selectedFiles()[0]; - - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->loadSettingsFile(string(fName.toAscii().constData()),-1)!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Trimbits have been loaded successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not load the Trimbits from file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - } - else if(action==actionSaveTrimbits){ - //gotthard - if(actionLoadTrimbits->text().contains("Settings")){ -#ifdef VERBOSE - cout << "Saving Settings" << endl; -#endif - //different output directory so as not to overwrite - QString fName = QString( (myDet->getSettingsDir()).c_str() ); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - fName = QFileDialog::getSaveFileName(this, - tr("Save Current Detector Settings"),fName, - tr("Settings files (*.settings settings.sn*);;All Files(*) ")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->saveSettingsFile(string(fName.toAscii().constData()),-1)!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Settings have been saved successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not save the Settings to file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - }//mythen and eiger - else{ -#ifdef VERBOSE - cout << "Saving Trimbits" << endl; -#endif//different output directory so as not to overwrite - QString fName = QString( (myDet->getSettingsDir()).c_str() ); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - fName = QFileDialog::getSaveFileName(this, - tr("Save Current Detector Trimbits"),fName, - tr("Trimbit files (*.trim noise.sn*) ;;All Files(*)")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->saveSettingsFile(string(fName.toAscii().constData()),-1)!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Trimbits have been saved successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not save the Trimbits to file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - } - else if(action==actionLoadCalibration){ -#ifdef VERBOSE - cout << "Loading Calibration Data" << endl; -#endif - QString fName = QString( (myDet->getCalDir()).c_str() ); - qDefs::checkErrorMessage(myDet); - - //so that even nonexisting files can be selected - QFileDialog *fileDialog = new QFileDialog(this, - tr("Load Detector Calibration Data"),fName, - tr("Calibration files (*.cal calibration.sn*);;All Files(*)")); - fileDialog->setFileMode(QFileDialog::AnyFile ); - if ( fileDialog->exec() == QDialog::Accepted ) - fName = fileDialog->selectedFiles()[0]; - - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->loadCalibrationFile(string(fName.toAscii().constData()),-1)!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Calibration Data have been loaded successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not load the Calibration data from file:\n")+ fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - else if(action==actionSaveCalibration){ -#ifdef VERBOSE - cout << "Saving Calibration Data" << endl; -#endif//different output directory so as not to overwrite - QString fName = QString( (myDet->getCalDir()).c_str() ); - qDefs::checkErrorMessage(myDet); - fName = QFileDialog::getSaveFileName(this, - tr("Save Current Detector Calibration Data"),fName, - tr("Calibration files (*.cal calibration.sn*);;All Files(*) ")); - // Gets called when cancelled as well - if (!fName.isEmpty()){ - if(myDet->saveCalibrationFile(string(fName.toAscii().constData()),-1)!=slsDetectorDefs::FAIL) - qDefs::Message(qDefs::INFORMATION,"The Calibration Data have been saved successfully.","qDetectorMain::ExecuteUtilities"); - else qDefs::Message(qDefs::WARNING,string("Could not save the Calibration data to file:\n")+fName.toAscii().constData(),"qDetectorMain::ExecuteUtilities"); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteUtilities"); - } - } - - Refresh(tabs->currentIndex()); - if(refreshTabs){ - tab_actions->Refresh(); - tab_measurement->Refresh(); - tab_settings->Refresh(); - tab_dataoutput->Refresh(); - if(tab_advanced->isEnabled()) tab_advanced->Refresh(); - if(tab_debugging->isEnabled()) tab_debugging->Refresh(); - if(tab_developer->isEnabled()) tab_developer->Refresh(); - - tab_plot->Refresh(); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::ExecuteHelp(QAction *action){ - if(action==actionAbout){ -#ifdef VERBOSE - cout << "About: Common GUI for Mythen, Eiger, Gotthard, Jungfrau, Moench and Propix detectors" << endl; -#endif - char version[200]; - long long unsigned int retval= GITDATE; - sprintf(version,"%llx",retval); - string thisGUIVersion = string(version); - - sprintf(version,"%llx",(long long unsigned int)myDet->getId(slsDetectorDefs::THIS_SOFTWARE_VERSION)); - qDefs::checkErrorMessage(myDet,"qDetectorMain::ExecuteHelp"); - string thisClientVersion = string(version); - - //

A heading

- qDefs::Message(qDefs::INFORMATION,"

1Wi=wp18&+=T&2g@j8;LG4_UITi8Hzm9RgX3y&5@(gV`{W!`%^kuU%Sg_-brM zn_X4Cq;kP1)G}=TdaEtV2T(2E?&hY7LCopyO{!dU4c}Acbn@TOPB5mNM^1xy!iMfh zTxc^^Wi!_3s$itU7;FT0N^QoXJ)Kc1)E~Ds&6&sv@o{%ES8CTE{2#9tI)zzYWcdv} z2mrTaCIO~)4cDrSVrEosXJMc%vCw8aXxTz~LYiitiEaah1y0s9X02u=uasL?-_+s- ziwle)X*EGi1a%Kd;?u@zaEN(cvYwd$Qm_p>wNM!wwdK7e)EpBF<-~2u2`pFYe4(|5 zJI~NCtT6lW7BC(uscqK#AZ+G$9`H~+Hl?wx!LRE=V-i1@=g>J00TvFM% z5|m8o#u=<18OX2xi^?#c*uo{0r{WFJWgbXWe`w_yl2?l5)wi!(%d53E&Zid6atG%F z;BbZ?z0St@hlO*AgYyD#_!m9P!lClUfTkGS3q(I=pfrm@#MNo{Sg>vABTn?J#3N5}OS^IhMP~DHJFp!gjE6)kYBsqU*yd21;iC5WW}AUWQG~Q8w|Yg( zEJCiFt4ZhJ8%PJdT4V%xvk^bE5HC$a+)KoNK?XLWX(67Pgt&uv&V`Gi7ur?)O8N?DHQrpmr zQ-G*?k^K3sUfhki>cxd3TFhK6&E#^O{X8Dc=C*dl8Bo2scy|*B8?z?xciMyaoofuZ zM}omy2^(-5e+Q@YS6|5tyh<=LxM6HYaOzkeCct%}VuzEJs2z9rfrYI!+YHG!UKsZ4Crl7h2&E+zKLC3NSZ1 z28F9f55x1ona!XdB1UyNQr)t*t*#l@Ij@H6LlUWoTk_&m%IWT3j*=1dU@ zKaP(1FRze34n#i2!Xx5#8Q7NzYs?E;c_RF$9M+7Vc45u>cs<;Y%uZ(j18=PGtet}? zOGmXA9;bHi6fmt0u4^dl_s~G(e#~5q^VMGf=!_P-Sq0jpMHhj4glL_d-^r_WWK$J2 zr8Rh7)Gj=`bV!v47-zUXOciXvsk+(;?(l5HCq~<;XlNliMjE*Z3oDm+v3DjZd&cEX z{r{YSx7*VSLfUk6V{fo2o6Y!)M^AL-S}1#KQ2+E*FZ%yO{IY}l6BagSQ(UKqC@gat z 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 diff --git a/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv4.0.1.4 b/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServerv4.0.1.4 deleted file mode 100755 index 8c97ee254bfc894e45fee0868bfed836a0116571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117808 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 diff --git a/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c deleted file mode 100755 index 8d73b536f..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/mcb_funcs.c +++ /dev/null @@ -1,2340 +0,0 @@ -#ifdef MCB_FUNCS - -#include -#include -#include -#include -#include -#include "registers_g.h" - -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" - -/* global variables */ -#undef DEBUG -#undef DEBUGOUT - -extern int nModX; -//extern int dataBytes; -extern int dynamicRange; -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; -const int allSelected=-2; -const int noneSelected=-1; - - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -int *detectorDacs=NULL; -int *detectorAdcs=NULL; -//int numberOfProbes; - -ROI rois[MAX_ROIS]; -int nROI=0; - - -int initDetector() { - - int imod; - // sls_detector_module *myModule; - int n=getNModBoard(); - nModX=n; - -#ifdef VERBOSE - printf("Board is for %d modules\n",n); -#endif - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorChips=malloc(n*NCHIP*sizeof(int)); - detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(n*NDAC*sizeof(int)); - detectorAdcs=malloc(n*NADC*sizeof(int)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); - printf("chips from 0x%x to 0x%x\n",(unsigned int)(detectorChips), (unsigned int)(detectorChips+n*NCHIP)); - printf("chans from 0x%x to 0x%x\n",(unsigned int)(detectorChans), (unsigned int)(detectorChans+n*NCHIP*NCHAN)); - printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*NDAC)); - printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*NADC)); -#endif - for (imod=0; imoddacs=detectorDacs+imod*NDAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; - (detectorModules+imod)->ndac=NDAC; - (detectorModules+imod)->nadc=NADC; - (detectorModules+imod)->nchip=NCHIP; - (detectorModules+imod)->nchan=NCHIP*NCHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ - } - thisSettings=UNINITIALIZED; - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - - /* - setCSregister(ALLMOD); //commented out by dhanya - setSSregister(ALLMOD); - counterClear(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - */ - - /* initialize dynamic range etc. */ - /* dynamicRange=getDynamicRange(); //always 16 not required commented out - nModX=setNMod(-1);*/ - - //dataBytes=nModX*NCHIP*NCHAN*4; - // dynamicRange=32; - // initChip(0, 0,ALLMOD); - //nModX=n; - // - - - return OK; -} - - -int setDefaultDacs() { - printf("Setting Default Dac values\n"); - - int ret = OK; - int i = 0; - int retval[2]={-1,-1}; - const int defaultvals[NDAC] = DEFAULT_DAC_VALS; - - for(i = 0; i < NDAC; ++i) { - // if not already default, set it to default - if (setDACRegister(i, -1, -1) != defaultvals[i]) { - initDACbyIndexDACU(i, defaultvals[i], 0, 0, retval); - if (abs(retval[0] - defaultvals[i])<=3) { - cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); - ret = FAIL; - } - } - } - - return ret; -} - - - -int copyChannel(sls_detector_channel *destChan, sls_detector_channel *srcChan) { - destChan->chan=srcChan->chan; - destChan->chip=srcChan->chip; - destChan->module=srcChan->module; - destChan->reg=srcChan->reg; - return OK; -} - - -int copyChip(sls_detector_chip *destChip, sls_detector_chip *srcChip) { - - int ichan; - int ret=OK; - if ((srcChip->nchan)>(destChip->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - - destChip->nchan=srcChip->nchan; - destChip->reg=srcChip->reg; - destChip->chip=srcChip->chip; - destChip->module=srcChip->module; - for (ichan=0; ichan<(srcChip->nchan); ichan++) { - *((destChip->chanregs)+ichan)=*((srcChip->chanregs)+ichan); - } - return ret; -} - - -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - - int ichip, idac, ichan, iadc; - - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",(unsigned int)(srcMod),(unsigned int)(destMod)); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ -/* #ifdef VERBOSE */ -/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ -/* #endif */ - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - - - - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - - -/* Register commands */ - - -int clearDACSregister(int imod) { - - putout("1111111111111111",imod);//reset - putout("1111111111111110",imod);//cs down - - /* commented out by dhanya - putout("0000000001000000",imod); - putout("0000000101000000",imod); - putout("0000000101000000",imod); - putout("0000000001000000",imod); - */ -#ifdef DEBUG - fprintf(stdout, "Clearing DAC shiftregister\n"); -#endif - // sDac=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - -int nextDAC(int imod) { - - putout("1111111111111011",imod);//cs up - putout("1111111111111001",imod);//clk down - putout("1111111111111111",imod);//reset - - /*commented out by dhanya - putout("0000000001000000",imod); - putout("0000000001001000",imod); - putout("0000000001000000",imod); - */ -#ifdef DEBUG - fprintf(stdout, "Next DAC\n"); -#endif - // sDac++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - - -int clearCSregister(int imod) { - - putout("0000000001000000",imod); - putout("0000100001000000",imod); - putout("0000100001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Clearing CS shiftregister\n"); -#endif - /* - sChan=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - */ - sChip=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - //putout("0000000000000000",imod); - return 0; -} - -int setCSregister(int imod){ - - putout("0000000001000000",imod); - putout("0001000001000000",imod); - putout("0001000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Setting CS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChip=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextChip(int imod){ - - putout("0000000001000000",imod); - putout("0010000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Next Chip\n"); -#endif - sChip++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int firstChip(int imod){ - - putout("0100000001000000",imod); - putout("0110000001000000",imod); - putout("0100000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "First Chip\n"); -#endif - sChip=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int clearSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0000111000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Clearing SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int setSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0001011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Setting SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextStrip(int imod){ - putout("0000011000000000",imod); - putout("0010011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"|-"); -#endif - sChan++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int selChannel(const int strip,int imod) { - int istrip; - clearSSregister(imod); - nextStrip(imod); - for (istrip=0; istrip=0 && imod=0) - initDAC(ind,val, imod); - - if (imod>=0 && imodndac) - return (detectorDacs[ind+imod*NDAC]); - } - return FAIL; - */ - return setDACRegister(ind, -1, imod); -} - - -int initDAC(int dac_addr, int value, int imod) { -// int i; -#ifdef VERBOSE - printf("Programming dac %d with value %d\n", dac_addr, value); -#endif - clearDACSregister(imod); - program_one_dac(dac_addr,value,imod); - nextDAC(imod); - clearDACSregister(imod); - - return 0; -} - -int getTemperatureByModule(int tempSensor, int imod) -{ - int im; - //for the particular module - if (imod>=0 && imod=0 && imod=0 && imod=0) { -#ifdef VERBOSE - fprintf(stdout, "voltage %d\n", *(v+iaddr)); -#endif - program_one_dac(iaddr, *(v+iaddr),imod); - } - nextDAC(imod); - } - - - clearDACSregister(imod); - - return 0; - -} - - - - -int setSettings(int i, int imod) { -#ifdef VERBOSE - if(i==-1) - printf("\nReading settings of detector...\n"); - else - printf("\ninside set settings wit settings=%d...\n",i); -#endif - int confgain[] = CONF_GAIN; - int isett=-2,retval; - - //reading settings - if(i==GET_SETTINGS){ - retval=initConfGainByModule(i,i,imod); - if(retval==i) - isett=UNDEFINED; - } - //writing settings - else{ - retval=initConfGainByModule(i,confgain[i],imod); - if(retval!=i) - isett=UNDEFINED; - } - //if error while read/writing - if(isett==UNDEFINED) - printf("Error:Weird Value read back from the Gain/Settings Reg\n"); - else{ - //validating the settings read back - if((retval>=HIGHGAIN)&&(retval<=VERYHIGHGAIN)) - isett=retval; - else{ - isett=UNDEFINED; - printf("Error:Wrong Settings Read out:%d\n",retval); - } - } - thisSettings=isett; -//#ifdef VERBOSE - printf("detector settings are %d\n",thisSettings); -//#endif - return thisSettings; -} - - - - -/* Initialization*/ - -int initChannelbyNumber(sls_detector_channel myChan) { - int reg=myChan.reg; - int ft=reg & TRIM_DR; - int cae=(reg>>(NTRIMBITS))&1; - int ae=(reg>>(NTRIMBITS+1))&1; - int coe=(reg>>(NTRIMBITS+2))&1; - int ocoe=(reg>>(NTRIMBITS+3))&1; - int counts=(reg>>(NTRIMBITS+4)); -#ifdef VERBOSE - printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); - printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); -#endif - - if (myChan.chip<0) - setCSregister(myChan.module); - else - selChip(myChan.chip,myChan.module); - - if (myChan.chan<0) - setSSregister(myChan.module); - else - selChannel(myChan.chan,myChan.module); - - initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); - - setDynamicRange(dynamicRange); - - setCSregister(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - - return myChan.reg; - -} - -int getChannelbyNumber(sls_detector_channel* myChan) { - int imod, ichip, ichan; - imod=myChan->module; - ichip=myChan->chip; - ichan=myChan->chan; - - if (detectorChans) { - if (imod=0) { - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; - return OK; - } - } - return FAIL; - -} - -int getTrimbit(int imod, int ichip, int ichan) { - if (detectorChans) { - if (imod=0) - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); - } - - return -1; -} - -int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){ - - int ibit, bit, i, im, ichip, ichan; - int chanmi, chanma, chipmi, chipma, modmi, modma; - - - - sMod=imod; - // printf("initializing module %d\n",sMod); - if (imod==ALLMOD) { - sMod=allSelected; - - // printf("initializing all modules\n"); - } - - if (sChan==allSelected) { - // printf("initializing all channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=NCHAN; - } else if (sChan==noneSelected || sChan>NCHAN || sChan<0) { - // printf("initializing no channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=-1; - } else { - // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); - chanmi=sChan; - chanma=sChan+1; - } - - if (sChip==allSelected) { - // printf("initializing all chips\n"); - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - // printf("initializing no chips\n"); - chipmi=0; - chipma=-1; - } else { - // printf("initializing chip %d\n",sChip); - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - return 1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChans) { - for (im=modmi; im63 || ft<0) { - fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); - return 1; - } - /*cal_enable*/ - if (cae) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - } - /*n_an_enable*/ - if (ae) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } else { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } - /*trb5*/ - ibit=5; - bit=ft & (1<>1; - int nchan, ichan; - int ft, cae, ae, coe, ocoe, counts, chanreg; - - - - nchan=myChip.nchan; - if (ichip<0) - setCSregister(imod); - else - selChip(ichip,imod); - - clearSSregister(imod); - for (ichan=0; ichan>(NTRIMBITS+1))&1; - ae=(chanreg>>(NTRIMBITS+2))&1; - coe=((chanreg)>>(NTRIMBITS+3))&1; - ocoe=((chanreg)>>(NTRIMBITS+4))&1; - counts=((chanreg)>>(NTRIMBITS+5)); - nextStrip(imod); - initChannel(ft,cae,ae, coe, ocoe, counts,imod); - } - initChip(obe,ow,imod); - return myChip.reg; - -} - -int getChipbyNumber(sls_detector_chip* myChip){ - int imod, ichip; - imod=myChip->module; - ichip=myChip->chip; - - if (detectorChips) { - if (imodnchip) { - myChip->reg=detectorChips[ichip+imod*NCHIP]; - myChip->nchan=NCHAN; - myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; - return OK; - } - } - return FAIL; - -} - - - -int initChip(int obe, int ow,int imod){ - int i; - int im, ichip; - int chipmi, chipma, modmi, modma; - /* switch (ow) { - case 0:; - case 1: - setDynamicRange(32); - break; - case 2: - setDynamicRange(16); - break; - case 3: - setDynamicRange(8); - break; - case 4: - setDynamicRange(4); - break; - case 5: - setDynamicRange(1); - break; - default: - setDynamicRange(32); - break; - } - */ - -#ifdef DEBUGOUT - printf("Initializing chip\n"); -#endif - putout("0000000000000000",imod); -#ifdef DEBUGOUT - printf("Output mode= %d\n", ow); -#endif - - /* clearing shift in register */ - for (i=0; i<10; i++) - putout("0000100000000000",imod); - putout("0000000000000000",imod); - - if (ow>0) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - for (i=0; i<(OUTMUX_OFFSET-1); i++) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>1) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>2) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>3) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>4) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - } -#ifdef DEBUGOUT - printf("Output buffer enable= %d\n", obe); -#endif - if (obe) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - /*}*/ - putout("0000000000000000",imod); - - - - - - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - - - if (sChip==allSelected) { - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imNCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imnModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorModules) { - for (im=modmi; imreg)=cm; -#ifdef VERBOSE - printf("imod=%d reg=%d (%x)\n",im,(detectorModules+im)->reg,(unsigned int)((detectorModules+im))); -#endif - } - } - return 0; -} - -int initModulebyNumber(sls_detector_module myMod) { - - printf("\ninside initmoduleynumber..\n"); - - int nchip,nchan;//int ichip, nchip, ichan, nchan; - int im, modmi,modma; - // int ft, cae, ae, coe, ocoe, counts, chanreg; - int imod; - // int obe; - // int ow; - int v[NDAC]; - - - nchip=myMod.nchip; - nchan=(myMod.nchan)/nchip; - - imod=myMod.module; - sMod=imod; - - if (sMod==ALLMOD) - sMod=allSelected; - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {// (sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - - /* - for (idac=0; idacmodule; -#ifdef VERBOSE - printf("Getting module %d\n",imod); -#endif - if (detectorModules) { - copyModule(myMod,detectorModules+imod); - ; - } else - return FAIL; - - return OK; -} - -/* To chips */ -int clearCounter(int imod){ - int i; -#ifdef DEBUG - printf("Clearing counter with contclear\n"); -#endif - putout("0000000000000000",imod); - for (i=0; i<10; i++) - putout("0000000000010000",imod); - putout("0000000000000000",imod); - - return 0; -} - -int clearOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Clearing output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0000110000000000",imod); - putout("0000010000000000",imod); - return 0; -} -int setOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Setting output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0001010000000000",imod); - putout("0000010000000000",imod); - return 0; -} - - -int extPulse(int ncal, int imod) { - int ical; -#ifdef DEBUG - printf("Giving a clock pulse to the counter\n"); -#endif - for (ical=0; ical0 && i%2==0) { - printf("Shift in: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<0 && (dum & (1<0) { - printf("Shift out: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, (dum &1<0 && i%2==0) { - printf("Shift stsel: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<> 1; - - - putout("0000000000000000",ALLMOD); - putout("0010000000000000",ALLMOD); //change mux setting - putout("0000000000000000",ALLMOD); - } - - printf("Test FpgaMux module %d : %d errors\n", imod,result); - if (result) - return 1; - else - return 0; -} - - - - - - - - - -int calibration_sensor(int num, int *v, int *dacs) { - int ich, ichip, imod; - int val[10]; - - - printf("calibrating sensor..."); - for (imod=0; imod=0){ - - //clear rois - for(i=0;i=0) && (adc<=4)); - else { - printf("warning:adc value greater than 5. deleting roi\n"); - adc=-1; - } - } - } - printf("\tGoing to enable adc: %d\n", adc); - - //set rois for just 1 adc - take only 1st roi - if(adc!=-1){ - rois[0].xmin=adc*(NCHAN*NCHIPS_PER_ADC); - rois[0].xmax=(adc+1)*(NCHAN*NCHIPS_PER_ADC)-1; - rois[0].ymin=-1; - rois[0].ymax=-1; - nROI = 1; - printf("\tActual xmin:%d xmax:%d\n",rois[0].xmin,rois[0].xmax); - }else - nROI = 0; - - if((n!=0) && ((arg[0].xmin!=rois[0].xmin)|| - (arg[0].xmax!=rois[0].xmax)|| - (arg[0].ymin!=rois[0].ymin)|| - (arg[0].ymax!=rois[0].ymax))) - *ret=FAIL; - if(n!=nROI) - *ret=FAIL; - - //set adc of interest - setADC(adc); - } - -//#ifdef VERBOSE - if (nROI) { - printf("Rois:\n"); - for( i=0;i -#include - - -extern int sockfd; -extern int phase_shift; - - - -void error(char *msg) -{ - perror(msg); -} - -int main(int argc, char *argv[]) -{ - int portno, b; - char cmd[100]; - int retval=OK; - int sd, fd; - int iarg; - for(iarg=1; iarg - - -// Hardware definitions - -#define NCHAN 128 -#define NCHIP 10 -#define NMAXMODX 1 -#define NMAXMODY 1 -#define NMAXMOD NMAXMODX*NMAXMODY -#define NDAC 8 -#define NADC 5 - -#define NCHANS NCHAN*NCHIP*NMAXMOD -#define NDACS NDAC*NMAXMOD - -#define NTRIMBITS 6 -#define NCOUNTBITS 24 - -#define NCHIPS_PER_ADC 2 - -// for 25 um -#define CONFIG_FILE "config.txt" - - -//#define TRIM_DR ((2**NTRIMBITS)-1) -//#define COUNT_DR ((2**NCOUNTBITS)-1) -#define TRIM_DR (((int)pow(2,NTRIMBITS))-1) -#define COUNT_DR (((int)pow(2,NCOUNTBITS))-1) - - -#define ALLMOD 0xffff -#define ALLFIFO 0xffff - - -#define ADCSYNC_VAL 0x32214 -#define TOKEN_RESTART_DELAY 0x88000000 -#define TOKEN_RESTART_DELAY_ROI 0x1b000000 -#define TOKEN_TIMING_REV1 0x1f16 -#define TOKEN_TIMING_REV2 0x1f10 - -#define DEFAULT_PHASE_SHIFT 120 -#define DEFAULT_IP_PACKETSIZE 0x0522 -#define DEFAULT_UDP_PACKETSIZE 0x050E -#define ADC1_IP_PACKETSIZE (256*2+14+20) -#define ADC1_UDP_PACKETSIZE (256*2+4+8+2) - -#ifdef VIRTUAL -#define DEBUGOUT -#endif - -#define CLK_FREQ 32.007729 - - -#endif diff --git a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c deleted file mode 100755 index 3fe6591e5..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.c +++ /dev/null @@ -1,3153 +0,0 @@ -#include "sls_detector_defs.h" -#include "server_funcs.h" -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "registers_g.h" -#include "gitInfoGotthard.h" -#include "AD9257.h" // include "commonServerFunctions.h" -#include "versionAPI.h" - -#define FIFO_DATA_REG_OFF 0x50<<11 -#define CONTROL_REG 0x24<<11 -// Global variables - -int (*flist[256])(int); - -//defined in the detector specific file -#ifdef MYTHEND -const enum detectorType myDetectorType=MYTHEN; -#elif PROPIXD -const enum detectorType myDetectorType=PROPIX; -#elif GOTTHARDD -const enum detectorType myDetectorType=GOTTHARD; -#elif EIGERD -const enum detectorType myDetectorType=EIGER; -#elif PICASSOD -const enum detectorType myDetectorType=PICASSO; -#elif MOENCHD -const enum detectorType myDetectorType=MOENCH; -#else -const enum detectorType myDetectorType=GENERIC; -#endif - - -extern int nModX; -extern int nModY; -extern int dataBytes; -extern int dynamicRange; -extern int storeInRAM; - -extern int lockStatus; -extern char lastClientIP[INET_ADDRSTRLEN]; -extern char thisClientIP[INET_ADDRSTRLEN]; -extern int differentClients; - -/* global variables for optimized readout */ -extern unsigned int *ram_values; -char *dataretval=NULL; -int nframes, iframes, dataret; -char mess[MAX_STR_LENGTH]; - -int digitalTestBit = 0; - - -int init_detector( int b) { - - if (mapCSP0()==FAIL) { - printf("Could not map memory\n"); - exit(-1); - } - - //confirm if it is really gotthard - if (((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>> DETECTOR_TYPE_OFFSET) == MOENCH_MODULE){ - printf("This is a MOENCH detector. Exiting Gotthard Server.\n\n"); - exit(-1); - } - - if (b) { -#ifdef PROPIXD - printf("***This is a PROPIX detector***\n"); -#else - printf("***This is a GOTTHARD detector with %d chips per module***\n", NCHIP); -#endif - printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); -#ifdef MCB_FUNCS - initDetector(); - printf("Initializing Detector\n"); -#endif - testFpga(); - - //gotthard specific - setPhaseShiftOnce(); - configureADC(); - - setADC(-1); //already does setdaqreg and clean fifo - setSettings(DYNAMICGAIN,-1); - setDefaultDacs(); - - //Initialization - setFrames(1); - setTrains(1); - setExposureTime(1e6); - setPeriod(1e9); - setDelay(0); - setGates(0); - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - setMaster(GET_MASTER); - setSynchronization(GET_SYNCHRONIZATION_MODE); - startReceiver(1); - setMasterSlaveConfiguration(); - } - strcpy(mess,"dummy message"); - strcpy(lastClientIP,"none"); - strcpy(thisClientIP,"none1"); - lockStatus=0; - return OK; -} - - -int decode_function(int file_des) { - int fnum,n; - int retval=FAIL; -#ifdef VERBOSE - printf( "receive data\n"); -#endif - n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); - if (n <= 0) { -#ifdef VERBOSE - printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); -#endif - return FAIL; - } -#ifdef VERBOSE - else - printf("size of data received %d\n",n); -#endif - -#ifdef VERBOSE - printf( "calling function fnum = %d %x\n",fnum,(unsigned int)(flist[fnum])); -#endif - if (fnum<0 || fnum>255) - fnum=255; - retval=(*flist[fnum])(file_des); - if (retval==FAIL) - printf( "Error executing the function = %d \n",fnum); - return retval; -} - - -int function_table() { - int i; - for (i=0;i<256;i++){ - flist[i]=&M_nofunc; - } - flist[F_EXIT_SERVER]=&exit_server; - flist[F_EXEC_COMMAND]=&exec_command; - flist[F_GET_DETECTOR_TYPE]=&get_detector_type; - flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; - flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; - flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; - flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; - flist[F_GET_ID]=&get_id; - flist[F_DIGITAL_TEST]=&digital_test; - flist[F_WRITE_REGISTER]=&write_register; - flist[F_READ_REGISTER]=&read_register; - flist[F_SET_DAC]=&set_dac; - flist[F_GET_ADC]=&get_adc; - flist[F_SET_CHANNEL]=&set_channel; - flist[F_SET_CHIP]=&set_chip; - flist[F_SET_MODULE]=&set_module; - flist[F_GET_CHANNEL]=&get_channel; - flist[F_GET_CHIP]=&get_chip; - flist[F_GET_MODULE]=&get_module; - flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; - flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; - flist[F_SET_SETTINGS]=&set_settings; - flist[F_START_ACQUISITION]=&start_acquisition; - flist[F_STOP_ACQUISITION]=&stop_acquisition; - flist[F_START_READOUT]=&start_readout; - flist[F_GET_RUN_STATUS]=&get_run_status; - flist[F_READ_FRAME]=&read_frame; - flist[F_READ_ALL]=&read_all; - flist[F_START_AND_READ_ALL]=&start_and_read_all; - flist[F_SET_TIMER]=&set_timer; - flist[F_GET_TIME_LEFT]=&get_time_left; - flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; - flist[F_SET_ROI]=&set_roi; - flist[F_SET_SPEED]=&set_speed; - flist[F_SET_READOUT_FLAGS]=&set_readout_flags; - flist[F_EXECUTE_TRIMMING]=&execute_trimming; - flist[F_LOCK_SERVER]=&lock_server; - flist[F_SET_PORT]=&set_port; - flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; - flist[F_UPDATE_CLIENT]=&update_client; - flist[F_CONFIGURE_MAC]=&configure_mac; - flist[F_LOAD_IMAGE]=&load_image; - flist[F_SET_MASTER]=&set_master; - flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; - flist[F_READ_COUNTER_BLOCK]=&read_counter_block; - flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; - flist[F_PREPARE_ACQUISITION]=&start_receiver; - flist[F_CLEANUP_ACQUISITION]=&stop_receiver; - flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; - flist[F_WRITE_ADC_REG]=&write_adc_register; - flist[F_CHECK_VERSION]= &check_version; - return OK; -} - - -int M_nofunc(int file_des){ - - int ret=FAIL; - sprintf(mess,"Unrecognized Function\n"); - printf(mess); - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - - -int exit_server(int file_des) { - int retval=FAIL; - sendDataOnly(file_des,&retval,sizeof(retval)); - printf("closing server."); - sprintf(mess,"closing server"); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - -int exec_command(int file_des) { - char cmd[MAX_STR_LENGTH]; - char answer[MAX_STR_LENGTH]; - int retval=OK; - int sysret=0; - int n=0; - - /* receive arguments */ - n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - - /* execute action if the arguments correctly arrived*/ - if (retval==OK) { -#ifdef VERBOSE - printf("executing command %s\n", cmd); -#endif - if (lockStatus==0 || differentClients==0) - sysret=system(cmd); - - //should be replaced by popen - if (sysret==0) { - sprintf(answer,"Succeeded\n"); - if (lockStatus==1 && differentClients==1) - sprintf(answer,"Detector locked by %s\n", lastClientIP); - } else { - sprintf(answer,"Failed\n"); - retval=FAIL; - } - } else { - sprintf(answer,"Could not receive the command\n"); - } - - /* send answer */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error writing to socket"); - retval=FAIL; - } - - - /*return ok/fail*/ - return retval; - -} - - - -int get_detector_type(int file_des) { - int n=0; - enum detectorType ret; - int retval=OK; - - sprintf(mess,"Can't return detector type\n"); - - - /* receive arguments */ - /* execute action */ - ret=myDetectorType; - -#ifdef VERBOSE - printf("Returning detector type %d\n",ret); -#endif - - /* send answer */ - /* send OK/failed */ - if (differentClients==1) - retval=FORCE_UPDATE; - - n += sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - - -} - - -int set_number_of_modules(int file_des) { - int n; - int arg[2], ret=0; - int retval=OK; - int dim, nm; - - sprintf(mess,"Can't set number of modules\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket %d", n); - retval=GOODBYE; - } - if (retval==OK) { - dim=arg[0]; - nm=arg[1]; - - /* execute action */ -#ifdef VERBOSE - printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); -#endif - - //if (nm!=GET_FLAG) { - if (dim!=X && nm!=GET_FLAG) { - retval=FAIL; - sprintf(mess,"Can't change module number in dimension %d\n",dim); - } else { - if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { - sprintf(mess,"Detector locked by %s\n", lastClientIP); - retval=FAIL; - } else { - ret=setNMod(nm); - if (nModX==nm || nm==GET_FLAG) { - retval=OK; - if (differentClients==1) - retval=FORCE_UPDATE; - } else - retval=FAIL; - } - } - } - /*} else { - if (dim==Y) { - ret=nModY; - } else if (dim==X) { - ret=setNMod(-1); - } - } - */ - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - -} - - -int get_max_number_of_modules(int file_des) { - int n; - int ret; - int retval=OK; - enum dimension arg; - - sprintf(mess,"Can't get max number of modules\n"); - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* execute action */ -#ifdef VERBOSE - printf("Getting the max number of modules in dimension %d \n",arg); -#endif - - - switch (arg) { - case X: - ret=getNModBoard(); - break; - case Y: - ret=NMAXMODY; - break; - default: - ret=FAIL; - retval=FAIL; - break; - } -#ifdef VERBOSE - printf("Max number of module in dimension %d is %d\n",arg,ret ); -#endif - - - - if (differentClients==1 && retval==OK) { - retval=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - /*return ok/fail*/ - return retval; -} - - -//index 0 is in gate -//index 1 is in trigger -//index 2 is out gate -//index 3 is out trigger - -int set_external_signal_flag(int file_des) { - int n; - int arg[2]; - int ret=OK; - int signalindex; - enum externalSignalFlag flag, retval; - - sprintf(mess,"Can't set external signal flag\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - retval=SIGNAL_OFF; - if (ret==OK) { - signalindex=arg[0]; - flag=arg[1]; - /* execute action */ - switch (flag) { - case GET_EXTERNAL_SIGNAL_FLAG: - retval=getExtSignal(signalindex); - break; - - default: - if (lockStatus && differentClients) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n", lastClientIP); - } else if (signalindex > 0) { - ret=FAIL; - sprintf(mess,"Signal index %d is reserved. Only index 0 can be configured.\n", signalindex); - } else { - retval=setExtSignal(flag); - } - } -#ifdef VERBOSE - printf("Setting external signal %d to flag %d\n",signalindex,flag ); - printf("Set to flag %d\n",retval); -#endif - - } - - if (ret==OK && differentClients!=0) - ret=FORCE_UPDATE; - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - -int set_external_communication_mode(int file_des) { - int n; - enum externalCommunicationMode arg, ret=GET_EXTERNAL_COMMUNICATION_MODE; - int retval=OK; - - sprintf(mess,"Can't set external communication mode\n"); - - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* - enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE - }; - */ - if (retval==OK) { - /* execute action */ - - ret=setTiming(arg); - - /* switch(arg) { */ - /* default: */ - /* sprintf(mess,"The meaning of single signals should be set\n"); */ - /* retval=FAIL; */ - /* } */ - - -#ifdef VERBOSE - printf("Setting external communication mode to %d\n", arg); -#endif - } else - ret=FAIL; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return retval; -} - - - -int get_id(int file_des) { - // sends back 64 bits! - int64_t retval=-1; - int ret=OK; - int n=0; - enum idMode arg; - - sprintf(mess,"Can't return id\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Getting id %d\n", arg); -#endif - - switch (arg) { - case DETECTOR_SERIAL_NUMBER: - retval=getDetectorNumber(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval = (getFirmwareVersion() & 0xFFFFFF); - break; - case DETECTOR_SOFTWARE_VERSION: - retval = (GITDATE & 0xFFFFFF); - break; - case CLIENT_SOFTWARE_API_VERSION: - return APIGOTTHARD; - default: - printf("Required unknown id %d \n", arg); - ret=FAIL; - retval=FAIL; - break; - } - -#ifdef VERBOSE - printf("Id is %llx\n", retval); -#endif - - if (differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int digital_test(int file_des) { - - int retval; - int ret=OK; - int imod=-1; - int n=0; - int ibit=0; - int ow; - int ival; - enum digitalTestMode arg; - - sprintf(mess,"Can't send digital test\n"); - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Digital test mode %d\n",arg ); -#endif - - switch (arg) { - case CHIP_TEST: - n = receiveDataOnly(file_des,&imod,sizeof(imod)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } -#ifdef VERBOSE - printf("of module %d\n", imod); -#endif - retval=0; -#ifdef MCB_FUNCS - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - break; - } - if (imod >= nModX) { - ret=FAIL; - sprintf(mess,"Module %d disabled\n",imod); - break; - } - if (testShiftIn(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftOut(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftStSel(imod)) retval|=(1<<(ibit)); - ibit++; - //if ( testDataInOut(0x123456, imod)) retval|=(1<<(ibit++)); - //if ( testExtPulse(imod)) retval|=(1<<(ibit++)); - // for (ow=0; ow<6; ow++) - // ow=1; - //#ifndef PICASSOD - for (ow=0; ow<5; ow++) { - //#endif - if (testDataInOutMux(imod, ow, 0x789abc)) retval|=(1<=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - -#ifdef MCB_FUNCS - switch (ind) { - case G_VREF_DS : - idac=VREF_DS; - break; - case G_VCASCN_PB: - idac=VCASCN_PB; - break; - case G_VCASCP_PB: - idac=VCASCP_PB; - break; - case G_VOUT_CM: - idac=VOUT_CM; - break; - case G_VCASC_OUT: - idac=VCASC_OUT; - break; - case G_VIN_CM: - idac=VIN_CM; - break; - case G_VREF_COMP: - idac=VREF_COMP; - break; - case G_IB_TESTC: - idac=IB_TESTC; - break; - case HV_POT: - idac=HIGH_VOLTAGE; - break; - - default: - printf("Unknown DAC index %d\n",ind); - sprintf(mess,"Unknown DAC index %d\n",ind); - ret=FAIL; - break; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - if(idac==HIGH_VOLTAGE){ - retval[0]=initHighVoltageByModule(val,imod); - ret=FAIL; - if(retval[0]==-2) - strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200"); - else if(retval[0]==-3) - strcpy(mess,"Weird value read back or it has not been set yet\n"); - else - ret=OK; - }else{ - initDACbyIndexDACU(idac,val,imod,mV,retval); - ret=FAIL; - if(mV) - temp = retval[1]; - else - temp = retval[0]; - if ((abs(temp-val)<=3) || val==-1) { - ret=OK; -#ifdef VERBOSE - printf("DAC set to %d in dac units and %d mV\n", retval[0],retval[1]); -#endif - } - } - } - } - -#endif - - - if(ret==FAIL) - printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, temp); - else{ - if (differentClients) - ret=FORCE_UPDATE; - } - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - -int get_adc(int file_des) { - //default: mod 0 - int retval; - int ret=OK; - int arg[2]; - enum dacIndex ind; - int imod; - int n; - int idac=0; - - sprintf(mess,"Can't read ADC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ind=arg[0]; - imod=0;//arg[1]; - -#ifdef VERBOSE - printf("Getting ADC %d of module %d\n", ind, imod); -#endif - - if (imod>=getNModBoard() || imod<0) - ret=FAIL; - -#ifdef MCB_FUNCS - switch (ind) { - case TEMPERATURE_FPGA: - idac=TEMP_FPGA; - break; - case TEMPERATURE_ADC: - idac=TEMP_ADC; - break; - default: - printf("Unknown DAC index %d\n",ind); - sprintf(mess,"Unknown DAC index %d\n",ind); - ret=FAIL; - break; - } - - if (ret==OK) - retval=getTemperatureByModule(idac,imod); -#endif - -#ifdef VERBOSE - printf("ADC is %d V\n", retval); -#endif - if (ret==FAIL) { - printf("Getting adc %d of module %d failed\n", ind, imod); - } - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int set_channel(int file_des) { - int ret=OK; - sls_detector_channel myChan; - int retval; - int n; - - - sprintf(mess,"Can't set channel\n"); - -#ifdef VERBOSE - printf("Setting channel\n"); -#endif - ret=receiveChannel(file_des, &myChan); - if (ret>=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); -#endif - - if (ret==OK) { - if (myChan.module>=getNModBoard()) - ret=FAIL; - if (myChan.chip>=NCHIP) - ret=FAIL; - if (myChan.chan>=NCHAN) - ret=FAIL; - if (myChan.module<0) - myChan.module=ALLMOD; - } - - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChannelbyNumber(myChan); -#endif - } - } - /* Maybe this is done inside the initialization funcs */ - //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - - - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - - -int get_channel(int file_des) { - - int ret=OK; - sls_detector_channel retval; - - int arg[3]; - int ichan, ichip, imod; - int n; - - sprintf(mess,"Can't get channel\n"); - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichan=arg[0]; - ichip=arg[1]; - imod=arg[2]; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && ichan=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); -#endif - - if (ret==OK) { - if (myChip.module>=getNModBoard()) - ret=FAIL; - if (myChip.module<0) - myChip.module=ALLMOD; - if (myChip.chip>=NCHIP) - ret=FAIL; - } - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChipbyNumber(myChip); -#endif - } - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - return ret; -} - -int get_chip(int file_des) { - - - int ret=OK; - sls_detector_chip retval; - int arg[2]; - int ichip, imod; - int n; - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichip=arg[0]; - imod=arg[1]; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0) - ret=OK; - else - ret=FAIL; - - -#ifdef VERBOSE - printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); -#endif - - if (ret==OK) { - if (myModule.module>=getNModBoard()) { - ret=FAIL; - printf("Module number is too large %d\n",myModule.module); - } - if (myModule.module<0) - myModule.module=ALLMOD; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initModulebyNumber(myModule); -#endif - } - } - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - free(myChip); - free(myChan); - free(myDac); - free(myAdc); - - // setDynamicRange(dr); always 16 commented out - - - return ret; -} - - - - -int get_module(int file_des) { - - - int ret=OK; - - - int arg; - int imod; - int n; - - - - sls_detector_module myModule; - int *myChip=malloc(NCHIP*sizeof(int)); - int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); - int *myDac=malloc(NDAC*sizeof(int));/**dhanya*/ - int *myAdc=malloc(NADC*sizeof(int));/**dhanya*/ - - - if (myDac) - myModule.dacs=myDac; - else { - sprintf(mess,"could not allocate dacs\n"); - ret=FAIL; - } - if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; - } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } - - myModule.ndac=NDAC; - myModule.nchip=NCHIP; - myModule.nchan=NCHAN*NCHIP; - myModule.nadc=NADC; - - - - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - imod=arg; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod= 0) { - ret=FAIL; - sprintf(mess, "Changing settings of module %d: wrote %d but read %d\n", imod, isett, retval); - printf("Warning: %s",mess); - } - - else { - ret = setDefaultDacs(); - if (ret == FAIL) { - strcpy(mess,"Could change settings, but could not set to default dacs\n"); - cprintf(RED, "Warning: %s", mess); - } - } - } -#endif - } - if (ret==OK && differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - - - return ret; - - -} - -int start_acquisition(int file_des) { - - int ret=OK; - int n; - - - sprintf(mess,"can't start acquisition\n"); - -#ifdef VERBOSE - printf("Starting acquisition\n"); -#endif - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ret=startStateMachine(); - } - if (ret==FAIL) - sprintf(mess,"Start acquisition failed\n"); - else if (differentClients) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; - -} - -int stop_acquisition(int file_des) { - - int ret=OK; - int n; - - sprintf(mess,"can't stop acquisition\n"); - - cprintf(BG_RED,"Client command received to stop acquisition\n"); - - - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ret=stopStateMachine(); - } - - if (ret==FAIL) - sprintf(mess,"Stop acquisition failed\n"); - else if (differentClients) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; - - -} - -int start_readout(int file_des) { - - - int ret=OK; - int n; - - - sprintf(mess,"can't start readout\n"); - -#ifdef VERBOSE - printf("Starting readout\n"); -#endif - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ret=startReadOut(); - } - if (ret==FAIL) - sprintf(mess,"Start readout failed\n"); - else if (differentClients) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; - - - -} - -int get_run_status(int file_des) { - - int ret=OK; - int n; - - int retval; - enum runStatus s; - sprintf(mess,"getting run status\n"); - -#ifdef VERBOSE - printf("Getting status\n"); -#endif - - retval= runState(); - printf("STATUS=%08x\n",retval); - - - //stopped (external stop, also maybe fifo full) - if (runState() & STOPPED_BIT){ - printf("-----------------------------------STOPPED--------------------------------------x%0x\n",retval); - s=STOPPED; - - retval= runState(); - printf("reading again STATUS=%08x\n",retval); - if (runState() & STOPPED_BIT){ - printf("-----------------------------------ERROR--------------------------------------x%0x\n",retval); - s=ERROR; - } - } - - - - //error - else if(retval&SOME_FIFO_FULL_BIT){ - printf("-----------------------------------ERROR--------------------------------------x%0x\n",retval); - s=ERROR; - } - - - //runbusy=0 - // else if(!(retval&RUNMACHINE_BUSY_BIT)){ //commented by Anna 24.10.2012 - else if(!(retval&RUN_BUSY_BIT)){ // by Anna 24.10.2012 - - - - //and readbusy=1, its last frame read - if((retval&READMACHINE_BUSY_BIT) ){ // - - - printf("-----------------------------------READ MACHINE BUSY--------------------------\n"); - s=TRANSMITTING; - } else if (retval&ALL_FIFO_EMPTY_BIT) { - printf("-----------------------------------DATA IN FIFO--------------------------\n"); - s=TRANSMITTING; - - } - //and readbusy=0,idle - else if(!(retval&0xffff)){ - //if(!(retval&0x00000001)){ - printf("-----------------------------------IDLE--------------------------------------\n"); - s=IDLE; - } else { - printf("-----------------------------------Unknown status %08x--------------------------------------\n", retval); - s=ERROR; - ret=FAIL; - } - } - //if runbusy=1 - else { - if (retval&WAITING_FOR_TRIGGER_BIT){ - printf("-----------------------------------WAITING-----------------------------------\n"); - s=WAITING; - } - else{ - printf("-----------------------------------RUNNING-----------------------------------\n"); - s=RUNNING; - } - } - - - - - if (ret!=OK) { - printf("get status failed %04x\n",retval); - sprintf(mess, "get status failed %08x\n", retval); - - } else if (differentClients) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n += sendDataOnly(file_des,&s,sizeof(s)); - } - return ret; - - - -} - -int read_frame(int file_des) { - dataret = FAIL; - strcpy(mess,"wait for read frame failed\n"); - - if (differentClients==1 && lockStatus==1) { - dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - cprintf(RED,"%s\n",mess); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - } - - -#ifdef VIRTUAL - dataret = FINISHED; - strcpy(mess,"acquisition successfully finished\n"); -#else - waitForAcquisitionFinish(); - - // set return value and message - if(getFrames()>-2) { - dataret = FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - cprintf(RED,"%s\n",mess); - } else { - dataret = FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - cprintf(GREEN,"%s",mess); - - } -#endif - - if (differentClients) - dataret=FORCE_UPDATE; - - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; -} - - - - - - - - -int read_all(int file_des) { - -while(read_frame(file_des)==OK) { - -#ifdef VERBOSE - printf("frame read\n"); -#endif - ; - } -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - return OK; - - -} - -int start_and_read_all(int file_des) { - //int dataret=OK; -#ifdef VERBOSE - printf("Starting and reading all frames\n"); -#endif - - if (differentClients==1 && lockStatus==1) { - dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - - } - - startStateMachine(); - - /* ret=startStateMachine(); - if (ret!=OK) { - sprintf(mess,"could not start state machine\n"); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - #ifdef VERBOSE - printf("could not start state machine\n"); -#endif -} else {*/ - read_all(file_des); -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - //} - - - return OK; - - -} - -int set_timer(int file_des) { - enum timerIndex ind; - int64_t tns; - int n; - int64_t retval; - int ret=OK; - - - sprintf(mess,"can't set timer\n"); - - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&tns,sizeof(tns)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret!=OK) { - printf(mess); - } - -#ifdef VERBOSE - printf("setting timer %d to %lld ns\n",ind,tns); -#endif - if (ret==OK) { - - if (differentClients==1 && lockStatus==1 && tns!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; - case PROBES_NUMBER: -#ifdef PROPIXD - sprintf(mess,"can't set/get number of probes for propix\n"); -#else - sprintf(mess,"can't set/get number of probes for gotthard\n"); -#endif - - ret=FAIL; - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - } - if (ret!=OK) { - printf(mess); - if (differentClients) - ret=FORCE_UPDATE; - } - - if (ret!=OK) { - printf(mess); - printf("set timer failed\n"); - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { -#ifdef VERBOSE - printf("returning ok %d\n",(int)(sizeof(retval))); -#endif - - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - - return ret; - -} - - - - - - - - -int get_time_left(int file_des) { - - enum timerIndex ind; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't get timer\n"); - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - - printf("getting time left on timer %d \n",ind); -#endif - - if (ret==OK) { - switch(ind) { - case FRAME_NUMBER: - retval=getFrames(); - break; - case ACQUISITION_TIME: - retval=getExposureTime(); - break; - case FRAME_PERIOD: - retval=getPeriod(); - break; - case DELAY_AFTER_TRIGGER: - retval=getDelay(); - break; - case GATES_NUMBER: - retval=getGates(); - break; - case PROBES_NUMBER: - retval=getProbes(); - break; - case CYCLES_NUMBER: - retval=getTrains(); - break; - case PROGRESS: - retval=getProgress(); - break; - case ACTUAL_TIME: - retval=getActualTime(); - break; - case MEASUREMENT_TIME: - retval=getMeasurementTime(); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - - - if (ret!=OK) { - printf("get time left failed\n"); - } else if (differentClients) - ret=FORCE_UPDATE; - -#ifdef VERBOSE - - printf("time left on timer %d is %lld\n",ind, retval); -#endif - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } -#ifdef VERBOSE - - printf("data sent\n"); -#endif - - return ret; - - -} - -int set_dynamic_range(int file_des) { - - - - int dr; - int n; - int retval; - int ret=OK; - - - sprintf(mess,"can't set dynamic range\n"); - - - n = receiveDataOnly(file_des,&dr,sizeof(dr)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (differentClients==1 && lockStatus==1 && dr>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setDynamicRange(dr); - } - - //if (dr>=0 && retval!=dr) ret=FAIL; - if (ret!=OK) { - sprintf(mess,"set dynamic range failed\n"); - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - -int set_roi(int file_des) { - - int i; - int ret=OK; - int nroi=-1; - int n=0; - int retvalsize=0; - ROI arg[MAX_ROIS]; - ROI* retval=0; - - strcpy(mess,"Could not set/get roi\n"); - - - n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef PROPIXD - sprintf(mess,"can't set roi for propix\n"); - ret = FAIL; -#endif - if(ret != FAIL){ - if(nroi!=-1){ - n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); - if (n != (nroi*sizeof(ROI))) { - sprintf(mess,"Received wrong number of bytes for ROI\n"); - ret=FAIL; - } - //#ifdef VERBOSE - printf("\n\nSetting ROI: nroi=%d\n",nroi); - for( i=0;i=0) { - if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) - lockStatus=lock; - else { - ret=FAIL; - sprintf(mess,"Server already locked by %s\n", lastClientIP); - } - } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); - - return ret; - -} - -int set_port(int file_des) { - int n; - int ret=OK; - int sd=-1; - - enum portType p_type; /** data? control? stop? Unused! */ - int p_number; /** new port number */ - - n = receiveDataOnly(file_des,&p_type,sizeof(p_type)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (ptype)\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&p_number,sizeof(p_number)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (pnum)\n"); - ret=FAIL; - } - if (differentClients==1 && lockStatus==1 ) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - if (p_number<1024) { - sprintf(mess,"Too low port number %d\n", p_number); - printf("\n"); - ret=FAIL; - } - - printf("set port %d to %d\n",p_type, p_number); - - sd=bindSocket(p_number); - } - if (sd>=0) { - ret=OK; - if (differentClients ) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Could not bind port %d\n", p_number); - printf("Could not bind port %d\n", p_number); - if (sd==-10) { - sprintf(mess,"Port %d already set\n", p_number); - printf("Port %d already set\n", p_number); - - } - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&p_number,sizeof(p_number)); - closeConnection(file_des); - exitServer(sockfd); - sockfd=sd; - - } - - return ret; - -} - -int get_last_client_ip(int file_des) { - int ret=OK; - int n; - if (differentClients ) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - - return ret; - -} - - -int send_update(int file_des) { - - int ret=OK; - enum detectorSettings t; - int n;//int thr, n; - //int it; - int64_t retval, tns=-1; - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - n = sendDataOnly(file_des,&nModX,sizeof(nModX)); - n = sendDataOnly(file_des,&nModY,sizeof(nModY)); - n = sendDataOnly(file_des,&dynamicRange,sizeof(dynamicRange)); - n = sendDataOnly(file_des,&dataBytes,sizeof(dataBytes)); - t=setSettings(GET_SETTINGS,-1); - n = sendDataOnly(file_des,&t,sizeof(t)); -/* thr=getThresholdEnergy(); - n = sendDataOnly(file_des,&thr,sizeof(thr));*/ - retval=setFrames(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setExposureTime(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setPeriod(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setDelay(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setGates(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); -/* retval=setProbes(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t));*/ - retval=setTrains(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - - if (lockStatus==0) { - strcpy(lastClientIP,thisClientIP); - } - - return ret; - - -} -int update_client(int file_des) { - - int ret=OK; - - sendDataOnly(file_des,&ret,sizeof(ret)); - return send_update(file_des); - - - -} - - -int configure_mac(int file_des) { - - int ret=OK; - char arg[6][50]; - int n; - - int imod=0;//should be in future sent from client as -1, arg[2] - int ipad; - long long int imacadd; - long long int idetectormacadd; - int udpport; - int detipad; - int retval=-100; - - sprintf(mess,"Can't configure MAC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - sscanf(arg[0], "%x", &ipad); - sscanf(arg[1], "%llx", &imacadd); - sscanf(arg[2], "%x", &udpport); - sscanf(arg[3], "%llx", &idetectormacadd); - sscanf(arg[4], "%x", &detipad); - //arg[5] is udpport2 for eiger -//#ifdef VERBOSE - int i; - printf("\ndigital_test_bit in server %d\t",digitalTestBit); - printf("\nipadd %x\t",ipad); - printf("destination ip is %d.%d.%d.%d = 0x%x \n",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff,ipad); - printf("macad:%llx\n",imacadd); - for (i=0;i<6;i++) - printf("mac adress %d is 0x%x \n",6-i,(unsigned int)(((imacadd>>(8*i))&0xFF))); - printf("udp port:0x%x\n",udpport); - printf("detector macad:%llx\n",idetectormacadd); - for (i=0;i<6;i++) - printf("detector mac adress %d is 0x%x \n",6-i,(unsigned int)(((idetectormacadd>>(8*i))&0xFF))); - printf("detipad %x\n",detipad); - printf("destination ip is %d.%d.%d.%d = 0x%x \n",(detipad>>24)&0xff,(detipad>>16)&0xff,(detipad>>8)&0xff,(detipad)&0xff,detipad); - printf("\n"); -//#endif - - - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - - //#ifdef VERBOSE - printf("Configuring MAC of module %d at port %x\n", imod, udpport); - //#endif -#ifdef MCB_FUNCS - if (ret==OK){ - if(runBusy()){ - ret=stopStateMachine(); - if(ret==FAIL) - strcpy(mess,"could not stop detector acquisition to configure mac"); - } - - if(ret==OK) - configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,udpport); - retval=getAdcConfigured(); - } -#endif - if (ret==FAIL) - printf("configuring MAC of mod %d failed\n", imod); - else - printf("Configuremac successful of mod %d and adc %d\n",imod,retval); - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - /*return ok/fail*/ - return ret; - -} - - - -int load_image(int file_des) { - int retval; - int ret=OK; - int n; - enum imageType index; - short int ImageVals[NCHAN*NCHIP]; - - sprintf(mess,"Loading image failed\n"); - - n = receiveDataOnly(file_des,&index,sizeof(index)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,ImageVals,dataBytes); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef PROPIXD - sprintf(mess,"can't load image for propix\n"); - ret = FAIL; -#endif - - switch (index) { - case DARK_IMAGE : -#ifdef VERBOSE - printf("Loading Dark image\n"); -#endif - break; - case GAIN_IMAGE : -#ifdef VERBOSE - printf("Loading Gain image\n"); -#endif - break; - default: - printf("Unknown index %d\n",index); - sprintf(mess,"Unknown index %d\n",index); - ret=FAIL; - break; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - retval=loadImage(index,ImageVals); - if (retval==-1) - ret = FAIL; - } - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - -int set_master(int file_des) { - - enum masterFlags retval=GET_MASTER; - enum masterFlags arg; - int n; - int ret=OK; - // int regret=OK; - - - sprintf(mess,"can't set master flags\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setMaster(arg); - - } - if (retval==GET_MASTER) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int set_synchronization(int file_des) { - - enum synchronizationMode retval=GET_MASTER; - enum synchronizationMode arg; - int n; - int ret=OK; - //int regret=OK; - - - sprintf(mess,"can't set synchronization mode\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - retval=setSynchronization(arg); - } - if (retval==GET_SYNCHRONIZATION_MODE) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int read_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - //char *retval=NULL; - short int CounterVals[NCHAN*NCHIP]; - - sprintf(mess,"Read counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef PROPIXD - sprintf(mess,"can't read counter block for propix\n"); - ret = FAIL; -#endif - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - ret=readCounterBlock(startACQ,CounterVals); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,CounterVals[i]); -#endif - } - } - - if(ret!=FAIL){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,CounterVals,dataBytes);//1280*2 - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - - - -int reset_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - - sprintf(mess,"Reset counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=resetCounterBlock(startACQ); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - - /*return ok/fail*/ - return ret; -} - - - - - - -int start_receiver(int file_des) { - int ret=OK; - int n=0; - strcpy(mess,"Could not start receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret = startReceiver(1); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - - -int stop_receiver(int file_des) { - int ret=OK; - int n=0; - - strcpy(mess,"Could not stop receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret=startReceiver(0); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - -int calibrate_pedestal(int file_des){ - - int ret=OK; - int retval=-1; - int n; - int frames; - - sprintf(mess,"Could not calibrate pedestal\n"); - - n = receiveDataOnly(file_des,&frames,sizeof(frames)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=calibratePedestal(frames); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - /*return ok/fail*/ - return ret; -} - - - - -int write_adc_register(int file_des) { - int ret=OK; - int n=0; - int retval=-1; - sprintf(mess,"write to adc register failed\n"); - - // receive arguments - int arg[2]={-1,-1}; - n = receiveData(file_des,arg,sizeof(arg),INT32); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - int addr=arg[0]; - int val=arg[1]; - - // execute action - if (ret == OK) { - if (differentClients && lockStatus) { - ret = FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - cprintf(RED, "Warning: %s", mess); - } - else { -#ifdef VERBOSE - printf("writing to register 0x%x data 0x%x\n", addr, val); -#endif - setAdc(addr,val); -#ifdef VERBOSE - printf("Data set to 0x%x\n", retval); -#endif - if (ret==OK && differentClients) - ret=FORCE_UPDATE; - } - } - // send ok / fail - n = sendDataOnly(file_des,&ret,sizeof(ret)); - // send return argument - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&retval,sizeof(retval)); - - // return ok / fail - return ret; -} - - - - -int check_version(int file_des) { - int ret=OK,ret1=OK; - int n=0; - sprintf(mess,"check version failed\n"); - - - - // receive arguments - int64_t arg=-1; - n = receiveData(file_des,&arg,sizeof(arg),INT64); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - // execute action - if (ret == OK) { -#ifdef VERBOSE - printf("Checking versioning compatibility with value %d\n",arg); -#endif - int64_t client_requiredVersion = arg; - int64_t det_apiVersion = APIGOTTHARD; - int64_t det_version = (GITDATE & 0xFFFFFF); - - // old client - if (det_apiVersion > client_requiredVersion) { - ret = FAIL; - sprintf(mess,"Client's detector SW API version: (0x%llx). " - "Detector's SW API Version: (0x%llx). " - "Incompatible, update client!\n", - client_requiredVersion, det_apiVersion); - cprintf(RED, "Warning: %s", mess); - } - - // old software - else if (client_requiredVersion > det_version) { - ret = FAIL; - sprintf(mess,"Detector SW Version: (0x%llx). " - "Client's detector SW API Version: (0x%llx). " - "Incompatible, update detector software!\n", - det_version, client_requiredVersion); - cprintf(RED, "Warning: %s", mess); - } - } - - - - // ret could be swapped during sendData - ret1 = ret; - // send ok / fail - n = sendData(file_des,&ret1,sizeof(ret),INT32); - // send return argument - if (ret==FAIL) { - n += sendData(file_des,mess,sizeof(mess),OTHER); - } - - // return ok / fail - return ret; -} - - diff --git a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.h b/slsDetectorSoftware/gotthardDetectorServer/server_funcs.h deleted file mode 100755 index 832ab3602..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/server_funcs.h +++ /dev/null @@ -1,99 +0,0 @@ -#ifndef SERVER_FUNCS_H -#define SERVER_FUNCS_H - - -#include "sls_detector_defs.h" - - -#include -/* -#include -#include -#include -*/ -#include "communication_funcs.h" - - - - -#define GOODBYE -200 - -int sockfd; - -int function_table(); - -int decode_function(int); -int init_detector(int); - -int M_nofunc(int); -int exit_server(int); - - - - -// General purpose functions -int get_detector_type(int); -int set_number_of_modules(int); -int get_max_number_of_modules(int); - - -int exec_command(int); -int set_external_signal_flag(int); -int set_external_communication_mode(int); -int get_id(int); -int digital_test(int); -int write_register(int); -int read_register(int); -int set_dac(int); -int get_adc(int); -int set_channel(int); -int set_chip(int); -int set_module(int); -int get_channel(int); -int get_chip(int); -int get_module(int); - -int get_threshold_energy(int); -int set_threshold_energy(int); -int set_settings(int); -int start_acquisition(int); -int stop_acquisition(int); -int start_readout(int); -int get_run_status(int); -int read_frame(int); -int read_all(int); -int start_and_read_all(int); -int set_timer(int); -int get_time_left(int); -int set_dynamic_range(int); -int set_roi(int); -int get_roi(int); -int set_speed(int); -void configureADC(); -int set_readout_flags(int); -int execute_trimming(int); -int lock_server(int); -int set_port(int); -int get_last_client_ip(int); -int set_master(int); -int set_synchronization(int); - -int update_client(int); -int send_update(int); -int configure_mac(int); - -int load_image(int); -int read_counter_block(int); -int reset_counter_block(int); - -int start_receiver(int); -int stop_receiver(int); - - -int calibrate_pedestal(int); - -int set_roi(int); - -int write_adc_register(int); -int check_version(int); -#endif diff --git a/slsDetectorSoftware/gotthardDetectorServer/sls_detector_defs.h b/slsDetectorSoftware/gotthardDetectorServer/sls_detector_defs.h deleted file mode 120000 index c5062e03f..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/sls_detector_defs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/sls_detector_funcs.h b/slsDetectorSoftware/gotthardDetectorServer/sls_detector_funcs.h deleted file mode 120000 index 844b67129..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/sls_detector_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/sls_receiver_defs.h b/slsDetectorSoftware/gotthardDetectorServer/sls_receiver_defs.h deleted file mode 120000 index 1de31caf5..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/sls_receiver_defs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/sls_receiver_funcs.h b/slsDetectorSoftware/gotthardDetectorServer/sls_receiver_funcs.h deleted file mode 120000 index c2ea4ded9..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/sls_receiver_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/stop_server.c b/slsDetectorSoftware/gotthardDetectorServer/stop_server.c deleted file mode 100755 index e3c8ff7e1..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/stop_server.c +++ /dev/null @@ -1,46 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ - - -#include "sls_detector_defs.h" - - -#include "communication_funcs.h" -#include "firmware_funcs.h" - - -int sockfd; - -int main(int argc, char *argv[]) -{ - int portno; - int retval=0; - - portno = DEFAULT_PORTNO; - - - bindSocket(portno); - if (getServerError()) - return -1; - - - - /* waits for connection */ - while(retval!=GOODBYE) { -#ifdef VERBOSE - printf("\n"); -#endif -#ifdef VERY_VERBOSE - printf("Stop server: waiting for client call\n"); -#endif - acceptConnection(); - retval=stopStateMachine(); - closeConnection(); - } - - exitServer(); - printf("Goodbye!\n"); - - return 0; -} - diff --git a/slsDetectorSoftware/gotthardDetectorServer/updateAPIVersion.sh b/slsDetectorSoftware/gotthardDetectorServer/updateAPIVersion.sh deleted file mode 100755 index 2d5d8d04d..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/updateAPIVersion.sh +++ /dev/null @@ -1,7 +0,0 @@ -SRCFILE=gitInfoGotthard.h -DSTFILE=versionAPI.h - -SRCPATTERN=GITDATE -DSTPATTERN=APIGOTTHARD - -awk -v a="$SRCFILE" -v b="$DSTFILE" -v c="$SRCPATTERN" -v d="$DSTPATTERN" 'FNR==NR&&$2==c{x=$3} NR!=FNR{if($2==d){$3="0x"substr(x,5)}print > b}' $SRCFILE $DSTFILE \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/updateGitVersion.sh b/slsDetectorSoftware/gotthardDetectorServer/updateGitVersion.sh deleted file mode 100755 index 19d9acbcb..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/updateGitVersion.sh +++ /dev/null @@ -1,30 +0,0 @@ -SERVER=gotthardDetectorServer -MAINDIR=slsDetectorsPackage -SPECDIR=slsDetectorSoftware/$SERVER -TMPFILE=gitInfoGotthardTmp.h -INCLFILE=gitInfoGotthard.h - -#evaluate the variables -EVALFILE=../../evalVersionVariables.sh -source $EVALFILE - - -#get modified date -#RDATE1='git log --pretty=format:"%ci" -1' -RDATE1="find . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|.git|updateGitVersion|.o' | head -n 1" -RDATE=`eval $RDATE1` -NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') -NEWDATE=${NEWDATE/#/0x} - - -#get old date from INCLFILE -OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') - - -#update INCLFILE if changes -if [ "$OLDDATE" != "$NEWDATE" ]; then - echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt - cd ../../ - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -fi \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/versionAPI.h b/slsDetectorSoftware/gotthardDetectorServer/versionAPI.h deleted file mode 120000 index d3bf8d6cf..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/versionAPI.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/versionAPI.h \ No newline at end of file diff --git a/slsDetectorSoftware/include/detectorData.h b/slsDetectorSoftware/include/detectorData.h deleted file mode 120000 index 44205ed04..000000000 --- a/slsDetectorSoftware/include/detectorData.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorAnalysis/detectorData.h \ No newline at end of file diff --git a/slsDetectorSoftware/include/slsDetectorUsers.h b/slsDetectorSoftware/include/slsDetectorUsers.h deleted file mode 120000 index 51e196881..000000000 --- a/slsDetectorSoftware/include/slsDetectorUsers.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetector/slsDetectorUsers.h \ No newline at end of file diff --git a/slsDetectorSoftware/include/slsReceiverUsers.h b/slsDetectorSoftware/include/slsReceiverUsers.h deleted file mode 120000 index c8727f200..000000000 --- a/slsDetectorSoftware/include/slsReceiverUsers.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/slsReceiverUsers.h \ No newline at end of file diff --git a/slsDetectorSoftware/jctbDetectorServer/AD9257.h b/slsDetectorSoftware/jctbDetectorServer/AD9257.h deleted file mode 100755 index a716af64c..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/AD9257.h +++ /dev/null @@ -1,141 +0,0 @@ -#ifndef AD9257_H -#define AD9257_H - -#include "ansi.h" - -#include "commonServerFunctions.h" -#include - -/* AD9257 ADC DEFINES */ -#define AD9257_ADC_NUMBITS (24) - -#define AD9257_DEV_IND_2_REG (0x04) -#define AD9257_CHAN_H_OFST (0) -#define AD9257_CHAN_H_MSK (0x00000001 << AD9257_CHAN_H_OFST) -#define AD9257_CHAN_G_OFST (1) -#define AD9257_CHAN_G_MSK (0x00000001 << AD9257_CHAN_G_OFST) -#define AD9257_CHAN_F_OFST (2) -#define AD9257_CHAN_F_MSK (0x00000001 << AD9257_CHAN_F_OFST) -#define AD9257_CHAN_E_OFST (3) -#define AD9257_CHAN_E_MSK (0x00000001 << AD9257_CHAN_E_OFST) - -#define AD9257_DEV_IND_1_REG (0x05) -#define AD9257_CHAN_D_OFST (0) -#define AD9257_CHAN_D_MSK (0x00000001 << AD9257_CHAN_D_OFST) -#define AD9257_CHAN_C_OFST (1) -#define AD9257_CHAN_C_MSK (0x00000001 << AD9257_CHAN_C_OFST) -#define AD9257_CHAN_B_OFST (2) -#define AD9257_CHAN_B_MSK (0x00000001 << AD9257_CHAN_B_OFST) -#define AD9257_CHAN_A_OFST (3) -#define AD9257_CHAN_A_MSK (0x00000001 << AD9257_CHAN_A_OFST) -#define AD9257_CLK_CH_DCO_OFST (4) -#define AD9257_CLK_CH_DCO_MSK (0x00000001 << AD9257_CLK_CH_DCO_OFST) -#define AD9257_CLK_CH_IFCO_OFST (5) -#define AD9257_CLK_CH_IFCO_MSK (0x00000001 << AD9257_CLK_CH_IFCO_OFST) - -#define AD9257_POWER_MODE_REG (0x08) -#define AD9257_POWER_INTERNAL_OFST (0) -#define AD9257_POWER_INTERNAL_MSK (0x00000003 << AD9257_POWER_INTERNAL_OFST) -#define AD9257_INT_RESET_VAL (0x3) -#define AD9257_INT_CHIP_RUN_VAL (0x0) -#define AD9257_POWER_EXTERNAL_OFST (5) -#define AD9257_POWER_EXTERNAL_MSK (0x00000001 << AD9257_POWER_EXTERNAL_OFST) -#define AD9257_EXT_FULL_POWER_VAL (0x0) -#define AD9257_EXT_STANDBY_VAL (0x1) - -#define AD9257_OUT_MODE_REG (0x14) -#define AD9257_OUT_FORMAT_OFST (0) -#define AD9257_OUT_FORMAT_MSK (0x00000001 << AD9257_OUT_FORMAT_OFST) -#define AD9257_OUT_BINARY_OFST_VAL (0) -#define AD9257_OUT_TWOS_COMPL_VAL (1) -#define AD9257_OUT_LVDS_OPT_OFST (6) -#define AD9257_OUT_LVDS_OPT_MSK (0x00000001 << AD9257_OUT_LVDS_OPT_OFST) -#define AD9257_OUT_LVDS_ANSI_VAL (0) -#define AD9257_OUT_LVDS_IEEE_VAL (1) - -#define AD9257_OUT_PHASE_REG (0x16) -#define AD9257_OUT_CLK_OFST (0) -#define AD9257_OUT_CLK_MSK (0x0000000F << AD9257_OUT_CLK_OFST) -#define AD9257_OUT_CLK_60_VAL (0x1) -#define AD9257_IN_CLK_OFST (4) -#define AD9257_IN_CLK_MSK (0x00000007 << AD9257_IN_CLK_OFST) -#define AD9257_IN_CLK_0_VAL (0x0) - -#define AD9257_VREF_REG (0x18) -#define AD9257_VREF_OFST (0) -#define AD9257_VREF_MSK (0x00000003 << AD9257_VREF_OFST) -#define AD9257_VREF_1_33_VAL (0x2) - -#define AD9257_TEST_MODE_REG (0x0D) -#define AD9257_OUT_TEST_OFST (0) -#define AD9257_OUT_TEST_MSK (0x0000000F << AD9257_OUT_TEST_OFST) -#define AD9257_NONE_VAL (0x0) -#define AD9257_MIXED_BIT_FREQ_VAL (0xC) -#define AD9257_TEST_RESET_SHORT_GEN (4) -#define AD9257_TEST_RESET_LONG_GEN (5) -#define AD9257_USER_IN_MODE_OFST (6) -#define AD9257_USER_IN_MODE_MSK (0x00000003 << AD9257_USER_IN_MODE_OFST) - - -void setAdc(int addr, int val) { - - u_int32_t codata; - codata = val + (addr << 8); - printf(" Setting ADC SPI Register. Wrote 0x%04x at 0x%04x\n", val, addr); - serializeToSPI(ADC_SPI_REG, codata, ADC_SERIAL_CS_OUT_MSK, AD9257_ADC_NUMBITS, - ADC_SERIAL_CLK_OUT_MSK, ADC_SERIAL_DATA_OUT_MSK, ADC_SERIAL_DATA_OUT_OFST); -} - -void prepareADC(){ - printf("\n\nPreparing ADC ... \n"); - - //power mode reset - printf("power mode reset:\n"); - setAdc(AD9257_POWER_MODE_REG, - (AD9257_INT_RESET_VAL << AD9257_POWER_INTERNAL_OFST) & AD9257_POWER_INTERNAL_MSK); - - //power mode chip run - printf("power mode chip run:\n"); - setAdc(AD9257_POWER_MODE_REG, - (AD9257_INT_CHIP_RUN_VAL << AD9257_POWER_INTERNAL_OFST) & AD9257_POWER_INTERNAL_MSK); - - //output clock phase - printf("output clock phase:\n"); - setAdc(AD9257_OUT_PHASE_REG, - (AD9257_OUT_CLK_60_VAL << AD9257_OUT_CLK_OFST) & AD9257_OUT_CLK_MSK); - - // lvds-iee reduced , binary offset - printf("lvds-iee reduced, binary offset:\n"); - setAdc(AD9257_OUT_MODE_REG, - (AD9257_OUT_LVDS_IEEE_VAL << AD9257_OUT_LVDS_OPT_OFST) & AD9257_OUT_LVDS_OPT_MSK); - - // all devices on chip to receive next command - printf("all devices on chip to receive next command:\n"); - setAdc(AD9257_DEV_IND_2_REG, - AD9257_CHAN_H_MSK | AD9257_CHAN_G_MSK | AD9257_CHAN_F_MSK | AD9257_CHAN_E_MSK); - setAdc(AD9257_DEV_IND_1_REG, - AD9257_CHAN_D_MSK | AD9257_CHAN_C_MSK | AD9257_CHAN_B_MSK | AD9257_CHAN_A_MSK | - AD9257_CLK_CH_DCO_MSK | AD9257_CLK_CH_IFCO_MSK); - - // vref 1.33 - printf("vref 1.33:\n"); - setAdc(AD9257_VREF_REG, - (AD9257_VREF_1_33_VAL << AD9257_VREF_OFST) & AD9257_VREF_MSK); - - // no test mode - printf("no test mode:\n"); - setAdc(AD9257_TEST_MODE_REG, - (AD9257_NONE_VAL << AD9257_OUT_TEST_OFST) & AD9257_OUT_TEST_MSK); - -#ifdef TESTADC - printf("***************************************** *******\n"); - printf("******* PUTTING ADC IN TEST MODE!!!!!!!!! *******\n"); - printf("***************************************** *******\n"); - // mixed bit frequency test mode - printf("mixed bit frequency test mode:\n"); - setAdc(AD9257_TEST_MODE_REG, - (AD9257_MIXED_BIT_FREQ_VAL << AD9257_OUT_TEST_OFST) & AD9257_OUT_TEST_MSK); -#endif -} - -#endif //AD9257_H diff --git a/slsDetectorSoftware/jctbDetectorServer/Makefile b/slsDetectorSoftware/jctbDetectorServer/Makefile deleted file mode 100644 index 3259ff756..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/Makefile +++ /dev/null @@ -1,59 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - - -CROSS = bfin-uclinux- -CC = $(CROSS)gcc - -CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG -DV1 -DCTB -DOLDVERSION #-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER - - -PROGS= jctbDetectorServer -INSTDIR= /tftpboot -INSTMODE= 0777 - - - -BINS = testlib_sharedlibc -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c slow_adc.c blackfin.c -#mcb_funcs.c sharedmemory.c -OBJS = $(SRCS:%.c=%.o) - - - -all: clean versioning $(PROGS) - -test: clean jungfrauADCTEst - -boot: $(OBJS) - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - -jctbDetectorServerNew: $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - -jctbDetectorServer: $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) -DOLDVERSION - -jungfrauADCTEst: $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) -DTESTADC - - - - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - - -romfs: - $(ROMFSINST) /bin/$(PROGS) - -clean: - rm -rf $(PROGS) *.o *.gdb - diff --git a/slsDetectorSoftware/jctbDetectorServer/ansi.h b/slsDetectorSoftware/jctbDetectorServer/ansi.h deleted file mode 120000 index a122db0ad..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/ansi.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/jctbDetectorServer/bf_init.sh b/slsDetectorSoftware/jctbDetectorServer/bf_init.sh deleted file mode 100644 index 88eccadb4..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/bf_init.sh +++ /dev/null @@ -1 +0,0 @@ -export PATH=/afs/psi.ch/project/sls_det_firmware/jungfrau_software/uClinux-2010_64bit/bfin-uclinux/bin:$PATH diff --git a/slsDetectorSoftware/jctbDetectorServer/blackfin.c b/slsDetectorSoftware/jctbDetectorServer/blackfin.c deleted file mode 100644 index 1771372e5..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/blackfin.c +++ /dev/null @@ -1,150 +0,0 @@ -#include "blackfin.h" - - #include - #include - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#include "server_defs.h" -#include "registers_m.h" - -//for memory mapping -u_int32_t CSP0BASE; - -u_int16_t volatile *values; - -int mapCSP0(void) { - printf("Mapping memory\n"); -#ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } - printf("/dev/mem opened\n"); - - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSP0 mapped\n"); - -#endif -#ifdef VIRTUAL - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); -#endif -#ifdef SHAREDMEMORY - if ( (res=inism(SMSV))<0) { - printf("error attaching shared memory! %i",res); - return FAIL; - } -#endif - printf("CSPObase is 0x%08x \n",CSP0BASE); - printf("CSPOBASE=from %08x to %08x\n",CSP0BASE,CSP0BASE+MEM_SIZE); - - u_int32_t address; - address = FIFO_DATA_REG;//_OFF; - //values=(u_int32_t*)(CSP0BASE+address*2); - values=(u_int16_t*)(CSP0BASE+address*2); - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - printf("\n\n"); - return OK; -} - -u_int16_t bus_r16(u_int32_t offset){ - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - return *ptr1; -} - -u_int16_t bus_w16(u_int32_t offset, u_int16_t data) { - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; -} - - -u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - volatile u_int32_t *ptr1; - - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - *ptr1=data; - - return OK; -} - - -u_int32_t bus_r(u_int32_t offset) { - volatile u_int32_t *ptr1; - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - return *ptr1; -} - -// program dacq settings - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - if (value!=-1) { - vLSB=value&(0xffffffff); - bus_w(aLSB,vLSB); - v64=value>> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - // printf("Wreg64(%x,%x) %08x %08x %016llx\n", aLSB>>11, aMSB>>11, vLSB, vMSB, value); - } - return get64BitReg(aLSB, aMSB); - -} - -int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vLSB=bus_r(aLSB); - vMSB=bus_r(aMSB); - v64=vMSB; - v64=(v64<<32) | vLSB; - - // printf("reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, v64); - - return v64; -} - -/* /\** */ -/* /\** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG *\/ */ -/* u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data) { */ -/* unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); */ -/* // printf("Writing to addr:%x\n",adr); */ -/* return bus_w16(adr,data); */ -/* } */ - -/* /\** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG *\/ */ -/* u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch){ */ -/* unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); */ -/* // printf("Reading from addr:%x\n",adr); */ -/* return bus_r16(adr); */ -/* } */ -/* **\/ */ diff --git a/slsDetectorSoftware/jctbDetectorServer/blackfin.h b/slsDetectorSoftware/jctbDetectorServer/blackfin.h deleted file mode 100644 index c7ef2cda2..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/blackfin.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef BLACKFIN_H -#define BLACKFIN_H - -#define CSP0 0x20200000 -#define MEM_SIZE 0x100000 -#ifndef OLDVERSION -#define MEM_MAP_SHIFT 1 -#endif -#ifdef OLDVERSION -#define MEM_MAP_SHIFT 11 -#endif -#include - -int mapCSP0(void); - -u_int16_t bus_r16(u_int32_t offset); -u_int16_t bus_w16(u_int32_t offset, u_int16_t data);//aldos function -u_int32_t bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB); -int64_t get64BitReg(int aLSB, int aMSB); - - -#endif diff --git a/slsDetectorSoftware/jctbDetectorServer/commonServerFunctions.h b/slsDetectorSoftware/jctbDetectorServer/commonServerFunctions.h deleted file mode 100755 index 55d30b8c4..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/commonServerFunctions.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef COMMON_SERVER_FUNCTIONS_H -#define COMMON_SERVER_FUNCTIONS_H - -#ifndef GOTTHARDD //gotthard already had bus_w etc defined in its firmware_funcs.c (not yet made with common files) -#include "blackfin.h" -#endif - -/* global variables */ - -void SPIChipSelect (u_int32_t* valw, u_int32_t addr, u_int32_t csmask) { - - // start point - (*valw) = 0xffffffff; // old board compatibility (not using specific bits) - bus_w (addr, (*valw)); - - // chip sel bar down - (*valw) &= ~csmask; /* todo with test: done a bit different, not with previous value */ - bus_w (addr, (*valw)); -} - - -void SPIChipDeselect (u_int32_t* valw, u_int32_t addr, u_int32_t csmask, u_int32_t clkmask) { - // chip sel bar up - (*valw) |= csmask; /* todo with test: not done for spi */ - bus_w (addr, (*valw)); - - //clk down - (*valw) &= ~clkmask; - bus_w (addr, (*valw)); - - // stop point = start point of course - (*valw) = 0xffffffff; // old board compatibility (not using specific bits) - bus_w (addr, (*valw)); -} - -void sendDataToSPI (u_int32_t* valw, u_int32_t addr, u_int32_t val, int numbitstosend, u_int32_t clkmask, u_int32_t digoutmask, int digofset) { - int i = 0; - for (i = 0; i < numbitstosend; ++i) { - - // clk down - (*valw) &= ~clkmask; - bus_w (addr, (*valw)); - - // write data (i) - (*valw) = (((*valw) & ~digoutmask) + // unset bit - (((val >> (numbitstosend - 1 - i)) & 0x1) << digofset)); // each bit from val starting from msb - bus_w (addr, (*valw)); - - // clk up - (*valw) |= clkmask ; - bus_w (addr, (*valw)); - } -} - - -void serializeToSPI(u_int32_t addr, u_int32_t val, u_int32_t csmask, int numbitstosend, u_int32_t clkmask, u_int32_t digoutmask, int digofset) { -#ifdef VERBOSE - if (numbitstosend == 16) - printf("Writing to SPI Register: 0x%04x\n",val); - else - printf("Writing to SPI Register: 0x%08x\n", val); -#endif - - u_int32_t valw; - - SPIChipSelect (&valw, addr, csmask); - - sendDataToSPI(&valw, addr, val, numbitstosend, clkmask, digoutmask, digofset); - - SPIChipDeselect(&valw, addr, csmask, clkmask); -} - -#endif //COMMON_SERVER_FUNCTIONS_H diff --git a/slsDetectorSoftware/jctbDetectorServer/communication_funcs.c b/slsDetectorSoftware/jctbDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/jctbDetectorServer/communication_funcs.h b/slsDetectorSoftware/jctbDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jctbDetectorServer/convert_pof_to_raw.c b/slsDetectorSoftware/jctbDetectorServer/convert_pof_to_raw.c deleted file mode 100644 index 661ab2bd9..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/convert_pof_to_raw.c +++ /dev/null @@ -1,58 +0,0 @@ -// Converts POF files into RAW files for flashing - -#include -#include - -// Warning: This program is for testing only. -// It makes some assumptions regarding the pof file and the flash size that might be wrong. -// It also overwrites the destination file without any hesitation. -// Handle with care. - -int main(int argc, char* argv[]) -{ - FILE* src; - FILE* dst; - int x; - int y; - int i; - int filepos; - - if (argc < 3) - { - printf("%s Sourcefile Destinationfile\n",argv[0]); - return -1; - } - - src = fopen(argv[1],"rb"); - dst = fopen(argv[2],"wb"); - - // Remove header (0...11C) - for (filepos=0; filepos < 0x11C; filepos++) - fgetc(src); - - // Write 0x80 times 0xFF (0...7F) - for (filepos=0; filepos < 0x80; filepos++) - fputc(0xFF,dst); - - // Swap bits and write to file - for (filepos=0x80; filepos < 0x1000000; filepos++) - { - x = fgetc(src); - if (x < 0) break; - - y=0; - for (i=0; i < 8; i++) - y=y| ( (( x & (1<> i) << (7-i) ); // This swaps the bits - - fputc(y,dst); - } - if (filepos < 0x1000000) - printf("ERROR: EOF before end of flash\n"); - - printf("To flash the file in Linux do:\n"); - printf(" cat /proc/mtd (to findout the right mtd)\n"); - printf(" flash_eraseall /dev/mtdX\n"); - printf(" cat file > /dev/mtdX\n"); - - return 0; -} diff --git a/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c deleted file mode 100755 index d7f703c0d..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/firmware_funcs.c +++ /dev/null @@ -1,4072 +0,0 @@ -//#define TESTADC -#define TESTADC1 - - -//#define TIMEDBG -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "slow_adc.h" -#include "registers_m.h" -#define ADC_SPI_REG ADC_WRITE_REG - -#define ADC_SERIAL_CLK_OUT_OFST (0) -#define ADC_SERIAL_CLK_OUT_MSK (0x00000001 << ADC_SERIAL_CLK_OUT_OFST) -#define ADC_SERIAL_DATA_OUT_OFST (1) -#define ADC_SERIAL_DATA_OUT_MSK (0x00000001 << ADC_SERIAL_DATA_OUT_OFST) -#define ADC_SERIAL_CS_OUT_OFST (2) -#define ADC_SERIAL_CS_OUT_MSK (0x0000000F << ADC_SERIAL_CS_OUT_OFST) - -#include "AD9257.h" - -//#define VERBOSE -//#define VERYVERBOSE - - -#ifdef SHAREDMEMORY -#include "sharedmemory.h" -#endif - -#include -#include -#include - -#include -#include -#include /* exit() */ -#include /* memset(), memcpy() */ -#include /* uname() */ -#include -#include /* socket(), bind(), - listen(), accept() */ -#include -#include -#include -#include -#include /* fork(), write(), close() */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "blackfin.h" -typedef struct ip_header_struct { - u_int16_t ip_len; - u_int8_t ip_tos; - u_int8_t ip_ihl:4 ,ip_ver:4; - u_int16_t ip_offset:13,ip_flag:3; - u_int16_t ip_ident; - u_int16_t ip_chksum; - u_int8_t ip_protocol; - u_int8_t ip_ttl; - u_int32_t ip_sourceip; - u_int32_t ip_destip; -} ip_header; - - -struct timeval tss,tse,tsss; //for timing - - - -FILE *debugfp, *datafp; - -int fr; -int wait_time; -int *fifocntrl; - -//int *statusreg; commented out by dhanya -const int nModY=1; -int nModBoard; -int nModX=NMAXMOD; -int dynamicRange=16;//32; -int nSamples=1; - -int dataBytes=NMAXMOD*NCHIP*NCHAN*2; - -int storeInRAM=0; -int ROI_flag=0; -int adcConfigured=-1; -u_int16_t *ram_values=NULL; -char volatile *now_ptr=NULL; -//u_int32_t volatile *values; -extern u_int16_t volatile *values; -int ram_size=0; - -int64_t totalTime=1; -u_int32_t progressMask=0; - -int phase_shift=0;//DEFAULT_PHASE_SHIFT; -int ipPacketSize=DEFAULT_IP_PACKETSIZE; -int udpPacketSize=DEFAULT_UDP_PACKETSIZE; - - -#ifndef NEW_PLL_RECONFIG -u_int32_t clkDivider[4]={32,16,16,16}; -#else -u_int32_t clkDivider[4]={40,20,20,200}; -#endif -int32_t clkPhase[4]={0,0,0,0}; - -u_int32_t adcDisableMask=0; - -int ififostart, ififostop, ififostep, ififo; - -int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; - -enum externalSignalFlag signals[4]={EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF}; - -int withGotthard = 0; - -/**is not const because this value will change after initDetector, is removed from mcb_funcs.c cuz its not used anywhere - * why is this used anywhere instead of macro*/ -int nChans=NCHAN; -int nChips=NCHIP; -//int nDacs;//=NDAC; -//int nAdcs=NADC; - -extern enum detectorType myDetectorType; -/** for jungfrau reinitializing macro later in server_funcs.c in initDetector*/ - extern int N_CHAN; - extern int N_CHIP; - extern int N_DAC; - extern int N_ADC; - extern int N_CHANS; - - -int analogEnable=1; -int digitalEnable=0; - - -int vLimit=-100; - -int nDacs; -int nAdcs; - -char mtdvalue[10]; - -int initDetector() { - - int imod; - // sls_detector_module *myModule; - int n=getNModBoard(); - nModX=n; - -#ifdef VERBOSE - printf("Board is for %d modules\n",n); -#endif - - - // nChans=N_CHAN; - // nChips=N_CHIP; - nDacs=N_DAC; - // nAdcs=N_ADC; - -/* detectorModules=malloc(n*sizeof(sls_detector_module)); */ -/* detectorDacs=malloc(n*N_DAC*sizeof(int)); */ -/* detectorAdcs=malloc(n*N_ADC*sizeof(int)); */ -/* detectorChips=NULL; */ -/* detectorChans=NULL; */ -/* detectorAdcs=NULL; */ -/* if(myDetectorType != JUNGFRAU){ */ -/* detectorChips=malloc(n*N_CHIP*sizeof(int)); */ -/* detectorChans=malloc(n*N_CHIP*N_CHAN*sizeof(int)); */ -/* } */ - -/* #ifdef VERBOSE */ -/* printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); */ -/* printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*N_DAC)); */ -/* printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*N_ADC)); */ -/* if(myDetectorType != JUNGFRAU){ */ -/* printf("chips from 0x%x to 0x%x\n",(unsigned int)(detectorChips), (unsigned int)(detectorChips+n*N_CHIP)); */ -/* printf("chans from 0x%x to 0x%x\n",(unsigned int)(detectorChans), (unsigned int)(detectorChans+n*N_CHIP*N_CHAN)); */ -/* } */ -/* #endif */ - - -/* for (imod=0; imoddacs=detectorDacs+imod*N_DAC; */ -/* (detectorModules+imod)->adcs=detectorAdcs+imod*N_ADC; */ -/* if(myDetectorType != JUNGFRAU){ */ -/* (detectorModules+imod)->chipregs=detectorChips+imod*N_CHIP; */ -/* (detectorModules+imod)->chanregs=detectorChans+imod*N_CHIP*N_CHAN; */ -/* } */ -/* (detectorModules+imod)->ndac=N_DAC; */ -/* (detectorModules+imod)->nadc=N_ADC; */ -/* (detectorModules+imod)->nchip=N_CHIP; */ -/* (detectorModules+imod)->nchan=N_CHIP*N_CHAN; */ -/* (detectorModules+imod)->module=imod; */ -/* (detectorModules+imod)->gain=0; */ -/* (detectorModules+imod)->offset=0; */ -/* (detectorModules+imod)->reg=0; */ -/* /\* initialize registers, dacs, retrieve sn, adc values etc *\/ */ -/* } */ -/* thisSettings=UNINITIALIZED; */ -/* sChan=noneSelected; */ -/* sChip=noneSelected; */ -/* sMod=noneSelected; */ -/* sDac=noneSelected; */ -/* sAdc=noneSelected; */ - -/* /\* */ -/* setCSregister(ALLMOD); //commented out by dhanya */ -/* setSSregister(ALLMOD); */ -/* counterClear(ALLMOD); */ -/* clearSSregister(ALLMOD); */ -/* putout("0000000000000000",ALLMOD); */ -/* *\/ */ - -/* /\* initialize dynamic range etc. *\/ */ -/* /\* dynamicRange=getDynamicRange(); //always 16 not required commented out */ -/* nModX=setNMod(-1);*\/ */ - -/* // dynamicRange=32; */ -/* // initChip(0, 0,ALLMOD); */ -/* //nModX=n; */ -/* // */ - allocateRAM(); - - return OK; -} - - - - - -int cleanFifo(){ -/* u_int32_t addr, reg, val, adc_sync; */ -/* printf("Cleaning FIFO\n"); */ -/* addr=ADC_SYNC_REG; */ - -/* if(withGotthard) */ -/* adc_sync = GOTTHARD_ADCSYNC_VAL; */ -/* else */ -/* adc_sync = ADCSYNC_VAL; */ - - -/* reg = bus_r(addr) & CLEAN_FIFO_MASK; */ - -/* //only for start up */ -/* if(!reg) reg = adc_sync; */ - -/* // 88 3 02111 */ -/* if (ROI_flag==0) { */ -/* val=reg | ADCSYNC_CLEAN_FIFO_BITS | TOKEN_RESTART_DELAY; */ -/* bus_w(addr,val); */ -/* // 88 0 02111 */ -/* val=reg | TOKEN_RESTART_DELAY; */ -/* bus_w(addr,val); */ -/* } */ -/* else { */ -/* //1b332214 */ -/* val=reg | ADCSYNC_CLEAN_FIFO_BITS | TOKEN_RESTART_DELAY_ROI; */ -/* bus_w(addr,val); */ -/* //1b032214 */ -/* val=reg | TOKEN_RESTART_DELAY_ROI; */ -/* bus_w(addr,val); */ - -/* } */ -/* reg=bus_r(addr); */ -/* //#ifdef DDEBUG */ -/* printf("ADC SYNC reg 0x19:%x\n",reg); */ -/* //#endif */ - return OK; -} - - -int setDAQRegister() -{ -/* u_int32_t addr, reg, val; */ -/* addr=DAQ_REG; */ - -/* //depended on adcval */ -/* int packetlength=0x7f; */ -/* if(!ROI_flag) packetlength=0x13f; */ - -/* //depended on pcb rev */ -/* int tokenTiming = TOKEN_TIMING_REV2; */ -/* if((bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)==1) */ -/* tokenTiming= TOKEN_TIMING_REV1; */ - - -/* val = (packetlength<<16) + tokenTiming; */ -/* //val=34+(42<<8)+(packetlength<<16); */ - -/* reg=bus_r(addr); */ -/* bus_w(addr,val); */ -/* reg=bus_r(addr); */ -/* //#ifdef VERBOSE */ -/* printf("DAQ reg 0x15:%x\n",reg); */ -/* //#endif */ - - return OK; -} - - -// direct pattern output -u_int32_t putout(char *s, int modnum) { - int i; - u_int32_t pat; - int addr; - - if (strlen(s)<16) { - fprintf(stdout," *** putout error: incorrect pattern length ***\n"); - fprintf(stdout," %s \n",s); - return FAIL; - } - - pat=0; - for (i=0;i<16;i++) { - if (s[i]=='1') pat=pat+(1<<(15-i)); - } - //addr=DAC_REG+(modnum<<4); - addr=DAC_REG;//+(modnum<3) - return -1; - - if (val>65535 || val<-65535) - return clkPhase[i]; - - // printf("PLL reconfig reset\N"); bus_w(PLL_CNTRL_REG,(1<0) { - inv=0; - phase=val&0xffff; - } else { - inv=0; - val=-1*val; - phase=(~val)&0xffff; - } - - - vv=phase | (i<<16);// | (inv<<21); - - setPllReconfigReg(PLL_PHASE_SHIFT_REG,vv,0); - - clkPhase[i]=val; - return clkPhase[i]; -} - - -int configureFrequency(int val, int i) { - - - u_int32_t l=0x0c; - u_int32_t h=0x0d; - u_int32_t vv; - int32_t phase=0, inv=0; - - u_int32_t tot; - u_int32_t odd=1;//0; - printf("Want to configure frequency of counter %d to %d\n",i,val); - // printf("PLL reconfig reset\N"); bus_w(PLL_CNTRL_REG,(1<3) { - printf("wrong counter number %d\n",i); - return -1; - } - - if (val<=0) { - - printf("get value %d %d \n",i,clkDivider[i]); - return clkDivider[i]; - } - if (i==adc_clk_c){ - if (val>40) - { - printf("Too high frequency %d MHz for these ADCs!\n", val); - return clkDivider[i]; - } - } - - tot= PLL_VCO_FREQ_MHZ/val; - l=tot/2; - h=l; - if (tot>2*l) { - h=l+1; - odd=1; - } - else - { - odd=0; - } - - printf("Counter %d: Low is %d, High is %d\n",i, l,h); - - - vv= (i<<18)| (odd<<17) | l | (h<<8); - - printf("Counter %d, val: %08x\n", i, vv); - setPllReconfigReg(PLL_C_COUNTER_REG, vv,0); - /* // usleep(20); */ - /* //change sync at the same time as */ - /* if (i>0) { */ - /* val= (2<<18)| (odd<<17) | l | (h<<8); */ - - /* printf("Counter %d, val: %08x\n", i, val); */ - /* setPllReconfigReg(PLL_C_COUNTER_REG, val,0); */ - - /* } */ - - - usleep(10000); - - printf("reset pll\n"); - bus_w(PLL_CNTRL_REG,((1<2) */ -/* return -1; */ - -/* if (ic==2) { */ -/* printf("dbit clock is the same as adc clk\n"); */ -/* ic=1; */ - -/* } */ - -/* if (ic==1 && d>40) */ -/* return -1; */ - -/* if (d>160) */ -/* return -1; */ - -/* if (tot>510) */ -/* return -1; */ - -/* if (tot<1) */ -/* return -1; */ - - - -/* clkDivider[ic]=d; */ -/* configurePll(ic); */ - - - -/* return clkDivider[ic]; */ -/* } */ - - -/* int phaseStep(int st){ */ - -/* if (st>65535 || st<-65535) */ -/* return clkPhase[0]; */ -/* #ifdef NEW_PLL_RECONFIG */ -/* printf("reset pll\n"); */ -/* bus_w(PLL_CNTRL_REG,((1<=0 && i<4) - return clkPhase[i]; - else - return -1; - -}; - - - -/* int getDbitPhase() { */ - -/* printf("dbit clock is the same as adc clk\n"); */ -/* return getPhase(); */ - -/* }; */ - - -/* u_int32_t getClockDivider(int ic) { */ - -/* if (ic>2) */ -/* return -1; */ - -/* if (ic==2) { */ -/* printf("dbit clock is the same as adc clk\n"); */ -/* ic=1; */ - -/* } */ -/* return clkDivider[ic]; */ - - -/* /\* int ic=0; *\/ */ -/* /\* u_int32_t val; *\/ */ -/* /\* u_int32_t l,h; *\/ */ - -/* /\* printf("get clk divider\n"); *\/ */ - - -/* /\* setPllReconfigReg(PLL_MODE_REG,1,0); *\/ */ -/* /\* getPllReconfigReg(PLL_MODE_REG,0); *\/ */ - -/* /\* u_int32_t addr=0xa; //c0 *\/ */ -/* /\* if (ic>0) *\/ */ -/* /\* addr=0xb; //c1 *\/ */ - -/* /\* val=getPllReconfigReg(PLL_N_COUNTER_REG,0); *\/ */ -/* /\* printf("Getting N counter %08x\n",val); *\/ */ - -/* /\* l=val&0xff; *\/ */ -/* /\* h=(val>>8)&0xff; *\/ */ - -/* /\* //getPllReconfigReg(PLL_STATUS_REG,0); *\/ */ -/* /\* val=getPllReconfigReg(addr,0); *\/ */ -/* /\* printf("Getting C counter %08x\n",val); *\/ */ - - - -/* /\* return 800/(l+h); *\/ */ - -/* } */ - - -u_int32_t adcPipeline(int d) { - u_int32_t v; - if (d>=0) { - v=bus_r(ADC_PIPELINE_REG)&0x00ff0000; - bus_w(ADC_PIPELINE_REG, d|v); - } - return bus_r(ADC_PIPELINE_REG)&0xff; -} - - -u_int32_t dbitPipeline(int d) { - u_int32_t v; - if (d>=0) { - v=bus_r(ADC_PIPELINE_REG)&0x000000ff; - bus_w(ADC_PIPELINE_REG, v|(d<<16)); - - } - v=bus_r(ADC_PIPELINE_REG)>>16; - return v&0xff; -} - - -u_int32_t setSetLength(int d) { - return 0; -} - -u_int32_t getSetLength() { - return 0; -} - -u_int32_t setOversampling(int d) { - return 0; - /* if (d>=0 && d<=255) */ - /* bus_w(OVERSAMPLING_REG, d); */ - - /* return bus_r(OVERSAMPLING_REG); */ -} - - -u_int32_t setWaitStates(int d1) { - return 0; -} - -u_int32_t getWaitStates() { - return 0; -} - - - -u_int32_t setExtSignal(int d, enum externalSignalFlag mode) { - - //int modes[]={EXT_SIG_OFF, EXT_GATE_IN_ACTIVEHIGH, EXT_GATE_IN_ACTIVELOW,EXT_TRIG_IN_RISING,EXT_TRIG_IN_FALLING,EXT_RO_TRIG_IN_RISING, EXT_RO_TRIG_IN_FALLING,EXT_GATE_OUT_ACTIVEHIGH, EXT_GATE_OUT_ACTIVELOW, EXT_TRIG_OUT_RISING, EXT_TRIG_OUT_FALLING, EXT_RO_TRIG_OUT_RISING, EXT_RO_TRIG_OUT_FALLING}; - // int off=d*SIGNAL_OFFSET; - - u_int32_t c; - c=bus_r(EXT_SIGNAL_REG); - - if (d>=0 && d<4) { - signals[d]=mode; -#ifdef VERBOSE - printf("settings signal variable number %d to value %04x\n", d, signals[d]); -#endif - - // if output signal, set it! - - switch (mode) { - case GATE_IN_ACTIVE_HIGH: - case GATE_IN_ACTIVE_LOW: - if (timingMode==GATE_FIX_NUMBER || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case TRIGGER_IN_RISING_EDGE: - case TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_EXPOSURE || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case RO_TRIGGER_IN_RISING_EDGE: - case RO_TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_READOUT) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case MASTER_SLAVE_SYNCHRONIZATION: - setSynchronization(syncMode); - break; - default: - setFPGASignal(d,mode); - break; - } - - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - } - - -// if (mode<=RO_TRIGGER_OUT_FALLING_EDGE && mode>=0) -// bus_w(EXT_SIGNAL_REG,((modes[mode])<=0) { -#ifdef VERBOSE - printf("writing signal register number %d mode %04x\n",d, modes[mode]); -#endif - bus_w(EXT_SIGNAL_REG,((modes[mode])<>off); - - if (mode=0 && d<4) { -#ifdef VERBOSE - printf("gettings signal variable number %d value %04x\n", d, signals[d]); -#endif - return signals[d]; - } else - return -1; - - -} - - -int getFPGASignal(int d) { - - int modes[]={SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE, GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE, TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,RO_TRIGGER_OUT_FALLING_EDGE}; - - int off=d*SIGNAL_OFFSET; - int mode=((bus_r(EXT_SIGNAL_REG)&(SIGNAL_MASK<>off); - - if (mode<=RO_TRIGGER_OUT_FALLING_EDGE) { - if (modes[mode]!=SIGNAL_OFF && signals[d]!=MASTER_SLAVE_SYNCHRONIZATION) - signals[d]=modes[mode]; -#ifdef VERYVERBOSE - printf("gettings signal register number %d value %04x\n", d, modes[mode]); -#endif - return modes[mode]; - } else - return -1; - -} - - - - - -/* -enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE -}; -*/ - - -int setTiming(int ti) { - - - int ret=GET_EXTERNAL_COMMUNICATION_MODE; - - int g=-1, t=-1, rot=-1; - - int i; - - switch (ti) { - case AUTO_TIMING: - timingMode=ti; - // disable all gates/triggers in except if used for master/slave synchronization - for (i=0; i<4; i++) { - if (getFPGASignal(i)>0 && getFPGASignal(i)=0 && t>=0 && rot<0) { - ret=GATE_WITH_START_TRIGGER; - } else if (g<0 && t>=0 && rot<0) { - ret=TRIGGER_EXPOSURE; - } else if (g>=0 && t<0 && rot<0) { - ret=GATE_FIX_NUMBER; - } else if (g<0 && t<0 && rot>0) { - ret=TRIGGER_READOUT; - } else if (g<0 && t<0 && rot<0) { - ret=AUTO_TIMING; - } - - // timingMode=ret; - - return ret; - -} - - - -int setConfigurationRegister(int d) { -#ifdef VERBOSE - printf("Setting configuration register to %x",d); -#endif - if (d>=0) { - bus_w(CONFIG_REG,d); - } -#ifdef VERBOSE - printf("configuration register is %x", bus_r(CONFIG_REG)); -#endif - return bus_r(CONFIG_REG); -} - -int setToT(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting ToT to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: ToT is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("ToT is %x\n", reg); -#endif - if (reg&TOT_ENABLE_BIT) - return 1; - else - return 0; -} - -/* int setOutputMode(int d) { */ -/* //int ret=0; */ -/* int reg; */ -/* int v; */ -/* //#ifdef VERBOSE */ -/* printf("Setting readout flags to to %d\n",d); */ -/* //#endif */ -/* reg=bus_r(CONFIG_REG); */ -/* //#ifdef VERBOSE */ -/* printf("Before: config reg is %x\n", reg); */ -/* //#endif */ -/* if (d>=0) { */ -/* reg=reg & ~(3<<8); */ -/* if (d==DIGITAL_ONLY) */ -/* reg=reg | (3<<8); */ -/* else if (d==ANALOG_AND_DIGITAL) */ -/* reg=reg | (2<<8); */ - -/* bus_w(CONFIG_REG,reg); */ - -/* } */ - -/* reg=bus_r(CONFIG_REG); */ -/* //#ifdef VERBOSE */ -/* printf("After: config reg is %x\n", reg); */ -/* //#endif */ -/* if ((reg&(2<<8))) { */ -/* if (reg&(1<<8)) { */ -/* digitalEnable=1; */ -/* analogEnable=0; */ -/* return DIGITAL_ONLY; */ -/* } else { */ -/* digitalEnable=1; */ -/* analogEnable=0; */ -/* return ANALOG_AND_DIGITAL; */ -/* } */ -/* } else */ -/* if (reg&(1<<8)) */ -/* return -1; */ -/* else */ -/* return NORMAL_READOUT; */ - - -/* } */ - -int setContinousReadOut(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting Continous readout to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: Continous readout is %x\n", reg); -#endif - - - - if (d>0) { - bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Continous readout is %x\n", reg); -#endif - if (reg&CONT_RO_ENABLE_BIT) - return 1; - else - return 0; -} - - -int startReceiver(int start) { - u_int32_t addr=CONFIG_REG; - //#ifdef VERBOSE - if(start) - printf("Setting up detector to send to Receiver\n"); - else - printf("Setting up detector to send to CPU\n"); - //#endif - int reg=bus_r(addr); - //for start recever, write 0 and for stop, write 1 - if (!start) - bus_w(CONFIG_REG,reg&(~GB10_NOT_CPU_BIT)); - else - bus_w(CONFIG_REG,reg|GB10_NOT_CPU_BIT); - - reg=bus_r(addr); -//#ifdef VERBOSE - printf("Config Reg %x\n", reg); -//#endif - int d =reg&GB10_NOT_CPU_BIT; - if(d!=0) d=1; - - printf("Value is %d expected %d\n", d, start); - - if(d!=start) - return FAIL; - else - return OK; -} - - -u_int64_t getDetectorNumber() { - char output[255],mac[255]=""; - u_int64_t res=0; - FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - return res; -} - -u_int32_t getFirmwareVersion() { - return bus_r(FPGA_VERSION_REG); -} - -u_int32_t getFirmwareSVNVersion(){ - return bus_r(FPGA_VERSION_REG);//(FPGA_SVN_REG); -} - - -// for fpga test -u_int32_t testFpga(void) { - printf("Testing FPGA:\n"); - volatile u_int32_t val,addr,val2; - int result=OK,i; - //fixed pattern - val=bus_r(FIX_PATT_REG); - if (val==FIXED_PATT_VAL) { - printf("fixed pattern ok!! %08x\n",val); - } else { - printf("fixed pattern wrong!! %08x\n",val); - result=FAIL; - } - - //dummy register - addr = DUMMY_REG; - for(i=0;i<1000000;i++) - { - val=0x5A5A5A5A-i; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x5A5A5A5A-i) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); - result=FAIL; - } - val=(i+(i<<10)+(i<<20)); - bus_w(addr, val); - val2=bus_r(addr); - if (val2!=val) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); - result=FAIL; - } - val=0x0F0F0F0F; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x0F0F0F0F) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); - result=FAIL; - } - val=0xF0F0F0F0; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0xF0F0F0F0) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); - result=FAIL; - } - } - if(result==OK) - { - printf("----------------------------------------------------------------------------------------------"); - printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); - printf("----------------------------------------------------------------------------------------------"); - } - printf("\n"); - return result; -} - - -// for fpga test -u_int32_t testRAM(void) { - int result=OK; - - printf("TestRAM not implemented\n"); - -/* int i=0; - allocateRAM(); - // while(i<100000) { - memcpy(ram_values, values, dataBytes); - printf ("Testing RAM:\t%d: copied fifo %x to memory %x size %d\n",i++, (unsigned int)(values), (unsigned int)(ram_values), dataBytes); - // } - * -*/ - return result; -} - - -int getNModBoard() { - - return 1; -} - -int setNMod(int n) { - -/* printf("Writin ADC disable register %08x\n",n); */ -/* bus_w(ADC_LATCH_DISABLE_REG,n); */ - return getNMod(); -} - -int getNMod() { -/* u_int32_t reg; */ -/* int i; */ -/* reg=bus_r(ADC_LATCH_DISABLE_REG); */ - -/* printf("Read ADC disable register %08x\n",reg); */ -/* nModX=32; */ -/* for (i=0; i<32; i++) { */ -/* if (reg & (1<=0) { - nSamples=value; - bus_w(NSAMPLES_REG,nSamples); - } - getDynamicRange(); - allocateRAM(); - //printf("Setting dataBytes to %d: dr %d; samples %d\n",dataBytes, dynamicRange, nSamples); - return nSamples; -} - -int64_t setDelay(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value*=(1E-3*clkDivider[1]);//(1E-9*CLK_FREQ); - } - return set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-3*clkDivider[1]);//(1E-9*CLK_FREQ); -} - -int64_t getDelay(){ - return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-3*clkDivider[1]);//(1E-9*CLK_FREQ); -} - -int64_t setTrains(int64_t value){ - printf("Set cycles %lld\n",value); - return set64BitReg(value, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); -} - -int64_t getTrains(){ - return get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); -} - - -int64_t setProbes(int64_t value){ - return 0; -} - - -int64_t setProgress() { - - //????? eventually call after setting the registers - -return 0; - -} - - -int64_t getProgress() { - - - //should be done in firmware!!!! - - return 0; - -} - -int64_t getActualTime(){ - return get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getMeasurementTime(){ - int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); - // int64_t mask=0x8000000000000000; - // if (v & mask ) { - //#ifdef VERBOSE - // printf("no measurement time left\n"); - //#endif - // return -1E+9; - // } else - return v/(1E-9*CLK_FREQ); -} - -int64_t getFramesFromStart(){ - int64_t v=get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); - int64_t v1=get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - - printf("Frames from start data streaming %lld\n",v); - printf("Frames from start run control %lld\n",v1); - - // int64_t mask=0x8000000000000000; - // if (v & mask ) { - //#ifdef VERBOSE - // printf("no measurement time left\n"); - //#endif - // return -1E+9; - // } else - return v; -} - - -int setROI(int nroi,ROI* arg,int *retvalsize, int *ret) { - - - - // ROI retval[MAX_ROIS]; - int i, ich; - adcDisableMask=0xffffffff; - - printf("Setting ROI\n"); - if (nroi>=0) { - if (nroi==0) { - adcDisableMask=0; - } else { - for (i=0; i=0 && ichMAX_ROIS) { - *retvalsize-=1; - break; - } - arg[*retvalsize-1].xmin=ich; - arg[*retvalsize-1].xmax=ich; - } - else { - if ((adcDisableMask)&(1<<(ich-1))) { - *retvalsize+=1; - if (*retvalsize>MAX_ROIS) { - *retvalsize-=1; - break; - } - arg[*retvalsize-1].xmin=ich; - } - arg[*retvalsize-1].xmax=ich; - } - } - } - - for (ich=0; ich<*retvalsize; ich++) { - printf("%d xmin %d xmax %d\n", ich, arg[ich].xmin, arg[ich].xmax); - } - - getDynamicRange(); - return *retvalsize;/*warning: function returns address of local variable*/ - -} - - -int loadImage(int index, short int ImageVals[]){ - - printf("loadImage Not implemented yet\n"); - - /* - u_int32_t address; - switch (index) { - case DARK_IMAGE : - address = DARK_IMAGE_REG; - break; - case GAIN_IMAGE : - address = GAIN_IMAGE_REG; - break; - } - volatile u_int16_t *ptr; - ptr=(u_int16_t*)(CSP0BASE+address*2); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,ImageVals[i]); -#endif - memcpy(ptr,ImageVals ,dataBytes); -#ifdef VERBOSE - printf("\nLoaded x%08x address with image of index %d\n",(unsigned int)(ptr),index); -#endif - */ - - return OK; -} - - - -int64_t getProbes(){ - return 0; -} - - -int setDACRegister(int idac, int val, int imod) { -/* u_int32_t addr, reg, mask; */ -/* int off; */ -/* #ifdef VERBOSE */ -/* if(val==-1) */ -/* printf("Getting dac register%d module %d\n",idac,imod); */ -/* else */ -/* printf("Setting dac register %d module %d to %d\n",idac,imod,val); */ -/* #endif */ - -/* switch(idac){ */ -/* case 0: */ -/* case 1: */ -/* case 2: */ -/* addr=MOD_DACS1_REG; */ -/* break; */ -/* case 3: */ -/* case 4: */ -/* case 5: */ -/* addr=MOD_DACS2_REG; */ -/* break; */ -/* case 6: */ -/* case 7: */ -/* addr=MOD_DACS3_REG; */ -/* break; */ -/* default: */ -/* printf("weird idac value %d\n",idac); */ -/* return -1; */ -/* break; */ -/* } */ -/* //saving only the msb */ -/* val=val>>2; */ - -/* off=(idac%3)*10; */ -/* mask=~((0x3ff)<=0 && val>off)&0x3ff; */ -/* //since we saved only the msb */ -/* val=val<<2; */ - -/* //val=(bus_r(addr)>>off)&0x3ff; */ - - -/* #ifdef VERBOSE */ -/* printf("Dac %d module %d register is %d\n\n",idac,imod,val); */ -/* #endif */ -/* return val; */ -} - - -int getTemperature(int tempSensor){ - int val; - int imod=0;//ignoring more than 1 mod for now - int i,j,repeats=6; - u_int32_t tempVal=0; -#ifdef VERBOSE - char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; - printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); -#endif - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs - - for(i=0;i<20;i++) { - //repeats is number of register writes for delay - for(j=0;j>1);//fpga - } - } - - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - val=((int)tempVal)/4.0; - -#ifdef VERBOSE - printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); -#endif - return val; -} - - - -int initHighVoltage(int val, int imod){ - - - u_int32_t offw,codata; - u_int16_t valw, dacvalue=-1; - int i,ddx,csdx,cdx;//iru, - float alpha=0.55;//, fval=val; - - offw=DAC_REG; - - if (val!=-1) { - if (val<0) { - printf("val is %d: should switch the relais!\n", val); - val=-100; - dacvalue=0; - } else if (val==0) { - dacvalue=0; - val=0; - } else if (val<60) { - dacvalue=0; - val=60; - } else if (val>=200) { - dacvalue=0x1; - val=200; - } else { - dacvalue=1.+(200.-val)/alpha; - val=200.-(dacvalue-1)*alpha; - } - printf ("****************************** setting val %d, dacval %d\n",val, dacvalue); - - // if (dacvalue>=0) { - - - ddx=8; csdx=10; cdx=9; - codata=((dacvalue)&0xff); - - - valw=bus_r(offw)&0x7fff; //switch off HV - bus_w(offw,(valw)); // start point - valw=((valw&(~(0x1<>(7-i))&0x1)<=0) { - valw=bus_r(offw)|0xff00;; //switch on HV - } else { - valw=bus_r(offw)&0x7fff;//switch off HV - } - - - bus_w(offw,(valw)); // stop point =start point of course */ - printf("Writing %d in HVDAC \n",dacvalue); - - bus_w(HV_REG,val); - - // } - } - - - - return (int16_t)bus_r(HV_REG); - - - - // return val; -} - - - -int initConfGain(int isettings,int val,int imod){ - int retval; -/* u_int32_t addr=CONFGAIN_REG; */ - -/* if(isettings!=-1){ */ -/* #ifdef VERBOSE */ -/* printf("Setting Gain of module:%d with val:%d\n",imod,val); */ -/* #endif */ -/* bus_w(addr,val); */ -/* } */ -/* retval=(bus_r(addr)); */ -/* #ifdef VERBOSE */ -/* printf("Value read from Gain reg is %d\n",retval); */ -/* #endif */ - return retval; -} - - - -/* int setADC(int adc){ */ -/* /\* int reg,nchips,mask,nchans; *\/ */ - -/* /\* if(adc==-1) ROI_flag=0; *\/ */ -/* /\* else ROI_flag=1; *\/ */ - -/* /\* // setDAQRegister();//token timing *\/ */ -/* /\* cleanFifo();//adc sync *\/ */ - -/* /\* //with gotthard module *\/ */ -/* /\* if(withGotthard){ *\/ */ -/* /\* //set packet size *\/ */ -/* /\* ipPacketSize= DEFAULT_IP_PACKETSIZE; *\/ */ -/* /\* udpPacketSize=DEFAULT_UDP_PACKETSIZE; *\/ */ -/* /\* //set channel mask *\/ */ -/* /\* nchips = GOTTHARDNCHIP; *\/ */ -/* /\* nchans = GOTTHARDNCHAN; *\/ */ -/* /\* mask = ACTIVE_ADC_MASK; *\/ */ -/* /\* } *\/ */ - -/* /\* //with moench module all adc *\/ */ -/* /\* else{/\\* if(adc==-1){*\\/ *\/ */ -/* /\* //set packet size *\/ */ -/* /\* ipPacketSize= DEFAULT_IP_PACKETSIZE; *\/ */ -/* /\* udpPacketSize=DEFAULT_UDP_PACKETSIZE; *\/ */ -/* /\* //set channel mask *\/ */ -/* /\* nchips = N_CHIP; *\/ */ -/* /\* nchans = N_CHANS; *\/ */ -/* /\* mask = ACTIVE_ADC_MASK; *\/ */ -/* /\* }/\\* *\/ */ -/* /\* //with moench module 1 adc -- NOT IMPLEMENTED *\/ */ -/* /\* else{ *\/ */ -/* /\* ipPacketSize= ADC1_IP_PACKETSIZE; *\/ */ -/* /\* udpPacketSize=ADC1_UDP_PACKETSIZE; *\/ */ -/* /\* //set channel mask *\/ */ -/* /\* nchips = NCHIPS_PER_ADC; *\/ */ -/* /\* nchans = GOTTHARDNCHAN; *\/ */ -/* /\* mask = 1< 1 ) { - sum += *addr++; - count -= 2; - } - if( count > 0 ) sum += *addr; // Add left-over byte, if any - while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - checksum = (~sum)&0xffff; - - printf("IP checksum is 0x%lx\n",checksum); - - return checksum; -} - - - -#ifdef NEW_GBE_INTERFACE -int writeGbeReg(int ivar, uint32_t val, int addr, int interface) { -/* #define GBE_CTRL_WSTROBE 0 */ -/* #define GBE_CTRL_VAR_OFFSET 16 */ -/* #define GBE_CTRL_VAR_MASK 0XF */ -/* #define GBE_CTRL_RAMADDR_OFFSET 24 */ -/* #define GBE_CTRL_RAMADDR_MASK 0X3F */ -/* #define GBE_CTRL_INTERFACE 23 */ - uint32_t ctrl=((ivar&GBE_CTRL_VAR_MASK)<>32)&0xFFFFFFFF; - vals[IPCHECKSUM_ADDR]=checksum; - vals[GBE_DELAY_ADDR]=0; - vals[GBE_RESERVED1_ADDR]=sourceport; - vals[GBE_RESERVED2_ADDR]=interface; - vals[DETECTOR_MAC_L_ADDR]=(sourcemac)&0xFFFFFFFF; - vals[DETECTOR_MAC_H_ADDR]=(sourcemac>>32)&0xFFFFFFFF; - vals[DETECTOR_IP_ADDR]=sourceip; - - for (ivar=0; ivar>32)&0xFFFFFFFF);//rx_udpmacH_AReg_c - bus_w(RX_UDPMACL_AREG,(destmac)&0xFFFFFFFF);//rx_udpmacL_AReg_c - bus_w(DETECTORMACH_AREG,(sourcemac>>32)&0xFFFFFFFF);//detectormacH_AReg_c - bus_w(DETECTORMACL_AREG,(sourcemac)&0xFFFFFFFF);//detectormacL_AReg_c - bus_w(UDPPORTS_AREG,((sourceport&0xFFFF)<<16)+(destport&0xFFFF));//udpports_AReg_c - bus_w(IPCHKSUM_AREG,(checksum&0xFFFF));//ipchksum_AReg_c - - -#endif - - bus_w(CONTROL_REG,GB10_RESET_BIT); - sleep(1); - bus_w(CONTROL_REG,0); - usleep(10000); - bus_w(CONFIG_REG,conf | GB10_NOT_CPU_BIT); - printf("System status register is %08x\n",bus_r(SYSTEM_STATUS_REG)); - -return 0; //any value doesnt matter - dhanya - -} - - - - - - - - - - - -int configureMAC(uint32_t destip,uint64_t destmac,uint64_t sourcemac,int sourceip,int ival,uint32_t destport) { -//int configureMAC(int ipad,long long int macad,long long int detectormacad, int detipad, int ival, int udpport){ - - uint32_t sourceport = 0x7e9a; // 0xE185; - int interface=0; - int ngb; -volatile u_int32_t conf= bus_r(CONFIG_REG); - - - - - -#ifdef NEW_GBE_INTERFACE - ngb=2; - printf("--------- New XGB interface\n"); -#else - ngb=1; - printf("********* Old XGB interface\n"); -#endif - - for (interface=0; interface >17)&1); - now_ptr+=8; - - } - // bus_w16(DUMMY_REG,0); // -/* #ifdef TIMEDBG */ - -/* gettimeofday(&tss,NULL); */ -/* printf("read data loop = %ld usec\n",(tss.tv_usec) - (tse.tv_usec)); */ - -/* #endif */ -//#ifdef VERBOSE - // printf("*"); - //#endif - // printf("\n"); - return ram_values; -} - - - -u_int16_t* fifo_read_frame() -{ -#ifdef TIMEDBG - gettimeofday(&tsss,NULL); -#endif - - // u_int16_t *dum; - int ns=0; - now_ptr=(char*)ram_values; - while(ns>(ipos))&0x1; - ichan++; - } - } - break; - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan0) { - dynamicRange=16; - } - getDynamicRange(); - allocateRAM(); - printf("Setting dataBytes to %d: dr %d; samples %d\n",dataBytes, dynamicRange, nSamples); - return getDynamicRange(); -} - - - - - - -int getDynamicRange() { - if(myDetectorType == JUNGFRAU){ - dynamicRange=16; - return dynamicRange; - } - - nSamples=bus_r(NSAMPLES_REG); - getChannels(); - dataBytes=nModX*N_CHIP*getChannels()*2*nSamples; - printf("data bytes is:%d\n",dataBytes); - return dynamicRange;//nSamples; -} - -int testBus() { - u_int32_t j; - u_int64_t i, n, nt; - // char cmd[100]; - u_int32_t val=0x0; - int ifail=OK; - // printf("%s\n",cmd); - // system(cmd); - i=0; - - n=1000000; - nt=n/100; - printf("testing bus %d times\n",(int)n); - while (i0) - storeInRAM=1; - else - storeInRAM=0; - return allocateRAM(); -} - -int getChannels() { - int nch=0; - int i; - - if (analogEnable) { - nch+=32; - for (i=0; i1) { - - clearRAM(); - ram_values=malloc(size); - // ram_values=realloc(ram_values,size)+2; - // if (ram_values) - // break; - // nSamples--; - //} - - if (ram_values) { - now_ptr=(char*)ram_values; - - //#ifdef VERBOSE - printf("ram allocated 0x%x of size %d to %x\n",(int)now_ptr,(unsigned int) size,(unsigned int)(now_ptr+size)); - //#endif - ram_size=size; - return OK; - } - - - printf("Fatal error: there must be a memory leak somewhere! You can't allocate even one frame!\n"); - return FAIL; - - - - -} - - -int writeADC(int addr, int val) { - setAdc(addr,val); - return OK; - /* u_int32_t valw,codata,csmask; */ - /* int i,cdx,ddx; */ - /* cdx=0; ddx=1; */ - /* csmask=0xfc; // 1111100 */ - - /* codata=val + (addr<< 8); */ - /* printf("***** ADC SPI WRITE TO REGISTER %04X value %04X\n",addr,val); */ - /* // start point */ - /* valw=0xff; */ - /* bus_w16(ADC_WRITE_REG,(valw)); */ - - /* //chip sel bar down */ - /* valw=((0xffffffff&(~csmask))); */ - /* bus_w16(ADC_WRITE_REG,valw); */ - - /* for (i=0;i<24;i++) { */ - /* //cldwn */ - /* valw=valw&(~(0x1<>(23-i))&0x1)<=MAX_PATTERN_LENGTH) - return -1; - - - printf("read %x\n",addr); - cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET; - bus_w(PATTERN_CNTRL_REG, cntrl); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_READ_BIT) ); - usleep(1000); - printf("reading\n"); - word=get64BitReg(PATTERN_OUT_LSB_REG,PATTERN_OUT_MSB_REG); - printf("read %llx\n", word); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl); - printf("done\n"); - - return word; -} - -uint64_t writePatternWord(int addr, uint64_t word) { - - - int cntrl=0; - if (addr>=MAX_PATTERN_LENGTH) - return -1; - - printf("write %x %llx\n",addr, word); - if (word!=-1){ - - set64BitReg(word,PATTERN_IN_REG_LSB,PATTERN_IN_REG_MSB); - - - cntrl= (addr&APATTERN_MASK) << PATTERN_CTRL_ADDR_OFFSET; - bus_w(PATTERN_CNTRL_REG, cntrl); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl | (1<< PATTERN_CTRL_WRITE_BIT) ); - usleep(1000); - bus_w(PATTERN_CNTRL_REG, cntrl); - return word; - } else - return readPatternWord(addr); -} -uint64_t writePatternIOControl(uint64_t word) { - uint64_t c=0xffffffffffffffffULL; - if (word!=c) { /*warning: integer constant is too large for ‘long’ type*/ - // printf("%llx %llx %lld",get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB),word); - set64BitReg(word,PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB); - // printf("************ write IOCTRL (%x)\n",PATTERN_IOCTRL_REG_MSB); - } - return get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB); - -} -uint64_t writePatternClkControl(uint64_t word) { - uint64_t c=0xffffffffffffffffULL; - if (word!=c) set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);/*warning: integer constant is too large for ‘long’ type*/ - return get64BitReg(PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB); - -} - -int setPatternLoop(int level, int *start, int *stop, int *n) { - int ret=OK; - int lval=0; - - int nreg; - int areg; - - switch (level ) { - case 0: - nreg=PATTERN_N_LOOP0_REG; - areg=PATTERN_LOOP0_AREG; - break; - case 1: - nreg=PATTERN_N_LOOP1_REG; - areg=PATTERN_LOOP1_AREG; - break; - case 2: - nreg=PATTERN_N_LOOP2_REG; - areg=PATTERN_LOOP2_AREG; - break; - case -1: - nreg=-1; - areg=PATTERN_LIMITS_AREG; - break; - default: - return FAIL; - } - - printf("level %d start %x stop %x nl %d\n",level, *start, *stop, *n); - if (nreg>=0) { - if ((*n)>=0) bus_w(nreg, *n); - printf ("n %d\n",*n); - *n=bus_r(nreg); - printf ("n %d\n",*n); - - } - - printf("level %d start %x stop %x nl %d\n",level, *start, *stop, *n); - lval=bus_r(areg); -/* printf("l=%x\n",bus_r16(areg)); */ -/* printf("m=%x\n",bus_r16_m(areg)); */ - - - - - - printf("lval %x\n",lval); - if (*start==-1) *start=(lval>> ASTART_OFFSET) & APATTERN_MASK; - printf("start %x\n",*start); - - - if (*stop==-1) *stop=(lval>> ASTOP_OFFSET) & APATTERN_MASK; - printf("stop %x\n",*stop); - - lval= ((*start & APATTERN_MASK) << ASTART_OFFSET) | ((*stop & APATTERN_MASK) << ASTOP_OFFSET); - printf("lval %x\n",lval); - - bus_w(areg,lval); - printf("lval %x\n",lval); - - - return ret; -} - - -int setPatternWaitAddress(int level, int addr) { - int reg; - - switch (level) { - case 0: - reg=PATTERN_WAIT0_AREG; - break; - case 1: - reg=PATTERN_WAIT1_AREG; - break; - case 2: - reg=PATTERN_WAIT2_AREG; - break; - default: - return -1; - }; - // printf("BEFORE *********PATTERN IOCTRL IS %llx (%x)\n",writePatternIOControl(-1), PATTERN_IOCTRL_REG_MSB); - - // printf ("%d addr %x (%x)\n",level,addr,reg); - if (addr>=0) bus_w(reg, addr); - // printf ("%d addr %x %x (%x) \n",level,addr, bus_r(reg), reg); - - // printf("AFTER *********PATTERN IOCTRL IS %llx (%x)\n",writePatternIOControl(-1), PATTERN_IOCTRL_REG_MSB); - - return bus_r(reg); -} - - -uint64_t setPatternWaitTime(int level, uint64_t t) { - int reglsb; - int regmsb; - - - switch (level) { - case 0: - reglsb=PATTERN_WAIT0_TIME_REG_LSB; - regmsb=PATTERN_WAIT0_TIME_REG_MSB; - break; - case 1: - reglsb=PATTERN_WAIT1_TIME_REG_LSB; - regmsb=PATTERN_WAIT1_TIME_REG_MSB; - break; - case 2: - reglsb=PATTERN_WAIT2_TIME_REG_LSB; - regmsb=PATTERN_WAIT2_TIME_REG_MSB; - break; - default: - return -1; - } - - - if (t>=0) set64BitReg(t,reglsb,regmsb); - return get64BitReg(reglsb,regmsb); - -} - - -void initDac(int dacnum) { - - - u_int32_t offw,codata; - u_int16_t valw; - int i,ddx,csdx,cdx; - - - - //setting int reference - offw=DAC_REG; - - - ddx=0; cdx=1; - csdx=dacnum/8+2; - - - printf("data bit=%d, clkbit=%d, csbit=%d",ddx,cdx,csdx); - codata=(((0x6)<<4)|((0xf)<<16)|((0x0<<4)&0xfff0)); - - valw=0x00ff|(bus_r(offw)&0xff00); - bus_w(offw,(valw)); // start point - valw=((valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); - valw=((valw&(~(0x1<>16)&0xffff; */ -/* else */ -/* return retval&0xffff; */ - -} - - - - -int setPower(int ind, int val) { - int dacindex=-1; - int dacval=-1; - int pwrindex=-1; - int retval=-1; - int retval1=-1; - - u_int32_t preg; - - int vchip=2700-(getDacRegister(19)*1000)/4095; - int vmax=vchip-200; - int vmin=600; - - printf("---------------------------------------------Current V_Chip is %d mV\n",vchip); - - switch (ind) { - - case V_POWER_CHIP: - dacindex=19; - pwrindex=-1; - break; - case V_POWER_A: - dacindex=22; - pwrindex=1; - break; - case V_POWER_B: - dacindex=21; - pwrindex=2; - break; - case V_POWER_C: - dacindex=20; - pwrindex=3; - break; - case V_POWER_D: - dacindex=18; - pwrindex=4; - break; - case V_POWER_IO: - dacindex=23; - pwrindex=0; - break; - case V_LIMIT: - dacindex=-1; - pwrindex=-1; - break; - default: - pwrindex=-1; - dacindex=-1; - } - - if (val==-1) { - printf("get\n"); - dacval=-1; - } else { - if (pwrindex>=0) { - printf("vpower\n"); - dacval=((vmax-val)*4095)/(vmax-vmin); - if (dacval<0) - dacval=0; - if (dacval>4095) - dacval=-100; - if (val==-100) - dacval=-100; - - - } else if (dacindex>=0) { - printf("vchip\n"); - dacval=((2700-val)*4095)/1000; - if (dacval<0) - dacval=0; - if (dacval>4095) - dacval=4095; - - } else { - vLimit=val; - printf("vlimit %d\n",vLimit ); - } - - } - - if (pwrindex>=0 && val!=-1) { - preg=bus_r(POWER_ON_REG); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - printf("Switching off power %d\n", pwrindex); - bus_w(POWER_ON_REG,preg&(~(1<<(16+pwrindex)))); - setDac(dacindex,-100); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - retval=0; - } - - if (dacindex>0 && dacval!=-100) { - - printf("Setting power %d to %d mV\n",ind,val); - printf("Setting DAC %d to value %d\n",dacindex,dacval); - retval=setDac(dacindex,dacval); - if (pwrindex>=0 && dacval>=0 ) { - preg=bus_r(POWER_ON_REG); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - printf("Switching on power %d\n", pwrindex); - bus_w(POWER_ON_REG,preg|((1<<(16+pwrindex)))); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - } - } - - if (pwrindex>=0) { - if (bus_r(POWER_ON_REG)&(1<<(16+pwrindex))){ - vmax=2700-(getDacRegister(19)*1000)/4095-200; - printf("Vchip id %d mV\n",vmax+200); - retval1=vmax-(retval*(vmax-vmin))/4095; - printf("Vdac id %d mV\n",retval1); - if (retval1>vmax) - retval1=vmax; - if (retval1=0) { - if (retval>=0) { - retval1=2700-(retval*1000)/4095; - printf("Vchip is %d mV\n",vmax); - } else - retval1=-1; - } else { - printf("Get vlimit %d\n",vLimit); - retval=vLimit; - retval1=vLimit; - } - - /* switch (ind) { */ -/* case V_POWER_A: */ -/* break; */ -/* case V_POWER_B: */ -/* break; */ -/* case V_POWER_C: */ -/* break; */ -/* case V_POWER_D: */ -/* break; */ -/* case V_POWER_IO: */ -/* break; */ -/* case V_POWER_CHIP: */ -/* break; */ -/* default: */ -/* retval1=retval; */ -/* } */ - - - return retval1; - - -} - - -void defineGPIOpins(){ - //define the gpio pins - system("echo 7 > /sys/class/gpio/export"); - system("echo 9 > /sys/class/gpio/export"); - //define their direction - system("echo in > /sys/class/gpio/gpio7/direction"); - system("echo out > /sys/class/gpio/gpio9/direction"); -} - -void resetFPGA(){ - cprintf(BLUE,"\n*** Reseting FPGA ***\n"); - FPGAdontTouchFlash(); - FPGATouchFlash(); - usleep(250*1000); -} - -void FPGAdontTouchFlash(){ - //tell FPGA to not touch flash - system("echo 0 > /sys/class/gpio/gpio9/value"); - //usleep(100*1000); -} - -void FPGATouchFlash(){ - //tell FPGA to touch flash to program itself - system("echo 1 > /sys/class/gpio/gpio9/value"); -} - - -int startWritingFPGAprogram(FILE** filefp){ -#ifdef VERY_VERBOSE - printf("\n at startWritingFPGAprogram \n"); -#endif - - //getting the drive - char output[255]; - FILE* fp = popen("awk \'$4== \"\\\"bitfile(spi)\\\"\" {print $1}\' /proc/mtd", "r"); - fgets(output, sizeof(output), fp); - pclose(fp); - strcpy(mtdvalue,"/dev/"); - char* pch = strtok(output,":"); - if(pch == NULL){ - cprintf(RED,"Could not get mtd value\n"); - return FAIL; - } - strcat(mtdvalue,pch); - printf ("\nFlash drive found: %s\n",mtdvalue); - - - FPGAdontTouchFlash(); - - //writing the program to flash - *filefp = fopen(mtdvalue, "w"); - if(*filefp == NULL){ - cprintf(RED,"Unable to open %s in write mode\n",mtdvalue); - return FAIL; - } - printf("flash ready for writing\n"); - - return OK; -} - - -void eraseFlash(){ -#ifdef VERY_VERBOSE - printf("\n at eraseFlash \n"); -#endif - - char command[255]; - sprintf(command,"flash_eraseall %s",mtdvalue); - system(command); - printf("flash erased\n"); -} - -int stopWritingFPGAprogram(FILE* filefp){ -#ifdef VERY_VERBOSE - printf("\n at stopWritingFPGAprogram \n"); -#endif - - int wait = 0; - if(filefp!= NULL){ - fclose(filefp); - wait = 1; - } - - //touch and program - FPGATouchFlash(); - - if(wait){ -#ifdef VERY_VERBOSE - printf("Waiting for FPGA to program from flash\n"); -#endif - //waiting for success or done - char output[255]; - int res=0; - while(res == 0){ - FILE* sysFile = popen("cat /sys/class/gpio/gpio7/value", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - sscanf(output,"%d",&res); -#ifdef VERY_VERBOSE - printf("gpi07 returned %d\n",res); -#endif - } - } - printf("FPGA has picked up the program from flash\n\n"); - - - return OK; -} - -int writeFPGAProgram(char* fpgasrc, size_t fsize, FILE* filefp){ -#ifdef VERY_VERBOSE - printf("\n at writeFPGAProgram \n"); - cprintf(BLUE,"address of fpgasrc:%p\n",(void *)fpgasrc); - cprintf(BLUE,"fsize:%d\n",fsize); - cprintf(BLUE,"pointer:%p\n",(void*)filefp); -#endif - - if(fwrite((void*)fpgasrc , sizeof(char) , fsize , filefp )!= fsize){ - cprintf(RED,"Could not write FPGA source to flash\n"); - return FAIL; - } -#ifdef VERY_VERBOSE - cprintf(BLUE,"program written to flash\n"); -#endif - return OK; -} - - - - -int powerChip(int arg) { - //#ifndef CTB - - u_int32_t preg=bus_r(POWER_ON_REG); - if (myDetectorType!=JUNGFRAUCTB) { - if (arg>=0) { - if (arg) - bus_w(POWER_ON_REG,preg|0xffff0000); - else - bus_w(POWER_ON_REG,preg&0x0000ffff); - preg=bus_r(POWER_ON_REG); - } - } - printf("Power register is %08x\n",preg); - if (preg&0xffff0000) - return 1; - else - return 0; -} - - - -int vLimitCompliant(int val_mV) { - int ret=0; - - if (vLimit>0) { - if (val_mV<=vLimit) ret=1; - } else ret=1; - - return ret; - - -} - - -int dacSPI(int codata) { - u_int32_t offw; - int valw, vv; - int i, ddx,cdx; - - ddx=0; cdx=1; - - offw=DAC_REG; - valw=bus_r(offw); - // codata=((cmd&0xf)<=0) { - - cmd=0x3; - - } else if (dacvalue==-100) { - - cmd=0x4; - - } - codata=cmd<>(24-i)))&0x1); */ - /* valw=(valw&(~(0x1<>(24-i))&0x1)<>(24-i))&0x1)); */ - - - /* valw=((valw)|(0x1<>8)&0x3) { - case 0: - analogEnable=1; - digitalEnable=0; - v1=NORMAL_READOUT; - break; - case 3: - analogEnable=0; - digitalEnable=1; - v1=DIGITAL_ONLY; - break; - case 2: - analogEnable=1; - digitalEnable=1; - v1=ANALOG_AND_DIGITAL; - break; - default: - printf("Unknown readout mode for analog and digital fifos %d\n",(bus_r(CONFIG_REG)>>8)&0x3); - v1=GET_READOUT_FLAGS; - } - getDynamicRange(); - allocateRAM(); - printf("dataBytes is %d\n",dataBytes); - return v1; - -} - - -int writePowerI2C(int val, int nbit) { - - int nc=nbit/8; - int ic, ib, ii; - int ack; - int bsd=PWR_I2C_SDA_BIT, bsc=PWR_I2C_SCL_BIT,esd=PWR_I2C_SDA_EN_BIT, esc=PWR_I2C_SCL_EN_BIT; - - u_int16_t co; - - printf("Write power I2C\n"); - co=(1<>ib)&1)<>ib)&1)); - } - printf("\n"); - co=co&(~(1<>ib)&1)<>ib)&1)); - } - printf("\n"); - co=co&(~(1< -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -int mapCSP0(void); - -u_int16_t bus_r16(u_int32_t offset); -u_int16_t bus_w16(u_int32_t offset, u_int16_t data);//aldos function -u_int32_t bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); - -//int setPhaseShiftOnce(); -//int phaseStep(int st); -//int dbitPhaseStep(int st); -//int getDbitPhase(); -int getPhase(int i); -int cleanFifo(); -int setDAQRegister(); -int configurePhase(int val, int i); -int configureFrequency(int val, int i); - -u_int32_t putout(char *s, int modnum); -u_int32_t readin(int modnum); -//u_int32_t setClockDivider(int d, int ic); -//u_int32_t getClockDivider(int ic); - -void resetPLL(); -u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val, int trig); -u_int32_t getPllReconfigReg(u_int32_t reg, int trig); - -u_int32_t setSetLength(int d); -u_int32_t getSetLength(); -u_int32_t setWaitStates(int d); -u_int32_t getWaitStates(); -//u_int32_t setTotClockDivider(int d); -//u_int32_t getTotClockDivider(); -//u_int32_t setTotDutyCycle(int d); -//u_int32_t getTotDutyCycle(); -u_int32_t setOversampling(int d); -u_int32_t adcPipeline(int d); -u_int32_t dbitPipeline(int d); - -u_int32_t setExtSignal(int d, enum externalSignalFlag mode); -int getExtSignal(int d); - -u_int32_t setFPGASignal(int d, enum externalSignalFlag mode); -int getFPGASignal(int d); - -int setTiming(int t); - - -int setConfigurationRegister(int d); -int setToT(int d); -int setContinousReadOut(int d); -int startReceiver(int d); - -int setDACRegister(int idac, int val, int imod); -int getDacRegister(int dacnum); - - -int getTemperature(int tempSensor); -int initHighVoltage(int val,int imod); -int initConfGain(int isettings,int val,int imod); - -//int setADC(int adc); -//int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int ival, int udpport); -int configureMAC(uint32_t destip,uint64_t destmac,uint64_t sourcemac,int detipad,int ival,uint32_t destport); -int getAdcConfigured(); - - -u_int64_t getDetectorNumber(); -u_int32_t getFirmwareVersion(); -u_int32_t getFirmwareSVNVersion(); - -int testFifos(void); -u_int32_t testFpga(void); -u_int32_t testRAM(void); -int testBus(void); -int setDigitalTestBit(int ival); - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB); -int64_t get64BitReg(int aLSB, int aMSB); - -int64_t setFrames(int64_t value); -int64_t getFrames(); - -int64_t setExposureTime(int64_t value); -int64_t getExposureTime(); - -int64_t setGates(int64_t value); -int64_t getGates(); - -int64_t setDelay(int64_t value); -int64_t getDelay(); - -int64_t setPeriod(int64_t value); -int64_t getPeriod(); - -int64_t setTrains(int64_t value); -int64_t getTrains(); - -int64_t setProbes(int64_t value); -int64_t getProbes(); - -int64_t getProgress(); -int64_t setProgress(); - -int64_t getActualTime(); -int64_t getMeasurementTime(); -int64_t getFramesFromStart(); - -u_int32_t runBusy(void); -u_int32_t runState(void); -u_int32_t dataPresent(void); - - -int startStateMachine(); -int stopStateMachine(); -int startReadOut(); -u_int32_t fifoReset(void); -u_int32_t fifoReadCounter(int fifonum); -u_int32_t fifoReadStatus(); - - -u_int32_t fifo_full(void); - - - -u_int16_t* fifo_read_event(int ns); -u_int16_t* fifo_read_frame(); -u_int32_t* decode_data(int* datain); -//u_int32_t move_data(u_int64_t* datain, u_int64_t* dataout); -int setDynamicRange(int dr); -int getDynamicRange(); -int getNModBoard(); -int setNMod(int n); -int getNMod(); - -int setStoreInRAM(int b); -int allocateRAM(); - - -int writeADC(int addr, int val); -//int prepareADC(); - - - -int clearRAM(); - - -int setMaster(int f); -int setSynchronization(int s); - -int loadImage(int index, short int ImageVals[]); -int readCounterBlock(int startACQ, short int CounterVals[]); -int resetCounterBlock(int startACQ); - -int calibratePedestal(int frames); - -uint64_t writePatternWord(int addr, uint64_t word); -uint64_t writePatternIOControl(uint64_t word); -uint64_t writePatternClkControl(uint64_t word); -int setPatternLoop(int level, int *start, int *stop, int *n); -int setPatternWaitAddress(int level, int addr); -uint64_t setPatternWaitTime(int level, uint64_t t); - - -void initDac(int dacnum); -int setDac(int dacnum,int dacvalue); - -int setPower(int ind, int val); - -int setROI(int nroi,ROI* arg,int *retvalsize, int *ret); -int getChannels(); - -int getCurrent(int idac); -int getVoltage(int idac); - -void defineGPIOpins(); -void resetFPGA(); -void FPGAdontTouchFlash(); -void FPGATouchFlash(); - -int startWritingFPGAprogram(FILE** filefp); -int stopWritingFPGAprogram(FILE* filefp); -int writeFPGAProgram(char* fpgasrc, size_t fsize, FILE* filefp); -void eraseFlash(); - - - -/* - -u_int32_t setNBits(u_int32_t); -u_int32_t getNBits(); -*/ - -/* -//move to mcb_funcs? - -int readOutChan(int *val); -u_int32_t getModuleNumber(int modnum); -int testShiftIn(int imod); -int testShiftOut(int imod); -int testShiftStSel(int imod); -int testDataInOut(int num, int imod); -int testExtPulse(int imod); -int testExtPulseMux(int imod, int ow); -int testDataInOutMux(int imod, int ow, int num); -int testOutMux(int imod); -int testFpgaMux(int imod); -int calibration_sensor(int num, int *values, int *dacs) ; -int calibration_chip(int num, int *values, int *dacs); -*/ - -int64_t setSamples(int64_t value); -//int setOutputMode(int d); -int setReadOutMode(int arg); -int vLimitCompliant(int val_mV) - -#endif diff --git a/slsDetectorSoftware/jctbDetectorServer/get_server.sh b/slsDetectorSoftware/jctbDetectorServer/get_server.sh deleted file mode 100755 index b66a7ac2a..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/get_server.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -serv="pc8498" -f="jungfrauDetectorServerTest" -if [ "$#" -gt 0 ]; then - f=$1 -fi -if [ "$#" -gt 1 ]; then - serv=$2 -fi -tftp $serv -r $f -g -chmod a+xrw $f - diff --git a/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt b/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt deleted file mode 100644 index a9e60d7f6..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/jctbDetectorServer -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 9ae128961675230ad322ff2867f1862dbe8566a7 -Revision: 25 -Branch: developer -Last Changed Author: Anna_Bergamaschi -Last Changed Rev: 3764 -Last Changed Date: 2018-05-07 14:30:14.000000002 +0200 ./Makefile diff --git a/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h b/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h deleted file mode 100644 index 0945b43c9..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/gitInfoMoench.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "9ae128961675230ad322ff2867f1862dbe8566a7" -#define GITAUTH "Anna_Bergamaschi" -#define GITREV 0x3764 -#define GITDATE 0x20180507 -#define GITBRANCH "developer" diff --git a/slsDetectorSoftware/jctbDetectorServer/gitInfoMoenchTmp.h b/slsDetectorSoftware/jctbDetectorServer/gitInfoMoenchTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/gitInfoMoenchTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorSoftware/jctbDetectorServer/jctbDetectorServer_developer b/slsDetectorSoftware/jctbDetectorServer/jctbDetectorServer_developer deleted file mode 100755 index 57590938c5c4a924bd5e0b2f72f021328953e85b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118204 zcmbrH4}4VBmH6Kz{F#Iayb#cVfJ^`-AmV_i0j*2|6^KAWi2M^_kRXVtQCW?D+MPsg zX=UA{*orOoH&MGwcWHNGt<5mn4%Q;ux;9w5RqNV3AEvC*cCfAu6v^*SBZoSgbw9gT)BFrOPJ5h>3l{5dw?_!?hdE5D>IWCT5$ zgm?En{MW(P7^jDUP>xHxOw{P41==z$L8?>n{@x1N{m0*xhsPGN(hYUaE{g2$BdBgs1d5&pXVlX|^ zq#c3e+s-d>6~25`rra3RBIP{%y+K=S++UtY@V02aVSYP*g>SIGJSer)Wa@I)E8p$0 z_NZp=Y_QwXj(vr=lQAtEOL)U6LTBO&fzEi-A-$

aEsi=`H0(vfM+^%yS;nd>8AT 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 diff --git a/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c b/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c deleted file mode 100755 index 695c31688..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/mcb_funcs.c +++ /dev/null @@ -1,2696 +0,0 @@ -#ifdef MCB_FUNCS - -#include -#include -#include -#include -#include -#include "registers_m.h" - -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" - - -/* global variables */ -#undef DEBUG -#undef DEBUGOUT - -extern int nModX; -//extern int dataBytes; -extern int dynamicRange; -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; -const int allSelected=-2; -const int noneSelected=-1; - - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -int *detectorDacs=NULL; -int *detectorAdcs=NULL; -//int numberOfProbes; - -ROI rois[MAX_ROIS]; -int nROI=0; -extern enum detectorType myDetectorType; - -/** for jungfrau reinitializing macro later in server_funcs.c in initDetector*/ -extern int N_CHAN; -extern int N_CHIP; -extern int N_DAC; -extern int N_ADC; -extern int N_CHANS; - -extern int nChans; -extern int nChips; -int nDacs; -int nAdcs; - -int initDetector() { - - int imod; - // sls_detector_module *myModule; - int n=getNModBoard(); - nModX=n; - -#ifdef VERBOSE - printf("Board is for %d modules\n",n); -#endif - - - // nChans=N_CHAN; - // nChips=N_CHIP; - nDacs=N_DAC; - // nAdcs=N_ADC; - - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorDacs=malloc(n*N_DAC*sizeof(int)); - detectorAdcs=malloc(n*N_ADC*sizeof(int)); - detectorChips=NULL; - detectorChans=NULL; - detectorAdcs=NULL; - if(myDetectorType != JUNGFRAU){ - detectorChips=malloc(n*N_CHIP*sizeof(int)); - detectorChans=malloc(n*N_CHIP*N_CHAN*sizeof(int)); - } - -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); - printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*N_DAC)); - printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*N_ADC)); - if(myDetectorType != JUNGFRAU){ - printf("chips from 0x%x to 0x%x\n",(unsigned int)(detectorChips), (unsigned int)(detectorChips+n*N_CHIP)); - printf("chans from 0x%x to 0x%x\n",(unsigned int)(detectorChans), (unsigned int)(detectorChans+n*N_CHIP*N_CHAN)); - } -#endif - - - for (imod=0; imoddacs=detectorDacs+imod*N_DAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*N_ADC; - if(myDetectorType != JUNGFRAU){ - (detectorModules+imod)->chipregs=detectorChips+imod*N_CHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*N_CHIP*N_CHAN; - } - (detectorModules+imod)->ndac=N_DAC; - (detectorModules+imod)->nadc=N_ADC; - (detectorModules+imod)->nchip=N_CHIP; - (detectorModules+imod)->nchan=N_CHIP*N_CHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ - } - thisSettings=UNINITIALIZED; - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - - /* - setCSregister(ALLMOD); //commented out by dhanya - setSSregister(ALLMOD); - counterClear(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - */ - - /* initialize dynamic range etc. */ - /* dynamicRange=getDynamicRange(); //always 16 not required commented out - nModX=setNMod(-1);*/ - - // dynamicRange=32; - // initChip(0, 0,ALLMOD); - //nModX=n; - // - allocateRAM(); - - return OK; -} - - - - -int copyChannel(sls_detector_channel *destChan, sls_detector_channel *srcChan) { - destChan->chan=srcChan->chan; - destChan->chip=srcChan->chip; - destChan->module=srcChan->module; - destChan->reg=srcChan->reg; - return OK; -} - - -int copyChip(sls_detector_chip *destChip, sls_detector_chip *srcChip) { - - int ichan; - int ret=OK; - if ((srcChip->nchan)>(destChip->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - - destChip->nchan=srcChip->nchan; - destChip->reg=srcChip->reg; - destChip->chip=srcChip->chip; - destChip->module=srcChip->module; - for (ichan=0; ichan<(srcChip->nchan); ichan++) { - *((destChip->chanregs)+ichan)=*((srcChip->chanregs)+ichan); - } - return ret; -} - - -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - - int ichip, idac, ichan, iadc; - - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",(unsigned int)(srcMod),(unsigned int)(destMod)); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ -/* #ifdef VERBOSE */ -/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ -/* #endif */ - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - - - - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - if(myDetectorType != JUNGFRAU){ - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - } - - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - - return ret; -} - - - -/* Register commands */ - - -/* int clearDACSregister(int imod) { */ - -/* putout("1111111111111111",imod);//reset */ -/* putout("1111111111111110",imod);//cs down */ - -/* /\* commented out by dhanya */ -/* putout("0000000001000000",imod); */ -/* putout("0000000101000000",imod); */ -/* putout("0000000101000000",imod); */ -/* putout("0000000001000000",imod); */ -/* *\/ */ -/* #ifdef DEBUG */ -/* fprintf(stdout, "Clearing DAC shiftregister\n"); */ -/* #endif */ -/* // sDac=0; */ -/* sMod=imod; */ -/* if (imod==ALLMOD) */ -/* sMod=allSelected; */ -/* return OK; */ -/* } */ - -/* int nextDAC(int imod) { */ - -/* putout("1111111111111011",imod);//cs up */ -/* putout("1111111111111001",imod);//clk down */ -/* putout("1111111111111111",imod);//reset */ - -/* /\*commented out by dhanya */ -/* putout("0000000001000000",imod); */ -/* putout("0000000001001000",imod); */ -/* putout("0000000001000000",imod); */ -/* *\/ */ -/* #ifdef DEBUG */ -/* fprintf(stdout, "Next DAC\n"); */ -/* #endif */ -/* // sDac++; */ -/* sMod=imod; */ -/* if (imod==ALLMOD) */ -/* sMod=allSelected; */ -/* return OK; */ -/* } */ - - -int clearCSregister(int imod) { - - putout("0000000001000000",imod); - putout("0000100001000000",imod); - putout("0000100001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Clearing CS shiftregister\n"); -#endif - /* - sChan=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - */ - sChip=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - //putout("0000000000000000",imod); - return 0; -} - -int setCSregister(int imod){ - - putout("0000000001000000",imod); - putout("0001000001000000",imod); - putout("0001000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Setting CS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChip=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextChip(int imod){ - - putout("0000000001000000",imod); - putout("0010000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Next Chip\n"); -#endif - sChip++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int firstChip(int imod){ - - putout("0100000001000000",imod); - putout("0110000001000000",imod); - putout("0100000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "First Chip\n"); -#endif - sChip=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int clearSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0000111000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Clearing SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int setSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0001011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Setting SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextStrip(int imod){ - putout("0000011000000000",imod); - putout("0010011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"|-"); -#endif - sChan++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int selChannel(const int strip,int imod) { - int istrip; - clearSSregister(imod); - nextStrip(imod); - for (istrip=0; istrip=0 && imod=0) */ -/* initDAC(ind,val, imod); */ - -/* if (imod>=0 && imodgain,(detectorModules+imod)->offset); */ -/* #endif */ -/* if ((detectorModules+imod)->gain>0) */ -/* myg=(detectorModules+imod)->gain; */ -/* else { */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myg=g[thisSettings]; */ -/* // else */ -/* //myg=-1; */ -/* } */ - -/* if ((detectorModules+imod)->offset>0) */ -/* myo=(detectorModules+imod)->offset; */ -/* else { */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myo=o[thisSettings]; */ -/* // else */ -/* //myo=-1; */ -/* } */ - -/* if (myg>0 && myo>0) { */ -/* //ethr=(myo-detectorDacs[VTHRESH+imod*N_DAC])*1000/myg; */ - -/* ethr=(myo-setDACRegister(VDAC0,-1,imod))*1000/myg;//edited by dhanya */ -/* // else */ -/* // ethr=-1; */ - -/* } */ -/* #ifdef VERBOSE */ -/* //printf("module=%d gain=%f, offset=%f, dacu=%f\n",imod, myg, myo, detectorDacs[VTHRESH+imod*N_DAC]); */ -/* printf("module=%d gain=%f, offset=%f, dacu=%d\n",imod, myg, myo,(int)(setDACRegister(VDAC0,-1,imod)));//edited by dhanya */ -/* printf("Threshold energy of module %d is %d eV\n", imod, ethr); */ -/* #endif */ - -/* if (imod==0) */ -/* ret=ethr; */ -/* else { */ -/* if (ethr>(ret+100) || ethr<(ret-100)) */ -/* return FAIL; */ -/* } */ -/* } */ -/* } */ -/* return ret; */ -/* } */ - -/* int setThresholdEnergy(int ethr) { */ -/* double g[3]=DEFAULTGAIN; */ -/* double o[3]=DEFAULTOFFSET; */ -/* double myg=-1, myo=-1; */ -/* int dacu; */ -/* int imod; */ -/* int ret=ethr; */ - -/* setSettings(GET_SETTINGS,-1);//-1 added by dhanya */ -/* if (thisSettings>=0 || thisSettings<3){ */ -/* myg=g[thisSettings]; */ -/* myo=o[thisSettings]; */ -/* } */ -/* for (imod=0; imodgain>0) */ -/* myg=(detectorModules+imod)->gain; */ -/* else */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myg=g[thisSettings]; */ -/* else */ -/* myg=-1; */ -/* if ((detectorModules+imod)->offset>0) */ -/* myo=(detectorModules+imod)->offset; */ -/* else */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myo=o[thisSettings]; */ -/* else */ -/* myo=-1; */ -/* } else { */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myo=o[thisSettings]; */ -/* else */ -/* myo=-1; */ -/* if (thisSettings>=0 && thisSettings<3) */ -/* myg=g[thisSettings]; */ -/* else */ -/* myg=-1; */ -/* } */ -/* if (myg>0 && myo>0) { */ -/* dacu=myo-myg*((double)ethr)/1000.; */ -/* #ifdef VERBOSE */ -/* printf("module %d (%x): gain %f, off %f, energy %d eV, dac %d\n",imod,(unsigned int)((detectorModules+imod)),(detectorModules+imod)->gain,(detectorModules+imod)->offset, ethr,dacu); */ -/* #endif */ -/* } else { */ -/* dacu=ethr; */ -/* #ifdef VERBOSE */ -/* printf("could not set threshold energy for module %d, settings %d (offset is %f; gain is %f)\n",imod,thisSettings,myo,myg); */ -/* #endif */ -/* } */ -/* initDACbyIndexDACU(VDAC0, dacu, imod); ///needs to be fixed dhanya */ -/* } */ -/* return ret; */ -/* } */ - - - -/* int getDACbyIndexDACU(int ind, int imod) { */ -/* /\* */ -/* if (detectorDacs) { */ -/* if (imodndac) */ -/* return (detectorDacs[ind+imod*N_DAC]); */ -/* } */ -/* return FAIL; */ -/* *\/ */ -/* return setDACRegister(ind, -1, imod); */ -/* } */ - - -/* int initDAC(int dac_addr, int value, int imod) { */ -/* // int i; */ -/* #ifdef VERBOSE */ -/* printf("Programming dac %d with value %d\n", dac_addr, value); */ -/* #endif */ -/* clearDACSregister(imod); */ -/* program_one_dac(dac_addr,value,imod); */ -/* nextDAC(imod); */ -/* clearDACSregister(imod); */ - -/* return 0; */ -/* } */ - -int getTemperatureByModule(int tempSensor, int imod) -{ - int im; - //for the particular module - if (imod>=0 && imod=0 && imod=0 && imod=0) { */ -/* #ifdef VERBOSE */ -/* fprintf(stdout, "voltage %d\n", *(v+iaddr)); */ -/* #endif */ -/* program_one_dac(iaddr, *(v+iaddr),imod); */ -/* } */ -/* nextDAC(imod); */ -/* } */ - - -/* clearDACSregister(imod); */ - -/* return 0; */ - -/* } */ - - - - -int setSettings(int i, int imod) { -/* #ifdef VERBOSE */ -/* if(i==-1) */ -/* printf("\nReading settings of detector...\n"); */ -/* else */ -/* printf("\ninside set settings wit settings=%d...\n",i); */ -/* #endif */ -/* int isett=-1,val=-1,retval=-1; */ -/* enum conf_gain { */ -/* dynamic = 0x0f00, //dynamic */ -/* dynamichighgain0 = 0x0f01, //dynamichighgain0 */ -/* fixgain1 = 0x0f02, //fixgain1 */ -/* fixgain2 = 0x0f06, //fixgain2 */ -/* forceswitchgain1 = 0x1f00, //forceswitchgain1 */ -/* forceswitchgain2 = 0x3f00 //forceswitchgain2 */ -/* }; */ - -/* //determine conf value to write */ -/* if(i!=GET_SETTINGS){ */ -/* switch(i){ */ -/* case DYNAMICGAIN: val = dynamic;break; */ -/* case DYNAMICHG0: val = dynamichighgain0;break; */ -/* case FIXGAIN1: val = fixgain1;break; */ -/* case FIXGAIN2: val = fixgain2;break; */ -/* case FORCESWITCHG1: val = forceswitchgain1;break; */ -/* case FORCESWITCHG2: val = forceswitchgain2;break; */ -/* default: */ -/* printf("Error: This settings is not defined for this detector %d\n",i); */ -/* return GET_SETTINGS; */ -/* } */ -/* } */ - -/* retval=initConfGainByModule(i,val,imod); */ - -/* switch(retval){ */ -/* case dynamic: isett=DYNAMICGAIN; break; */ -/* case dynamichighgain0: isett=DYNAMICHG0; break; */ -/* case fixgain1: isett=FIXGAIN1; break; */ -/* case fixgain2: isett=FIXGAIN2; break; */ -/* case forceswitchgain1: isett=FORCESWITCHG1; break; */ -/* case forceswitchgain2: isett=FORCESWITCHG2; break; */ -/* default: */ -/* isett=UNDEFINED; */ -/* printf("Error:Wrong settings read out from Gain Reg 0x%x\n",retval); */ -/* break; */ -/* } */ - -/* thisSettings=isett; */ -/* //#ifdef VERBOSE */ -/* printf("detector settings are %d\n",thisSettings); */ -/* //#endif */ - return thisSettings; -} - - - - -/* Initialization*/ - -int initChannelbyNumber(sls_detector_channel myChan) {printf("in init channel by number\n"); -/* int reg=myChan.reg; */ -/* int ft=reg & TRIM_DR; */ -/* int cae=(reg>>(NTRIMBITS))&1; */ -/* int ae=(reg>>(NTRIMBITS+1))&1; */ -/* int coe=(reg>>(NTRIMBITS+2))&1; */ -/* int ocoe=(reg>>(NTRIMBITS+3))&1; */ -/* int counts=(reg>>(NTRIMBITS+4)); */ -/* #ifdef VERBOSE */ -/* printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); */ -/* printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); */ -/* #endif */ - -/* if (myChan.chip<0) */ -/* setCSregister(myChan.module); */ -/* else */ -/* selChip(myChan.chip,myChan.module); */ - -/* if (myChan.chan<0) */ -/* setSSregister(myChan.module); */ -/* else */ -/* selChannel(myChan.chan,myChan.module); */ - -/* initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); */ - -/* setDynamicRange(dynamicRange); */ - -/* setCSregister(ALLMOD); */ -/* clearSSregister(ALLMOD); */ -/* putout("0000000000000000",ALLMOD); */ - - return myChan.reg; - -} - -int getChannelbyNumber(sls_detector_channel* myChan) { - /* int imod, ichip, ichan; */ - /* imod=myChan->module; */ - /* ichip=myChan->chip; */ - /* ichan=myChan->chan; */ - - /* if (detectorChans) { */ - /* if (imod=0) { */ - /* if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) */ - /* myChan->reg=detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan]; */ - /* return OK; */ - /* } */ - /* } */ - return FAIL; - -} - -int getTrimbit(int imod, int ichip, int ichan) { - /* if (detectorChans) { */ - /* if (imod=0) */ - /* if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) */ - /* return (detectorChans[imod*N_CHAN*N_CHIP+ichip*N_CHAN+ichan] & TRIM_DR); */ - /* } */ - - return -1; -} - -int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){ - -/* int ibit, bit, i, im, ichip, ichan; */ -/* int chanmi, chanma, chipmi, chipma, modmi, modma; */ - - - -/* sMod=imod; */ -/* // printf("initializing module %d\n",sMod); */ -/* if (imod==ALLMOD) { */ -/* sMod=allSelected; */ - -/* // printf("initializing all modules\n"); */ -/* } */ - -/* if (sChan==allSelected) { */ -/* // printf("initializing all channels ft=%d coe=%d\n",ft,coe); */ -/* chanmi=0; */ -/* chanma=N_CHAN; */ -/* } else if (sChan==noneSelected || sChan>N_CHAN || sChan<0) { */ -/* // printf("initializing no channels ft=%d coe=%d\n",ft,coe); */ -/* chanmi=0; */ -/* chanma=-1; */ -/* } else { */ -/* // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); */ -/* chanmi=sChan; */ -/* chanma=sChan+1; */ -/* } */ - -/* if (sChip==allSelected) { */ -/* // printf("initializing all chips\n"); */ -/* chipmi=0; */ -/* chipma=N_CHIP; */ -/* } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { */ -/* // printf("initializing no chips\n"); */ -/* chipmi=0; */ -/* chipma=-1; */ -/* } else { */ -/* // printf("initializing chip %d\n",sChip); */ -/* chipmi=sChip; */ -/* chipma=sChip+1; */ -/* } */ - - -/* if (sMod==allSelected) { */ -/* modmi=0; */ -/* modma=nModX;//getNModBoard(); */ -/* } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { */ -/* modmi=0; */ -/* modma=-1; */ -/* return 1; */ -/* } else { */ -/* modmi=sMod; */ -/* modma=sMod+1; */ -/* } */ - -/* if (detectorChans) { */ -/* for (im=modmi; im63 || ft<0) { */ -/* fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); */ -/* return 1; */ -/* } */ -/* /\*cal_enable*\/ */ -/* if (cae) { */ -/* putout("0100000000000000",imod); */ -/* putout("0110000000000000",imod); */ -/* } else { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* } */ -/* /\*n_an_enable*\/ */ -/* if (ae) { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } else { */ -/* putout("0100000000000000",imod); */ -/* putout("0110000000000000",imod); */ -/* putout("0100000000000000",imod); */ -/* } */ -/* /\*trb5*\/ */ -/* ibit=5; */ -/* bit=ft & (1<>1; */ - /* int nchan, ichan; */ - /* int ft, cae, ae, coe, ocoe, counts, chanreg; */ - - - - /* nchan=myChip.nchan; */ - /* if (ichip<0) */ - /* setCSregister(imod); */ - /* else */ - /* selChip(ichip,imod); */ - - /* clearSSregister(imod); */ - /* for (ichan=0; ichan>(NTRIMBITS+1))&1; */ - /* ae=(chanreg>>(NTRIMBITS+2))&1; */ - /* coe=((chanreg)>>(NTRIMBITS+3))&1; */ - /* ocoe=((chanreg)>>(NTRIMBITS+4))&1; */ - /* counts=((chanreg)>>(NTRIMBITS+5)); */ - /* nextStrip(imod); */ - /* initChannel(ft,cae,ae, coe, ocoe, counts,imod); */ - /* } */ - /* initChip(obe,ow,imod); */ - return myChip.reg; - -} - -int getChipbyNumber(sls_detector_chip* myChip){ - /* int imod, ichip; */ - /* imod=myChip->module; */ - /* ichip=myChip->chip; */ - - /* if (detectorChips) { */ - /* if (imodnchip) { */ - /* myChip->reg=detectorChips[ichip+imod*N_CHIP]; */ - /* myChip->nchan=N_CHAN; */ - /* myChip->chanregs=detectorChans+imod*N_CHAN*N_CHIP+ichip*N_CHIP; */ - /* return OK; */ - /* } */ - /* } */ - return FAIL; - -} - - - -int initChip(int obe, int ow,int imod){ - /* int i; */ - /* int im, ichip; */ - /* int chipmi, chipma, modmi, modma; */ - /* switch (ow) { - case 0:; - case 1: - setDynamicRange(32); - break; - case 2: - setDynamicRange(16); - break; - case 3: - setDynamicRange(8); - break; - case 4: - setDynamicRange(4); - break; - case 5: - setDynamicRange(1); - break; - default: - setDynamicRange(32); - break; - } - */ - -/* #ifdef DEBUGOUT */ -/* printf("Initializing chip\n"); */ -/* #endif */ -/* putout("0000000000000000",imod); */ -/* #ifdef DEBUGOUT */ -/* printf("Output mode= %d\n", ow); */ -/* #endif */ - -/* /\* clearing shift in register *\/ */ -/* for (i=0; i<10; i++) */ -/* putout("0000100000000000",imod); */ -/* putout("0000000000000000",imod); */ - -/* if (ow>0) { */ -/* putout("0100000000000000",imod); */ -/* putout("0110000000000000",imod); */ -/* putout("0100000000000000",imod); */ -/* for (i=0; i<(OUTMUX_OFFSET-1); i++) { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } */ -/* if (ow>1) { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } */ -/* if (ow>2) { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } */ -/* if (ow>3) { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } */ -/* if (ow>4) { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } */ -/* } */ -/* #ifdef DEBUGOUT */ -/* printf("Output buffer enable= %d\n", obe); */ -/* #endif */ -/* if (obe) { */ -/* putout("0100000000000000",imod); */ -/* putout("0110000000000000",imod); */ -/* putout("0100000000000000",imod); */ -/* } else { */ -/* putout("0000000000000000",imod); */ -/* putout("0010000000000000",imod); */ -/* putout("0000000000000000",imod); */ -/* } */ -/* /\*}*\/ */ -/* putout("0000000000000000",imod); */ - - - - - -/* sMod=imod; */ -/* if (imod==ALLMOD) */ -/* sMod=allSelected; */ - - -/* if (sChip==allSelected) { */ -/* chipmi=0; */ -/* chipma=N_CHIP; */ -/* } else if (sChip==noneSelected || sChip>N_CHIP || sChip<0) { */ -/* chipmi=0; */ -/* chipma=-1; */ -/* } else { */ -/* chipmi=sChip; */ -/* chipma=sChip+1; */ -/* } */ - - -/* if (sMod==allSelected) { */ -/* modmi=0; */ -/* modma=nModX;//getNModBoard(); */ -/* } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { */ -/* modmi=0; */ -/* modma=-1; */ -/* } else { */ -/* modmi=sMod; */ -/* modma=sMod+1; */ -/* } */ - -/* if (detectorChips) { */ -/* for (im=modmi; imN_CHIP || sChip<0) { */ -/* chipmi=0; */ -/* chipma=-1; */ -/* } else { */ -/* chipmi=sChip; */ -/* chipma=sChip+1; */ -/* } */ - - -/* if (sMod==allSelected) { */ -/* modmi=0; */ -/* modma=nModX;//getNModBoard(); */ -/* } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { */ -/* modmi=0; */ -/* modma=-1; */ -/* } else { */ -/* modmi=sMod; */ -/* modma=sMod+1; */ -/* } */ - -/* if (detectorChips) { */ -/* for (im=modmi; imnModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorModules) { - for (im=modmi; imreg)=cm; -#ifdef VERBOSE - printf("imod=%d reg=%d (%x)\n",im,(detectorModules+im)->reg,(unsigned int)((detectorModules+im))); -#endif - } - } - return 0; -} - -int initModulebyNumber(sls_detector_module myMod) { - - printf("\ninside initmoduleynumberrrr..\n"); - printf("000\n"); - int nchip,nchan;//int ichip, nchip, ichan, nchan; - int im, modmi,modma; - // int ft, cae, ae, coe, ocoe, counts, chanreg; - int imod; - // int obe; - // int ow; - /* int v[N_DAC];*/ - int retval =-1, idac; - - - nchip=myMod.nchip; - nchan=(myMod.nchan)/nchip; - - imod=myMod.module; - sMod=imod; - - if (sMod==ALLMOD) - sMod=allSelected; - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {// (sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - printf("222\n"); - /* - for (idac=0; idacmodule; -#ifdef VERBOSE - printf("Getting module %d\n",imod); -#endif - if (detectorModules) { - copyModule(myMod,detectorModules+imod); - ; - } else - return FAIL; - - return OK; -} - -/* To chips */ -int clearCounter(int imod){ - int i; -#ifdef DEBUG - printf("Clearing counter with contclear\n"); -#endif - putout("0000000000000000",imod); - for (i=0; i<10; i++) - putout("0000000000010000",imod); - putout("0000000000000000",imod); - - return 0; -} - -int clearOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Clearing output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0000110000000000",imod); - putout("0000010000000000",imod); - return 0; -} -int setOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Setting output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0001010000000000",imod); - putout("0000010000000000",imod); - return 0; -} - - -int extPulse(int ncal, int imod) { - int ical; -#ifdef DEBUG - printf("Giving a clock pulse to the counter\n"); -#endif - for (ical=0; ical0 && i%2==0) { - printf("Shift in: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<0 && (dum & (1<0) { - printf("Shift out: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, (dum &1<0 && i%2==0) { - printf("Shift stsel: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<> 1; - - - putout("0000000000000000",ALLMOD); - putout("0010000000000000",ALLMOD); //change mux setting - putout("0000000000000000",ALLMOD); - } - - printf("Test FpgaMux module %d : %d errors\n", imod,result); - if (result) - return 1; - else - return 0; -} - - - - - - - - - -int calibration_sensor(int num, int *v, int *dacs) { - int ich, ichip, imod; - int val[10]; - - - printf("calibrating sensor..."); - for (imod=0; imod=0){ */ - -/* //clear rois */ -/* for(i=0;i=0) && (adc<=4)); */ -/* else { */ -/* printf("warning:adc value greater than 5. deleting roi\n"); */ -/* adc=-1; */ -/* } */ -/* } */ -/* } */ - - -/* //set rois for just 1 adc - take only 1st roi */ -/* if(adc!=-1){ */ -/* rois[0].xmin=adc*(GOTTHARDNCHAN*NCHIPS_PER_ADC); */ -/* rois[0].xmax=(adc+1)*(GOTTHARDNCHAN*NCHIPS_PER_ADC)-1; */ -/* rois[0].ymin=-1; */ -/* rois[0].ymax=-1; */ -/* nROI = 1; */ -/* }else */ -/* nROI = 0; */ - -/* if((arg[0].xmin!=rois[0].xmin)||(arg[0].xmax!=rois[0].xmax)||(arg[0].ymin!=rois[0].ymin)||(arg[0].ymax!=rois[0].ymax)) */ -/* *ret=FAIL; */ -/* if(n!=nROI) */ -/* *ret=FAIL; */ - -/* //set adc of interest */ -/* setADC(adc); */ -/* } */ - -/* //#ifdef VERBOSE */ -/* printf("Rois:\n"); */ -/* for( i=0;i /sys/class/gpio/export -echo 9 > /sys/class/gpio/export -echo in > /sys/class/gpio/gpio7/direction -echo out > /sys/class/gpio/gpio9/direction - - -echo 0 > /sys/class/gpio/gpio9/value - - -flash_eraseall /dev/mtd3 -cat /mnt/$f > /dev/mtd3 - -echo 1 > /sys/class/gpio/gpio9/value -cat /sys/class/gpio/gpio7/value - diff --git a/slsDetectorSoftware/jctbDetectorServer/registers_m.h b/slsDetectorSoftware/jctbDetectorServer/registers_m.h deleted file mode 100644 index 996d50cbc..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/registers_m.h +++ /dev/null @@ -1,551 +0,0 @@ -#ifndef REGISTERS_G_H -#define REGISTERS_G_H - - -#include "sls_detector_defs.h" - - -/* Definitions for FPGA*/ -#define CSP0 0x20200000 -#define MEM_SIZE 0x100000 - - - -/* values defined for FPGA */ -#define MCSNUM 0x0 -#define FIXED_PATT_VAL 0xacdc1980 - - -#define FPGA_INIT_PAT 0x60008 -#define FPGA_INIT_ADDR 0xb0000000 - -//#ifdef JUNGFRAU_DHANYA -#define POWER_ON_REG 0x5e << MEM_MAP_SHIFT -// Pwr_I2C_SDA <= PowerReg_s(1) when PowerReg_s(3)='1' else 'Z'; -// Pwr_I2C_SCL <= PowerReg_s(0) when PowerReg_s(2)='1' else 'Z'; - -#define PWR_I2C_SCL_BIT 0 -#define PWR_I2C_SDA_BIT 1 -#define PWR_I2C_SCL_EN_BIT 2 -#define PWR_I2C_SDA_EN_BIT 3 - -#define POWER_STATUS_REG 41 << MEM_MAP_SHIFT - -#define ADCREG1 0x08 -#define ADCREG2 0x14//20 -#define ADCREG3 0x4 -#define ADCREG4 0x5 -#define ADCREG_VREFS 24 -#define DBIT_PIPELINE_REG 89 << MEM_MAP_SHIFT //0x59 same PATTERN_N_LOOP2_REG -#define MEM_MACHINE_FIFOS_REG 79 << MEM_MAP_SHIFT //from gotthard -#define CONFGAIN_REG 93 << MEM_MAP_SHIFT //from gotthard -#define ADC_PIPELINE_REG 66 << MEM_MAP_SHIFT //0x42 same as ADC_OFFSET_REG -//#endif - -//#define ADC_OFFSET_REG 93 << MEM_MAP_SHIFT //same as DAQ_REG -#define ADC_INVERSION_REG 67 << MEM_MAP_SHIFT - -#define DAC_REG 64 << MEM_MAP_SHIFT//0x17 << MEM_MAP_SHIFT// control the dacs -//ADC -#define ADC_WRITE_REG 65 << MEM_MAP_SHIFT//0x18 << MEM_MAP_SHIFT -//#define ADC_SYNC_REG 66 << MEM_MAP_SHIFT//0x19 << MEM_MAP_SHIFT -//#define HV_REG 67 << MEM_MAP_SHIFT//0x20 << MEM_MAP_SHIFT - - - - -//#define MUTIME_REG 0x1a << MEM_MAP_SHIFT -//temperature -#define TEMP_IN_REG 0x1b << MEM_MAP_SHIFT -#define TEMP_OUT_REG 0x1c << MEM_MAP_SHIFT -//configure MAC -#define TSE_CONF_REG 0x1d << MEM_MAP_SHIFT -#define ENET_CONF_REG 0x1e << MEM_MAP_SHIFT -//#define WRTSE_SHAD_REG 0x1f << MEM_MAP_SHIFT -//HV - - -#define DUMMY_REG 68 << MEM_MAP_SHIFT//0x21 << MEM_MAP_SHIFT -#define FPGA_VERSION_REG 0 << MEM_MAP_SHIFT //0x22 << MEM_MAP_SHIFT -#define PCB_REV_REG 0 << MEM_MAP_SHIFT -#define FIX_PATT_REG 1 << MEM_MAP_SHIFT //0x23 << MEM_MAP_SHIFT -#define CONTROL_REG 79 << MEM_MAP_SHIFT//0x24 << MEM_MAP_SHIFT -#define STATUS_REG 2 << MEM_MAP_SHIFT //0x25 << MEM_MAP_SHIFT -#define CONFIG_REG 77 << MEM_MAP_SHIFT//0x26 << MEM_MAP_SHIFT -#define EXT_SIGNAL_REG 78 << MEM_MAP_SHIFT// 0x27 << MEM_MAP_SHIFT -//#define FPGA_SVN_REG 0x29 << MEM_MAP_SHIFT - - -#define CHIP_OF_INTRST_REG 0x2A << MEM_MAP_SHIFT - -//FIFO -#define LOOK_AT_ME_REG 3 << MEM_MAP_SHIFT //0x28 << MEM_MAP_SHIFT -#define SYSTEM_STATUS_REG 4 << MEM_MAP_SHIFT - -#define FIFO_DATA_REG 6 << MEM_MAP_SHIFT -#define FIFO_STATUS_REG 7 << MEM_MAP_SHIFT - -// constant FifoDigitalInReg_c : integer := 60; -#define FIFO_DIGITAL_DATA_LSB_REG 60 << MEM_MAP_SHIFT -#define FIFO_DIGITAL_DATA_MSB_REG 61 << MEM_MAP_SHIFT - -#define FIFO_DATA_REG_OFF 0x50 << MEM_MAP_SHIFT /////// -//to read back dac registers -//#define MOD_DACS1_REG 0x65 << MEM_MAP_SHIFT -//#define MOD_DACS2_REG 0x66 << MEM_MAP_SHIFT -//#define MOD_DACS3_REG 0x67 << MEM_MAP_SHIFT - -//user entered - - - - - - -#define GET_ACTUAL_TIME_LSB_REG 16 << MEM_MAP_SHIFT -#define GET_ACTUAL_TIME_MSB_REG 17 << MEM_MAP_SHIFT - -#define GET_MEASUREMENT_TIME_LSB_REG 38 << MEM_MAP_SHIFT -#define GET_MEASUREMENT_TIME_MSB_REG 39 << MEM_MAP_SHIFT - - -#define SET_DELAY_LSB_REG 96 << MEM_MAP_SHIFT //0x68 << MEM_MAP_SHIFT -#define SET_DELAY_MSB_REG 97 << MEM_MAP_SHIFT //0x69 << MEM_MAP_SHIFT -#define GET_DELAY_LSB_REG 18 << MEM_MAP_SHIFT//0x6a << MEM_MAP_SHIFT -#define GET_DELAY_MSB_REG 19 << MEM_MAP_SHIFT//0x6b << MEM_MAP_SHIFT - -#define SET_CYCLES_LSB_REG 98 << MEM_MAP_SHIFT//0x6c << MEM_MAP_SHIFT -#define SET_CYCLES_MSB_REG 99 << MEM_MAP_SHIFT//0x6d << MEM_MAP_SHIFT -#define GET_CYCLES_LSB_REG 20 << MEM_MAP_SHIFT//0x6e << MEM_MAP_SHIFT -#define GET_CYCLES_MSB_REG 21 << MEM_MAP_SHIFT//0x6f << MEM_MAP_SHIFT - -#define SET_FRAMES_LSB_REG 100 << MEM_MAP_SHIFT//0x70 << MEM_MAP_SHIFT -#define SET_FRAMES_MSB_REG 101 << MEM_MAP_SHIFT//0x71 << MEM_MAP_SHIFT -#define GET_FRAMES_LSB_REG 22 << MEM_MAP_SHIFT//0x72 << MEM_MAP_SHIFT -#define GET_FRAMES_MSB_REG 23 << MEM_MAP_SHIFT//0x73 << MEM_MAP_SHIFT - -#define SET_PERIOD_LSB_REG 102 << MEM_MAP_SHIFT//0x74 << MEM_MAP_SHIFT -#define SET_PERIOD_MSB_REG 103 << MEM_MAP_SHIFT//0x75 << MEM_MAP_SHIFT -#define GET_PERIOD_LSB_REG 24 << MEM_MAP_SHIFT//0x76 << MEM_MAP_SHIFT -#define GET_PERIOD_MSB_REG 25 << MEM_MAP_SHIFT//0x77 << MEM_MAP_SHIFT - -//#define PATTERN_WAIT0_TIME_REG_LSB 114 << MEM_MAP_SHIFT -//#define PATTERN_WAIT0_TIME_REG_MSB 115 << MEM_MAP_SHIFT -#define SET_EXPTIME_LSB_REG 114 << MEM_MAP_SHIFT//0x78 << MEM_MAP_SHIFT -#define SET_EXPTIME_MSB_REG 115 << MEM_MAP_SHIFT//0x79 << MEM_MAP_SHIFT -#define GET_EXPTIME_LSB_REG 26 << MEM_MAP_SHIFT//0x7a << MEM_MAP_SHIFT -#define GET_EXPTIME_MSB_REG 27 << MEM_MAP_SHIFT//0x7b << MEM_MAP_SHIFT - -#define SET_GATES_LSB_REG 106 << MEM_MAP_SHIFT//0x7c << MEM_MAP_SHIFT -#define SET_GATES_MSB_REG 107 << MEM_MAP_SHIFT//0x7d << MEM_MAP_SHIFT -#define GET_GATES_LSB_REG 28 << MEM_MAP_SHIFT//0x7e << MEM_MAP_SHIFT -#define GET_GATES_MSB_REG 29 << MEM_MAP_SHIFT//0x7f << MEM_MAP_SHIFT - -#define DATA_IN_LSB_REG 30 << MEM_MAP_SHIFT -#define DATA_IN_MSB_REG 31 << MEM_MAP_SHIFT - -#define PATTERN_OUT_LSB_REG 32 << MEM_MAP_SHIFT -#define PATTERN_OUT_MSB_REG 33 << MEM_MAP_SHIFT - -#define FRAMES_FROM_START_LSB_REG 34 << MEM_MAP_SHIFT -#define FRAMES_FROM_START_MSB_REG 35 << MEM_MAP_SHIFT - -#define FRAMES_FROM_START_PG_LSB_REG 36 << MEM_MAP_SHIFT -#define FRAMES_FROM_START_PG_MSB_REG 37 << MEM_MAP_SHIFT - -#define SLOW_ADC_REG 43 << MEM_MAP_SHIFT - - - -#define PLL_PARAM_REG 80 << MEM_MAP_SHIFT//0x37 << MEM_MAP_SHIFT -#define PLL_PARAM_OUT_REG 5 << MEM_MAP_SHIFT //0x38 << MEM_MAP_SHIFT -#define PLL_CNTRL_REG 81 << MEM_MAP_SHIFT//0x34 << MEM_MAP_SHIFT - - -#ifdef NEW_GBE_INTERFACE -#define GBE_PARAM_OUT_REG 40 << MEM_MAP_SHIFT -#define GBE_PARAM_REG 69 << MEM_MAP_SHIFT -#define GBE_CNTRL_REG 70 << MEM_MAP_SHIFT -#else -#define RX_UDP_AREG 69 << MEM_MAP_SHIFT //rx_udpip_AReg_c : integer:= 69; *\/ -#define UDPPORTS_AREG 70 << MEM_MAP_SHIFT// udpports_AReg_c : integer:= 70; *\/ -#define RX_UDPMACL_AREG 71 << MEM_MAP_SHIFT//rx_udpmacL_AReg_c : integer:= 71; *\/ -#define RX_UDPMACH_AREG 72 << MEM_MAP_SHIFT//rx_udpmacH_AReg_c : integer:= 72; *\/ -#define DETECTORMACL_AREG 73 << MEM_MAP_SHIFT//detectormacL_AReg_c : integer:= 73; *\/ -#define DETECTORMACH_AREG 74 << MEM_MAP_SHIFT//detectormacH_AReg_c : integer:= 74; *\/ -#define DETECTORIP_AREG 75 << MEM_MAP_SHIFT//detectorip_AReg_c : integer:= 75; *\/ -#define IPCHKSUM_AREG 76 << MEM_MAP_SHIFT//ipchksum_AReg_c : integer:= 76; *\/ */ -#endif - - -#define PATTERN_CNTRL_REG 82 << MEM_MAP_SHIFT -#define PATTERN_LIMITS_AREG 83 << MEM_MAP_SHIFT - -#define PATTERN_LOOP0_AREG 84 << MEM_MAP_SHIFT -#define PATTERN_N_LOOP0_REG 85 << MEM_MAP_SHIFT - -#define PATTERN_LOOP1_AREG 86 << MEM_MAP_SHIFT -#define PATTERN_N_LOOP1_REG 87 << MEM_MAP_SHIFT - -#define PATTERN_LOOP2_AREG 88 << MEM_MAP_SHIFT -#define PATTERN_N_LOOP2_REG 89 << MEM_MAP_SHIFT - -#define PATTERN_WAIT0_AREG 90 << MEM_MAP_SHIFT -#define PATTERN_WAIT1_AREG 91 << MEM_MAP_SHIFT -#define PATTERN_WAIT2_AREG 92 << MEM_MAP_SHIFT - - - -//#define DAQ_REG 93 << MEM_MAP_SHIFT //unused -#define NSAMPLES_REG 93 << MEM_MAP_SHIFT - - -#define HV_REG 95 << MEM_MAP_SHIFT - - - -#define PATTERN_IOCTRL_REG_LSB 108 << MEM_MAP_SHIFT -#define PATTERN_IOCTRL_REG_MSB 109 << MEM_MAP_SHIFT - -#define PATTERN_IOCLKCTRL_REG_LSB 110 << MEM_MAP_SHIFT -#define PATTERN_IOCLKCTRL_REG_MSB 111 << MEM_MAP_SHIFT -#define PATTERN_IN_REG_LSB 112 << MEM_MAP_SHIFT -#define PATTERN_IN_REG_MSB 113 << MEM_MAP_SHIFT -#define PATTERN_WAIT0_TIME_REG_LSB 114 << MEM_MAP_SHIFT -#define PATTERN_WAIT0_TIME_REG_MSB 115 << MEM_MAP_SHIFT -#define PATTERN_WAIT1_TIME_REG_LSB 116 << MEM_MAP_SHIFT -#define PATTERN_WAIT1_TIME_REG_MSB 117 << MEM_MAP_SHIFT -#define PATTERN_WAIT2_TIME_REG_LSB 118 << MEM_MAP_SHIFT -#define PATTERN_WAIT2_TIME_REG_MSB 119 << MEM_MAP_SHIFT - -//#define DAC_REG_OFF 120 -//#define DAC_0_1_VAL_REG 120 << MEM_MAP_SHIFT -//#define DAC_2_3_VAL_REG 121 << MEM_MAP_SHIFT -//#define DAC_4_5_VAL_REG 122 << MEM_MAP_SHIFT -//#define DAC_6_7_VAL_REG 123 << MEM_MAP_SHIFT -//#define DAC_8_9_VAL_REG 124 << MEM_MAP_SHIFT -//#define DAC_10_11_VAL_REG 125 << MEM_MAP_SHIFT -//#define DAC_12_13_VAL_REG 126 << MEM_MAP_SHIFT -//#define DAC_14_15_VAL_REG 127 << MEM_MAP_SHIFT -#define DAC_VAL_REG 121 << MEM_MAP_SHIFT -#define DAC_NUM_REG 122 << MEM_MAP_SHIFT -#define DAC_VAL_OUT_REG 42 << MEM_MAP_SHIFT -#define ADC_LATCH_DISABLE_REG 120 << MEM_MAP_SHIFT - - - - - - - - -/* registers defined in FPGA */ -#define GAIN_REG 0 -//#define FLOW_CONTROL_REG 0x11 << MEM_MAP_SHIFT -//#define FLOW_STATUS_REG 0x12 << MEM_MAP_SHIFT -//#define FRAME_REG 0x13 << MEM_MAP_SHIFT -#define MULTI_PURPOSE_REG 0 -//#define TIME_FROM_START_REG 0x16 << MEM_MAP_SHIFT - - -#define ROI_REG 0 // 0x35 << MEM_MAP_SHIFT -#define OVERSAMPLING_REG 0 // 0x36 << MEM_MAP_SHIFT -#define MOENCH_CNTR_REG 0 // 0x31 << MEM_MAP_SHIFT -#define MOENCH_CNTR_OUT_REG 0 // 0x33 << MEM_MAP_SHIFT -#define MOENCH_CNTR_CONF_REG 0 // 0x32 << MEM_MAP_SHIFT - - - -//image -#define DARK_IMAGE_REG 0 // 0x81 << MEM_MAP_SHIFT -#define GAIN_IMAGE_REG 0 // 0x82 << MEM_MAP_SHIFT - -//counter block memory -#define COUNTER_MEMORY_REG 0 // 0x85 << MEM_MAP_SHIFT - - -//not used -//#define MCB_DOUT_REG_OFF 0 // 0x200000 -//#define FIFO_CNTRL_REG_OFF 0 // 0x300000 -//#define FIFO_COUNTR_REG_OFF 0 // 0x400000 -//not used so far -//#define SPEED_REG 0 // 0x006000 -//#define SET_NBITS_REG 0 // 0x008000 -//not used -//#define GET_SHIFT_IN_REG 0 // 0x022000 - - - -#define SHIFTMOD 2 -#define SHIFTFIFO 9 - -/** for PCB_REV_REG */ -#define DETECTOR_TYPE_MASK 0xFF000000 -#define DETECTOR_TYPE_OFFSET 24 -#define BOARD_REVISION_MASK 0xFFFFFF -#define MOENCH03_MODULE_ID 2 -#define JUNGFRAU_MODULE_ID 1 -#define JUNGFRAU_CTB_ID 3 - - - - -/* for control register (16bit only)*/ -#define START_ACQ_BIT 0x0001 -#define STOP_ACQ_BIT 0x0002 -#define START_FIFOTEST_BIT 0x0004 // ????? -#define STOP_FIFOTEST_BIT 0x0008 // ?????? -#define START_READOUT_BIT 0x0010 -#define STOP_READOUT_BIT 0x0020 -#define START_EXPOSURE_BIT 0x0040 -#define STOP_EXPOSURE_BIT 0x0080 -#define START_TRAIN_BIT 0x0100 -#define STOP_TRAIN_BIT 0x0200 -#define FIFO_RESET_BIT 0x8000 -#define SYNC_RESET 0x0400 -#define GB10_RESET_BIT 0x0800 -#define MEM_RESET_BIT 0x1000 - -/* for status register */ -#define RUN_BUSY_BIT 0x00000001 -#define READOUT_BUSY_BIT 0x00000002 -#define FIFOTEST_BUSY_BIT 0x00000004 //???? -#define WAITING_FOR_TRIGGER_BIT 0x00000008 -#define DELAYBEFORE_BIT 0x00000010 -#define DELAYAFTER_BIT 0x00000020 -#define EXPOSING_BIT 0x00000040 -#define COUNT_ENABLE_BIT 0x00000080 -#define READSTATE_0_BIT 0x00000100 -#define READSTATE_1_BIT 0x00000200 -#define READSTATE_2_BIT 0x00000400 -#define LAM_BIT 0x00000400 // error! -#define SOME_FIFO_FULL_BIT 0x00000800 // error! - - - -#define RUNSTATE_0_BIT 0x00001000 -#define RUNSTATE_1_BIT 0x00002000 -#define RUNSTATE_2_BIT 0x00004000 -#define STOPPED_BIT 0x00008000 // stopped! -#define ALL_FIFO_EMPTY_BIT 0x00010000 // data ready -#define RUNMACHINE_BUSY_BIT 0x00020000 -#define READMACHINE_BUSY_BIT 0x00040000 -#define PLL_RECONFIG_BUSY 0x00100000 - - - -/* for fifo status register */ -#define FIFO_ENABLED_BIT 0x80000000 -#define FIFO_DISABLED_BIT 0x01000000 -#define FIFO_ERROR_BIT 0x08000000 -#define FIFO_EMPTY_BIT 0x04000000 -#define FIFO_DATA_READY_BIT 0x02000000 -#define FIFO_COUNTER_MASK 0x000001ff -#define FIFO_NM_MASK 0x00e00000 -#define FIFO_NM_OFF 21 -#define FIFO_NC_MASK 0x001ffe00 -#define FIFO_NC_OFF 9 - -/* for config register *///not really used yet -#define TOT_ENABLE_BIT 0x00000002 -#define TIMED_GATE_BIT 0x00000004 -#define CONT_RO_ENABLE_BIT 0x00080000 -#define GB10_NOT_CPU_BIT 0x00001000 -#define ADC_OUTPUT_DISABLE_BIT 0x00100 -#define DIGITAL_OUTPUT_ENABLE_BIT 0x00200 - - -/* for speed register */ -#define CLK_DIVIDER_MASK 0x000000ff -#define CLK_DIVIDER_OFFSET 0 -#define SET_LENGTH_MASK 0x00000f00 -#define SET_LENGTH_OFFSET 8 -#define WAIT_STATES_MASK 0x0000f000 -#define WAIT_STATES_OFFSET 12 -#define TOTCLK_DIVIDER_MASK 0xff000000 -#define TOTCLK_DIVIDER_OFFSET 24 -#define TOTCLK_DUTYCYCLE_MASK 0x00ff0000 -#define TOTCLK_DUTYCYCLE_OFFSET 16 - -/* for external signal register */ -#define SIGNAL_OFFSET 4 -#define SIGNAL_MASK 0xF -#define EXT_SIG_OFF 0x0 -#define EXT_GATE_IN_ACTIVEHIGH 0x1 -#define EXT_GATE_IN_ACTIVELOW 0x2 -#define EXT_TRIG_IN_RISING 0x3 -#define EXT_TRIG_IN_FALLING 0x4 -#define EXT_RO_TRIG_IN_RISING 0x5 -#define EXT_RO_TRIG_IN_FALLING 0x6 -#define EXT_GATE_OUT_ACTIVEHIGH 0x7 -#define EXT_GATE_OUT_ACTIVELOW 0x8 -#define EXT_TRIG_OUT_RISING 0x9 -#define EXT_TRIG_OUT_FALLING 0xA -#define EXT_RO_TRIG_OUT_RISING 0xB -#define EXT_RO_TRIG_OUT_FALLING 0xC - - - -/* for temperature register */ -#define T1_CLK_BIT 0x00000001 -#define T1_CS_BIT 0x00000002 -#define T2_CLK_BIT 0x00000004 -#define T2_CS_BIT 0x00000008 - - - -/* fifo control register */ -//#define FIFO_RESET_BIT 0x00000001 -//#define FIFO_DISABLE_TOGGLE_BIT 0x00000002 - - -//chip shiftin register meaning -#define OUTMUX_OFF 20 -#define OUTMUX_MASK 0x1f -#define PROBES_OFF 4 -#define PROBES_MASK 0x7f -#define OUTBUF_OFF 0 -#define OUTBUF_MASK 1 - - -/* multi purpose register */ -#define PHASE_STEP_BIT 0x00000001 -#define PHASE_STEP_OFFSET 0 -// #define xxx_BIT 0x00000002 -#define RESET_COUNTER_BIT 0x00000004 -#define RESET_COUNTER_OFFSET 2 -//#define xxx_BIT 0x00000008 -//#define xxx_BIT 0x00000010 -#define SW1_BIT 0x00000020 -#define SW1_OFFSET 5 -#define WRITE_BACK_BIT 0x00000040 -#define WRITE_BACK_OFFSET 6 -#define RESET_BIT 0x00000080 -#define RESET_OFFSET 7 -#define ENET_RESETN_BIT 0x00000800 -#define ENET_RESETN_OFFSET 11 -#define INT_RSTN_BIT 0x00002000 -#define INT_RSTN_OFFSET 13 -#define DIGITAL_TEST_BIT 0x00004000 -#define DIGITAL_TEST_OFFSET 14 -//#define CHANGE_AT_POWER_ON_BIT 0x00008000 -//#define CHANGE_AT_POWER_ON_OFFSET 15 - - -/* settings/conf gain register */ -#define GAIN_MASK 0x0000000f -#define GAIN_OFFSET 0 -#define SETTINGS_MASK 0x000000f0 -#define SETTINGS_OFFSET 4 - - -/* CHIP_OF_INTRST_REG */ -#define CHANNEL_MASK 0xffff0000 -#define CHANNEL_OFFSET 16 -#define ACTIVE_ADC_MASK 0x0000001f - - - -/**ADC SYNC CLEAN FIFO*/ -#define ADCSYNC_CLEAN_FIFO_BITS 0x300000 -#define CLEAN_FIFO_MASK 0x0fffff - - - - -enum {run_clk_c, adc_clk_c, sync_clk_c, dbit_clk_c}; - - - - -#define PLL_CNTR_ADDR_OFF 16 //PLL_CNTR_REG bits 21 downto 16 represent the counter address - -#define PLL_CNTR_RECONFIG_RESET_BIT 0 -#define PLL_CNTR_READ_BIT 1 -#define PLL_CNTR_WRITE_BIT 2 -#define PLL_CNTR_PLL_RESET_BIT 3 - - -#define PLL_CNTR_PHASE_EN_BIT 8 -#define PLL_CNTR_UPDN_BIT 9 -#define PLL_CNTR_CNTSEL_OFF 10 - - - - - -#define PLL_MODE_REG 0x0 -#define PLL_STATUS_REG 0x1 -#define PLL_START_REG 0x2 -#define PLL_N_COUNTER_REG 0x3 -#define PLL_M_COUNTER_REG 0x4 -#define PLL_C_COUNTER_REG 0x5 //which ccounter stands in param 22:18; 7:0 lowcount 15:8 highcount; 16 bypassenable; 17 oddivision -#define PLL_PHASE_SHIFT_REG 0x6 // which ccounter stands in param 16:20; 21 updown (1 up, 0 down) -#define PLL_K_COUNTER_REG 0x7 -#define PLL_BANDWIDTH_REG 0x8 -#define PLL_CHARGEPUMP_REG 0x9 -#define PLL_VCO_DIV_REG 0x1c -#define PLL_MIF_REG 0x1f - -#define PPL_M_CNT_PARAM_DEFAULT 0x4040 -#define PPL_N_CNT_PARAM_DEFAULT 0x20D0C -#define PPL_C0_CNT_PARAM_DEFAULT 0x20D0C -#define PPL_C1_CNT_PARAM_DEFAULT 0xA0A0 -#define PPL_C2_CNT_PARAM_DEFAULT 0x20D0C -#define PPL_C3_CNT_PARAM_DEFAULT 0x0808 -#define PPL_BW_PARAM_DEFAULT 0x2EE0 -#define PPL_VCO_PARAM_DEFAULT 0x1 - -#define NEW_PLL_RECONFIG - -#ifdef NEW_PLL_RECONFIG -#define PLL_VCO_FREQ_MHZ 400//480//800 -#else -#define PLL_VCO_FREQ_MHZ 480//800 -#endif - - - - - -/* - GBE parameter and control registers definitions -*/ - -#define GBE_CTRL_WSTROBE 0 -#define GBE_CTRL_VAR_OFFSET 16 -#define GBE_CTRL_VAR_MASK 0XF -#define GBE_CTRL_RAMADDR_OFFSET 24 -#define GBE_CTRL_RAMADDR_MASK 0X3F -#define GBE_CTRL_INTERFACE 23 - -#define RX_UDP_IP_ADDR 0 -#define RX_UDP_PORTS_ADDR 1 -#define RX_UDP_MAC_L_ADDR 2 -#define RX_UDP_MAC_H_ADDR 3 -#define IPCHECKSUM_ADDR 4 -#define GBE_DELAY_ADDR 5 -#define GBE_RESERVED1_ADDR 6 -#define GBE_RESERVED2_ADDR 7 -#define DETECTOR_MAC_L_ADDR 8 -#define DETECTOR_MAC_H_ADDR 9 -#define DETECTOR_IP_ADDR 10 - - - -/**------------------ --- pattern registers definitions ---------------------------------------------- */ -#define IOSIGNALS_MASK 0xfffffffffffff -#define ADC_ENABLE_BIT 63 -#define APATTERN_MASK 0xffff -#define ASTART_OFFSET 0 -#define ASTOP_OFFSET 16 -#define PATTERN_CTRL_WRITE_BIT 0 -#define PATTERN_CTRL_READ_BIT 1 -#define PATTERN_CTRL_ADDR_OFFSET 16 -#define MAX_PATTERN_LENGTH 1024 - - -#endif - diff --git a/slsDetectorSoftware/jctbDetectorServer/server.c b/slsDetectorSoftware/jctbDetectorServer/server.c deleted file mode 100755 index e3c8e4334..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/server.c +++ /dev/null @@ -1,139 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ - -#include "sls_detector_defs.h" - -#include -#include "communication_funcs.h" -#include "server_funcs.h" -#include - - - -extern int sockfd; -extern int phase_shift; - - - -void error(char *msg) -{ - perror(msg); -} - -int main(int argc, char *argv[]) -{ - int portno, b; - char cmd[500]; - int retval=OK; - int sd, fd; - int iarg; - int checkType = 1; - - - for(iarg=1; iarg 2) && (!strcasecmp(argv[2],"stopserver"))){ - portno = DEFAULT_PORTNO+1; - if ( sscanf(argv[1],"%d",&portno) ==0) { - printf("could not open stop server: unknown port\n"); - return 1; - } - b=0; - printf("\n\nStop Server\nOpening stop server on port %d\n",portno); - checkType=0; - - } - - //control server - else { - portno = DEFAULT_PORTNO; - if(checkType) - sprintf(cmd,"%s %d stopserver &",argv[0],DEFAULT_PORTNO+1); - else - sprintf(cmd,"%s %d stopserver -test with_gotthard &",argv[0],DEFAULT_PORTNO+1); - printf("\n\nControl Server\nOpening control server on port %d\n",portno ); - - //printf("\n\ncmd:%s\n",cmd); - system(cmd); - b=1; - checkType=1; - - } - - - - - - init_detector(b, checkType); - - - sd=bindSocket(portno); - sockfd=sd; - if (getServerError(sd)) { - printf("server error!\n"); - return -1; - } - - /* assign function table */ - function_table(); -#ifdef VERBOSE - printf("function table assigned \n"); -#endif - - - /* waits for connection */ - while(retval!=GOODBYE) { -#ifdef VERBOSE - printf("\n"); -#endif -#ifdef VERY_VERBOSE - printf("Waiting for client call\n"); -#endif - fd=acceptConnection(sockfd); -#ifdef VERY_VERBOSE - printf("Conenction accepted\n"); -#endif - retval=decode_function(fd); -#ifdef VERY_VERBOSE - printf("function executed\n"); -#endif - closeConnection(fd); -#ifdef VERY_VERBOSE - printf("connection closed\n"); -#endif - } - - exitServer(sockfd); - printf("Goodbye!\n"); - - return 0; -} - diff --git a/slsDetectorSoftware/jctbDetectorServer/server_defs.h b/slsDetectorSoftware/jctbDetectorServer/server_defs.h deleted file mode 100755 index 07144546f..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/server_defs.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef SERVER_DEFS_H -#define SERVER_DEFS_H - -#include "sls_detector_defs.h" - -#include - - -// Hardware definitions - -#define NCHAN 36 -#define NCHIP 1 -#define NADC 9 // - -/* #ifdef CTB */ -/* #define NDAC 24 */ -/* #define NPWR 5 */ -/* #else */ -/* #define NDAC 16 */ -/* #define NPWR 0 */ -/* #endif */ -#define DAC_CMD_OFF 20 - -#define NMAXMODX 1 -#define NMAXMODY 1 -#define NMAXMOD (NMAXMODX*NMAXMODY) - -#define NCHANS (NCHAN*NCHIP*NMAXMOD) -#define NDACS (NDAC*NMAXMOD) - - -/**when moench readout tested with gotthard module*/ - -#define TRIM_DR (((int)pow(2,NTRIMBITS))-1) -#define COUNT_DR (((int)pow(2,NCOUNTBITS))-1) - - -#define ALLMOD 0xffff -#define ALLFIFO 0xffff - -#define GOTTHARD_ADCSYNC_VAL 0x32214 -#define ADCSYNC_VAL 0x02111 -#define TOKEN_RESTART_DELAY 0x88000000 -#define TOKEN_RESTART_DELAY_ROI 0x1b000000 -#define TOKEN_TIMING_REV1 0x1f16 -#define TOKEN_TIMING_REV2 0x1f0f - -#define DEFAULT_PHASE_SHIFT 0 // 120 -#define DEFAULT_IP_PACKETSIZE 0x0522 -#define DEFAULT_UDP_PACKETSIZE 0x050E -#define ADC1_IP_PACKETSIZE 256*2+14+20 -#define ADC1_UDP_PACKETSIZE 256*2+4+8+2 - -#ifdef VIRTUAL -#define DEBUGOUT -#endif - -#define CLK_FREQ 156.25E+6 -#define ADC_CLK_FREQ 32E+6 - - -#endif diff --git a/slsDetectorSoftware/jctbDetectorServer/server_funcs.c b/slsDetectorSoftware/jctbDetectorServer/server_funcs.c deleted file mode 100644 index acf839458..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/server_funcs.c +++ /dev/null @@ -1,3725 +0,0 @@ -#include "sls_detector_defs.h" -#include "sls_receiver_defs.h" -#include "server_funcs.h" -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "slow_adc.h" -#include "registers_m.h" -#include "gitInfoMoench.h" -#include "blackfin.h" - -#define FIFO_DATA_REG_OFF 0x50 << MEM_MAP_SHIFT -// Global variables - - -int (*flist[256])(int); - - - -//defined in the detector specific file -/* #ifdef MYTHEND */ -/* const enum detectorType myDetectorType=MYTHEN; */ -/* #elif GOTTHARDD */ -/* const enum detectorType myDetectorType=GOTTHARD; */ -/* #elif EIGERD */ -/* const enum detectorType myDetectorType=EIGER; */ -/* #elif PICASSOD */ -/* const enum detectorType myDetectorType=PICASSO; */ -/* #elif MOENCHD */ -/* const enum detectorType myDetectorType=MOENCH; */ -/* #else */ -enum detectorType myDetectorType=GENERIC; -/* #endif */ - - -extern int nModX; -extern int nModY; -extern int dataBytes; -extern int nSamples; -extern int dynamicRange; -extern int storeInRAM; - -extern int lockStatus; -extern char lastClientIP[INET_ADDRSTRLEN]; -extern char thisClientIP[INET_ADDRSTRLEN]; -extern int differentClients; - -/* global variables for optimized readout */ -extern unsigned int *ram_values; -char *dataretval=NULL; -int nframes, iframes, dataret; -char mess[1000]; - -int digitalTestBit = 0; - -extern int withGotthard; - - -int adcvpp=0x4; - -/** for jungfrau reinitializing macro later */ -int N_CHAN=NCHAN; -int N_CHIP=NCHIP; -int N_DAC=24; -int N_ADC=NADC; -int N_PWR=5; -int N_CHANS=NCHANS; - - -int init_detector(int b, int checkType) { - - int i; - if (mapCSP0()==FAIL) { printf("Could not map memory\n"); - exit(1); - } - - // defineGPIOpins(); - //checktype - if (checkType) { - printf("Bus test... (checktype is %d; b is %d)",checkType,b ); - for (i=0; i<1000000; i++) { - bus_w(SET_DELAY_LSB_REG, i*100); - bus_r(FPGA_VERSION_REG); - if (i*100!=bus_r(SET_DELAY_LSB_REG)) - printf("ERROR: wrote 0x%x, read 0x%x\n",i*100,bus_r(SET_DELAY_LSB_REG)); - } - printf("Finished\n"); - }else - printf("(checktype is %d; b is %d)",checkType,b ); - - - //confirm the detector type - switch ((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET) { - case MOENCH03_MODULE_ID: - myDetectorType=MOENCH; - printf("This is a MOENCH03 module %d\n",MOENCH); - N_DAC=8; - N_PWR=0; - break; - - case JUNGFRAU_MODULE_ID: - myDetectorType=JUNGFRAU; - printf("This is a Jungfrau module %d\n Not supported: exiting!", JUNGFRAU); - N_DAC=8; - N_PWR=0; - exit(1); - break; - - case JUNGFRAU_CTB_ID: - myDetectorType=JUNGFRAUCTB; - printf("This is a CTB %d\n", JUNGFRAUCTB); - N_DAC=24; - N_PWR=5; - break; - - default: - myDetectorType=GENERIC; - printf("Unknown detector type %02x\n",(bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET); - N_DAC=8; - N_PWR=0; - break; - - } - printf("Detector type is %d\n", myDetectorType); - if (b) - initDetector(); - - //common for both control and stop server - strcpy(mess,"dummy message"); - strcpy(lastClientIP,"none"); - strcpy(thisClientIP,"none1"); - lockStatus=0; - // getDynamicRange(); - - /* both these functions setROI and allocateRAM should go into the control server part. */ - - return OK; -} - - -int decode_function(int file_des) { - int fnum,n; - int retval=FAIL; -#ifdef VERBOSE - printf( "receive data\n"); -#endif - n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); - if (n <= 0) { -#ifdef VERBOSE - printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); -#endif - return FAIL; - } -#ifdef VERBOSE - else - printf("size of data received %d\n",n); -#endif - printf("calling function=%d (%s)\n", fnum, getFunctionName((enum detFuncs)fnum)); -#ifdef VERBOSE - printf( "calling function fnum = %d %x %x %x\n",fnum,(unsigned int)(flist[fnum]), (unsigned int)(flist[F_READ_REGISTER]),(unsigned int)(&read_register)); -#endif - if (fnum<0 || fnum>255) - fnum=255; - retval=(*flist[fnum])(file_des); - printf(" function=%d (%s) returned: %d\n", fnum, getFunctionName((enum detFuncs)fnum), retval); - if (retval==FAIL) - printf( "Error executing the function = %d \n",fnum); - return retval; -} - - -const char* getFunctionName(enum detFuncs func) { - switch (func) { - case F_EXEC_COMMAND: return "F_EXEC_COMMAND"; - case F_GET_ERROR: return "F_GET_ERROR"; - case F_GET_DETECTOR_TYPE: return "F_GET_DETECTOR_TYPE"; - case F_SET_NUMBER_OF_MODULES: return "F_SET_NUMBER_OF_MODULES"; - case F_GET_MAX_NUMBER_OF_MODULES: return "F_GET_MAX_NUMBER_OF_MODULES"; - case F_SET_EXTERNAL_SIGNAL_FLAG: return "F_SET_EXTERNAL_SIGNAL_FLAG"; - case F_SET_EXTERNAL_COMMUNICATION_MODE: return "F_SET_EXTERNAL_COMMUNICATION_MODE"; - case F_GET_ID: return "F_GET_ID"; - case F_DIGITAL_TEST: return "F_DIGITAL_TEST"; - case F_ANALOG_TEST: return "F_ANALOG_TEST"; - case F_ENABLE_ANALOG_OUT: return "F_ENABLE_ANALOG_OUT"; - case F_CALIBRATION_PULSE: return "F_CALIBRATION_PULSE"; - case F_SET_DAC: return "F_SET_DAC"; - case F_GET_ADC: return "F_GET_ADC"; - case F_WRITE_REGISTER: return "F_WRITE_REGISTER"; - case F_READ_REGISTER: return "F_READ_REGISTER"; - case F_WRITE_MEMORY: return "F_WRITE_MEMORY"; - case F_READ_MEMORY: return "F_READ_MEMORY"; - case F_SET_CHANNEL: return "F_SET_CHANNEL"; - case F_GET_CHANNEL: return "F_GET_CHANNEL"; - case F_SET_ALL_CHANNELS: return "F_SET_ALL_CHANNELS"; - case F_SET_CHIP: return "F_SET_CHIP"; - case F_GET_CHIP: return "F_GET_CHIP"; - case F_SET_ALL_CHIPS: return "F_SET_ALL_CHIPS"; - case F_SET_MODULE: return "F_SET_MODULE"; - case F_GET_MODULE: return "F_GET_MODULE"; - case F_SET_ALL_MODULES: return "F_SET_ALL_MODULES"; - case F_SET_SETTINGS: return "F_SET_SETTINGS"; - case F_GET_THRESHOLD_ENERGY: return "F_GET_THRESHOLD_ENERGY"; - case F_SET_THRESHOLD_ENERGY: return "F_SET_THRESHOLD_ENERGY"; - case F_START_ACQUISITION: return "F_START_ACQUISITION"; - case F_STOP_ACQUISITION: return "F_STOP_ACQUISITION"; - case F_START_READOUT: return "F_START_READOUT"; - case F_GET_RUN_STATUS: return "F_GET_RUN_STATUS"; - case F_START_AND_READ_ALL: return "F_START_AND_READ_ALL"; - case F_READ_FRAME: return "F_READ_FRAME"; - case F_READ_ALL: return "F_READ_ALL"; - case F_SET_TIMER: return "F_SET_TIMER"; - case F_GET_TIME_LEFT: return "F_GET_TIME_LEFT"; - case F_SET_DYNAMIC_RANGE: return "F_SET_DYNAMIC_RANGE"; - case F_SET_READOUT_FLAGS: return "F_SET_READOUT_FLAGS"; - case F_SET_ROI: return "F_SET_ROI"; - case F_SET_SPEED: return "F_SET_SPEED"; - case F_EXECUTE_TRIMMING: return "F_EXECUTE_TRIMMING"; - case F_EXIT_SERVER: return "F_EXIT_SERVER"; - case F_LOCK_SERVER: return "F_LOCK_SERVER"; - case F_GET_LAST_CLIENT_IP: return "F_GET_LAST_CLIENT_IP"; - case F_SET_PORT: return "F_SET_PORT"; - case F_UPDATE_CLIENT: return "F_UPDATE_CLIENT"; - case F_CONFIGURE_MAC: return "F_CONFIGURE_MAC"; - case F_LOAD_IMAGE: return "F_LOAD_IMAGE"; - case F_SET_MASTER: return "F_SET_MASTER"; - case F_SET_SYNCHRONIZATION_MODE: return "F_SET_SYNCHRONIZATION_MODE"; - case F_READ_COUNTER_BLOCK: return "F_READ_COUNTER_BLOCK"; - case F_RESET_COUNTER_BLOCK: return "F_RESET_COUNTER_BLOCK"; - case F_CALIBRATE_PEDESTAL: return "F_CALIBRATE_PEDESTAL"; - case F_ENABLE_TEN_GIGA: return "F_ENABLE_TEN_GIGA"; - case F_SET_ALL_TRIMBITS: return "F_SET_ALL_TRIMBITS"; - case F_SET_CTB_PATTERN: return "F_SET_CTB_PATTERN"; - case F_WRITE_ADC_REG: return "F_WRITE_ADC_REG"; - case F_SET_COUNTER_BIT: return "F_SET_COUNTER_BIT"; - case F_PULSE_PIXEL: return "F_PULSE_PIXEL"; - case F_PULSE_PIXEL_AND_MOVE: return "F_PULSE_PIXEL_AND_MOVE"; - case F_PULSE_CHIP: return "F_PULSE_CHIP"; - case F_SET_RATE_CORRECT: return "F_SET_RATE_CORRECT"; - case F_GET_RATE_CORRECT: return "F_GET_RATE_CORRECT"; - case F_SET_NETWORK_PARAMETER: return "F_SET_NETWORK_PARAMETER"; - case F_PROGRAM_FPGA: return "F_PROGRAM_FPGA"; - case F_RESET_FPGA: return "F_RESET_FPGA"; - case F_POWER_CHIP: return "F_POWER_CHIP"; - case F_ACTIVATE: return "F_ACTIVATE"; - case F_PREPARE_ACQUISITION: return "F_PREPARE_ACQUISITION"; - case F_CLEANUP_ACQUISITION: return "F_CLEANUP_ACQUISITION"; - default: return "Unknown Function"; - } -} - - -int function_table() { - int i; - for (i=0;i<256;i++){ - flist[i]=&M_nofunc; - } - flist[F_EXIT_SERVER]=&exit_server; - flist[F_EXEC_COMMAND]=&exec_command; - flist[F_GET_DETECTOR_TYPE]=&get_detector_type; - flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; - flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; - flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; - flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; - flist[F_GET_ID]=&get_id; - flist[F_DIGITAL_TEST]=&digital_test; - flist[F_WRITE_REGISTER]=&write_register; - flist[F_READ_REGISTER]=&read_register; - flist[F_SET_DAC]=&set_dac; - flist[F_GET_ADC]=&get_adc; - flist[F_SET_CHANNEL]=&set_channel; - flist[F_SET_CHIP]=&set_chip; - flist[F_SET_MODULE]=&set_module; - flist[F_GET_CHANNEL]=&get_channel; - flist[F_GET_CHIP]=&get_chip; - flist[F_GET_MODULE]=&get_module; - flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; - flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; - flist[F_SET_SETTINGS]=&set_settings; - flist[F_START_ACQUISITION]=&start_acquisition; - flist[F_STOP_ACQUISITION]=&stop_acquisition; - flist[F_START_READOUT]=&start_readout; - flist[F_GET_RUN_STATUS]=&get_run_status; - flist[F_READ_FRAME]=&read_frame; - flist[F_READ_ALL]=&read_all; - flist[F_START_AND_READ_ALL]=&start_and_read_all; - flist[F_SET_TIMER]=&set_timer; - flist[F_GET_TIME_LEFT]=&get_time_left; - flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; - flist[F_SET_ROI]=&set_roi; - flist[F_SET_SPEED]=&set_speed; - flist[F_SET_READOUT_FLAGS]=&set_readout_flags; - flist[F_EXECUTE_TRIMMING]=&execute_trimming; - flist[F_LOCK_SERVER]=&lock_server; - flist[F_SET_PORT]=&set_port; - flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; - flist[F_UPDATE_CLIENT]=&update_client; - flist[F_CONFIGURE_MAC]=&configure_mac; - flist[F_LOAD_IMAGE]=&load_image; - flist[F_SET_MASTER]=&set_master; - flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; - flist[F_READ_COUNTER_BLOCK]=&read_counter_block; - flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; - flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; - flist[F_SET_CTB_PATTERN]=&set_ctb_pattern; - flist[F_WRITE_ADC_REG]=&write_adc_register; - flist[F_PROGRAM_FPGA]=&program_fpga; - flist[F_POWER_CHIP]=&power_chip; - flist[F_RESET_FPGA]=&reset_fpga; - flist[F_ACTIVATE]=&activate; - flist[F_PREPARE_ACQUISITION]=&prepare_acquisition; - flist[F_CLEANUP_ACQUISITION]=&cleanup_acquisition; - return OK; -} - - -int M_nofunc(int file_des){ - - int ret=FAIL; - sprintf(mess,"Unrecognized Function\n"); - printf(mess); - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return FAIL; -} - - -int exit_server(int file_des) { - int retval=FAIL; - sendDataOnly(file_des,&retval,sizeof(retval)); - printf("closing server."); - sprintf(mess,"closing server"); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - -int exec_command(int file_des) { - char cmd[MAX_STR_LENGTH]; - char answer[MAX_STR_LENGTH]; - int retval=OK; - int sysret=0; - int n=0; - - /* receive arguments */ - n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - - /* execute action if the arguments correctly arrived*/ - if (retval==OK) { -#ifdef VERBOSE - printf("executing command %s\n", cmd); -#endif - if (lockStatus==0 || differentClients==0) - sysret=system(cmd); - - //should be replaced by popen - if (sysret==0) { - sprintf(answer,"Succeeded\n"); - if (lockStatus==1 && differentClients==1) - sprintf(answer,"Detector locked by %s\n", lastClientIP); - } else { - sprintf(answer,"Failed\n"); - retval=FAIL; - } - } else { - sprintf(answer,"Could not receive the command\n"); - } - - /* send answer */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error writing to socket"); - retval=FAIL; - } - - - /*return ok/fail*/ - return retval; - -} - - - -int get_detector_type(int file_des) { - int n=0; - enum detectorType ret; - int retval=OK; - - sprintf(mess,"Can't return detector type\n"); - - - /* receive arguments */ - /* execute action */ - ret=JUNGFRAUCTB;//myDetectorType; - -#ifdef VERBOSE - printf("Returning detector type %d\n",ret); -#endif - - /* send answer */ - /* send OK/failed */ - if (differentClients==1) - retval=FORCE_UPDATE; - - n += sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - - -} - - -int set_number_of_modules(int file_des) { - int n; - int arg[2], ret=0; - int retval=OK; - int dim, nm; - - sprintf(mess,"Can't set number of modules\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket %d", n); - retval=GOODBYE; - } - if (retval==OK) { - dim=arg[0]; - nm=arg[1]; - - /* execute action */ -#ifdef VERBOSE - printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); -#endif - - //if (nm!=GET_FLAG) { - if (dim!=X && nm!=GET_FLAG) { - retval=FAIL; - sprintf(mess,"Can't change module number in dimension %d\n",dim); - } else { - if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { - sprintf(mess,"Detector locked by %s\n", lastClientIP); - retval=FAIL; - } else { - ret=setNMod(nm); - if (nModX==nm || nm==GET_FLAG) { - retval=OK; - if (differentClients==1) - retval=FORCE_UPDATE; - } else - retval=FAIL; - } - } - } - /*} else { - if (dim==Y) { - ret=nModY; - } else if (dim==X) { - ret=setNMod(-1); - } - } - */ - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - -} - - -int get_max_number_of_modules(int file_des) { - int n; - int ret; - int retval=OK; - enum dimension arg; - - sprintf(mess,"Can't get max number of modules\n"); - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* execute action */ -#ifdef VERBOSE - printf("Getting the max number of modules in dimension %d \n",arg); -#endif - - - switch (arg) { - case X: - ret=getNModBoard(); - break; - case Y: - ret=NMAXMODY; - break; - default: - ret=FAIL; - retval=FAIL; - break; - } -#ifdef VERBOSE - printf("Max number of module in dimension %d is %d\n",arg,ret ); -#endif - - - - if (differentClients==1 && retval==OK) { - retval=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - /*return ok/fail*/ - return retval; -} - - -//index 0 is in gate -//index 1 is in trigger -//index 2 is out gate -//index 3 is out trigger - -int set_external_signal_flag(int file_des) { - int n; - int arg[2]; - int ret=OK; - int signalindex; - enum externalSignalFlag flag, retval; - - sprintf(mess,"Can't set external signal flag\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - retval=SIGNAL_OFF; - if (ret==OK) { - signalindex=arg[0]; - flag=arg[1]; - /* execute action */ - switch (flag) { - case GET_EXTERNAL_SIGNAL_FLAG: - retval=getExtSignal(signalindex); - break; - - default: - if (differentClients==0 || lockStatus==0) { - retval=setExtSignal(signalindex,flag); - } else { - if (lockStatus!=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n", lastClientIP); - } - } - - } - -#ifdef VERBOSE - printf("Setting external signal %d to flag %d\n",signalindex,flag ); - printf("Set to flag %d\n",retval); -#endif - - } else { - ret=FAIL; - } - - if (ret==OK && differentClients!=0) - ret=FORCE_UPDATE; - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - -int set_external_communication_mode(int file_des) { - int n; - enum externalCommunicationMode arg, ret=GET_EXTERNAL_COMMUNICATION_MODE; - int retval=OK; - - sprintf(mess,"Can't set external communication mode\n"); - - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* - enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE - }; - */ - if (retval==OK) { - /* execute action */ - - ret=setTiming(arg); - - /* switch(arg) { */ - /* default: */ - /* sprintf(mess,"The meaning of single signals should be set\n"); */ - /* retval=FAIL; */ - /* } */ - - -#ifdef VERBOSE - printf("Setting external communication mode to %d\n", arg); -#endif - } else - ret=FAIL; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return retval; -} - - - -int get_id(int file_des) { - // sends back 64 bits! - int64_t retval=-1; - int ret=OK; - int n=0; - enum idMode arg; - - sprintf(mess,"Can't return id\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Getting id %d\n", arg); -#endif - - switch (arg) { - case DETECTOR_SERIAL_NUMBER: - retval=getDetectorNumber(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval=getFirmwareSVNVersion(); - retval=(retval <<32) | getFirmwareVersion(); - break; - case DETECTOR_SOFTWARE_VERSION: - retval= GITREV; - retval= (retval <<32) | GITDATE; - break; - default: - printf("Required unknown id %d \n", arg); - ret=FAIL; - retval=FAIL; - break; - } - -#ifdef VERBOSE - printf("Id is %llx\n", retval); -#endif - - if (differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int digital_test(int file_des) { - - int retval; - int ret=OK; - int imod=-1; - int n=0; - int ibit=0; - int ow; - int ival; - enum digitalTestMode arg; - - sprintf(mess,"Can't send digital test\n"); - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Digital test mode %d\n",arg ); -#endif - - switch (arg) { - case CHIP_TEST: - n = receiveDataOnly(file_des,&imod,sizeof(imod)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } -#ifdef VERBOSE - printf("of module %d\n", imod); -#endif - retval=0; - - break; - case MODULE_FIRMWARE_TEST: - retval=0x2; - break; - case DETECTOR_FIRMWARE_TEST: - retval=testFpga(); - break; - case DETECTOR_MEMORY_TEST: - ret=testRAM(); - break; - case DETECTOR_BUS_TEST: - retval=testBus(); - break; - case DETECTOR_SOFTWARE_TEST: - retval=testFpga(); - break; - case DIGITAL_BIT_TEST: - n = receiveDataOnly(file_des,&ival,sizeof(ival)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } -#ifdef VERBOSE - printf("with value %d\n", ival); -#endif - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - break; - } - digitalTestBit = ival; - retval=digitalTestBit; - break; - default: - printf("Unknown digital test required %d\n",arg); - ret=FAIL; - retval=FAIL; - break; - } - -#ifdef VERBOSE - printf("digital test result is 0x%x\n", retval); -#endif - //Always returns force update such that the dynamic range is always updated on the client - - // if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int write_register(int file_des) { - - int retval; - int ret=OK; - int arg[2]; - int addr, val; - int n; - u_int32_t address; - - sprintf(mess,"Can't write to register\n"); - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg[0]; - val=arg[1]; - -#ifdef VERBOSE - printf("writing to register 0x%x data 0x%x\n", addr, val); -#endif - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } - - - if(ret!=FAIL){ - address=(addr << MEM_MAP_SHIFT); - if((address==FIFO_DATA_REG_OFF)||(address==CONTROL_REG)) - ret = bus_w16(address,val); - else - ret=bus_w(address,val); - if(ret==OK){ - if((address==FIFO_DATA_REG_OFF)||(address==CONTROL_REG)) - retval=bus_r16(address); - else - retval=bus_r(address); - } - } - - -#ifdef VERBOSE - printf("Data set to 0x%x\n", retval); -#endif - if (retval==val) { - ret=OK; - if (differentClients) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int read_register(int file_des) { - - int retval; - int ret=OK; - int arg; - int addr; - int n; - u_int32_t address; - - sprintf(mess,"Can't read register\n"); - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg; - - - - //#ifdef VERBOSE - printf("reading register 0x%x\n", addr); - //#endif - - if(ret!=FAIL){ - address=(addr << MEM_MAP_SHIFT); - if((address==FIFO_DATA_REG_OFF)||(address==CONTROL_REG)) - retval=bus_r16(address); - else - retval=bus_r(address); - } - - - -#ifdef VERBOSE - printf("Returned value 0x%x\n", retval); -#endif - if (ret==FAIL) { - ret=FAIL; - printf("Reading register 0x%x failed\n", addr); - } else if (differentClients) - ret=FORCE_UPDATE; - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int set_dac(int file_des) { - //default:all mods - int retval, retval1; - int ret=OK; - int arg[3]; - enum dacIndex ind; - int imod; - int n; - int val; - int mV=0; - int v; - sprintf(mess,"Can't set DAC\n"); - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ind=arg[0]; - - imod=arg[1]; - - mV=arg[2]; - - if (mV) - printf("DAC will be set in mV %d!\n",mV); - else - printf("DAC will be set in DACu! %d\n", mV); - - n = receiveDataOnly(file_des,&val,sizeof(val)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - //#ifdef VERBOSE - printf("Setting DAC %d of module %d to %d , mode %d\n", ind, imod, val, mV); - //#endif - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - - - - - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - if (ind2500) - val=-1; - printf("%d mV is ",val); - if (val>0) - val=val/2500*4095; - printf("%d DACu\n", val); - } else { - v=val*2500/4095; - if (val>4095) { - val=-1; - } - } - - if (vLimitCompliant(v)) - retval=setDac(ind,val); // in DACu - - - } else { - switch (ind) { - case ADC_VPP: - - printf("Setting ADC VPP to %d\n",val); - if (val>4 || val<0) - printf("Cannot set ADC VPP to %d\n",val); - else { - writeADC(0x18,val); - adcvpp=val; - } - retval=adcvpp;; - break; - - case HV_NEW: - retval=initHighVoltage(val,imod);//ByModule - break; - - case V_POWER_A: - case V_POWER_B: - case V_POWER_C: - case V_POWER_D: - case V_POWER_IO: - case V_POWER_CHIP: - if (mV) { - if (vLimitCompliant(val)) - retval=setPower(ind,val); - else - printf("********power %d exceeds voltage limits", ind); - - } else - printf("********power %d should be set in mV instead od DACu", ind); - break; - - case V_LIMIT: - if (mV) { - retval=setPower(ind,val); - } else - printf("********power %d should be set in mV instead od DACu", ind); - break; - - default: - printf("**********No dac with index %d\n",ind); - printf("**********%d %d\n",N_DAC,N_PWR); - ret=FAIL; - } - - } - } - } - - - if(ret==OK){ - if (ind=getNModBoard() || imod<0) - ret=FAIL; - - //#ifdef MCB_FUNCS - switch (ind) { - case TEMPERATURE_FPGA: - idac=TEMP_FPGA; - break; - case TEMPERATURE_ADC: - idac=TEMP_ADC; - break; - - case V_POWER_D: - idac++; - case V_POWER_C: - idac++; - case V_POWER_B: - idac++; - case V_POWER_A: - idac++; - case V_POWER_IO: - idac+=100; - break; - - case I_POWER_D: - idac++; - case I_POWER_C: - idac++; - case I_POWER_B: - idac++; - case I_POWER_A: - idac++; - case I_POWER_IO: - idac+=200; - break; - - default: - // printf("Unknown DAC index %d\n",ind); - sprintf(mess,"Unknown DAC index %d\n",ind); - ret=FAIL; - break; - } - printf("DAC index %d (%d)\n",idac,ind); - - if (ret==OK) { - - - if (idac>=200) - retval=getCurrent(idac-200); - else if (idac>=100) - retval=getVoltage(idac-100); - else - retval=getTemperature(idac); - - - }else if (ind>=1000) { - retval=readSlowADC(ind-1000); - if (retval>=0) { - ret=OK; - } - - } - - - //#endif - -#ifdef VERBOSE - printf("ADC is %d V\n", retval); -#endif - if (ret==FAIL) { - printf("Getting adc %d of module %d failed\n", ind, imod); - } - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int set_channel(int file_des) { - int ret=OK; - sls_detector_channel myChan; - int retval; - int n; - - - sprintf(mess,"Can't set channel\n"); - -#ifdef VERBOSE - printf("Setting channel\n"); -#endif - ret=receiveChannel(file_des, &myChan); - if (ret>=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); -#endif - - if (ret==OK) { - if (myChan.module>=getNModBoard()) - ret=FAIL; - if (myChan.chip>=N_CHIP) - ret=FAIL; - if (myChan.chan>=N_CHAN) - ret=FAIL; - if (myChan.module<0) - myChan.module=ALLMOD; - } - - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - - } - } - /* Maybe this is done inside the initialization funcs */ - //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - - - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - - -int get_channel(int file_des) { - - int ret=OK; - sls_detector_channel retval; - - int arg[3]; - int ichan, ichip, imod; - int n; - - sprintf(mess,"Can't get channel\n"); - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichan=arg[0]; - ichip=arg[1]; - imod=arg[2]; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && ichan=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); -#endif - - if (ret==OK) { - if (myChip.module>=getNModBoard()) - ret=FAIL; - if (myChip.module<0) - myChip.module=ALLMOD; - if (myChip.chip>=N_CHIP) - ret=FAIL; - } - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - ; - } - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - return ret; -} - -int get_chip(int file_des) { - - - int ret=OK; - sls_detector_chip retval; - int arg[2]; - int ichip, imod; - int n; - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichip=arg[0]; - imod=arg[1]; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0) - ret=OK; - else - ret=FAIL; - - -#ifdef VERBOSE - printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); -#endif - - if (ret==OK) { - if (myModule.module>=getNModBoard()) { - ret=FAIL; - printf("Module number is too large %d\n",myModule.module); - } - if (myModule.module<0) - myModule.module=ALLMOD; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - } - } - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - free(myDac); - if(myAdc != NULL) free(myAdc); - if(myChip != NULL) free(myChip); - if(myChan != NULL) free(myChan); - - - //setDynamicRange(dr); always 16 commented out - - return ret; -} - - - - -int get_module(int file_des) { - - int ret=OK; - int arg; - int imod; - int n; - sls_detector_module myModule; - int *myDac=malloc(N_DAC*sizeof(int)); - int *myChip=NULL; - int *myChan=NULL; - int *myAdc=NULL; - - /*not required for jungfrau. so save memory*/ - if(myDetectorType != JUNGFRAU){ - myChip=malloc(N_CHIP*sizeof(int)); - myChan=malloc(N_CHIP*N_CHAN*sizeof(int)); - myAdc=malloc(N_ADC*sizeof(int)); - } - - - if (myDac) - myModule.dacs=myDac; - else { - sprintf(mess,"could not allocate dacs\n"); - ret=FAIL; - } - - - myModule.adcs=NULL; - myModule.chipregs=NULL; - myModule.chanregs=NULL; - /*not required for jungfrau. so save memory*/ - if(myDetectorType != JUNGFRAU){ - if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; - } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } - } - - myModule.ndac=N_DAC; - myModule.nchip=N_CHIP; - myModule.nchan=N_CHAN*N_CHIP; - myModule.nadc=N_ADC; - - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - imod=arg; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod-1) { - dataret=FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - printf("%s\n",mess); - } else { - dataret=FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s\n",mess); - if (differentClients) - dataret=FORCE_UPDATE; - } -#ifdef VERBOSE - printf("Frames left %d\n",(int)(getFrames())); -#endif - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - - return dataret; - -} - - - - - - - - -int read_all(int file_des) { - -while(read_frame(file_des)==OK) { - -#ifdef VERBOSE - printf("frame read\n"); -#endif - ; - } -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - return OK; - - -} - -int start_and_read_all(int file_des) { - //int dataret=OK; -#ifdef VERBOSE - printf("Starting and reading all frames\n"); -#endif - - if (differentClients==1 && lockStatus==1) { - dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - - } - - startStateMachine(); - - /* ret=startStateMachine(); - if (ret!=OK) { - sprintf(mess,"could not start state machine\n"); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - #ifdef VERBOSE - printf("could not start state machine\n"); -#endif -} else {*/ - read_all(file_des); -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - //} - - - return OK; - - -} - -int set_timer(int file_des) { - enum timerIndex ind; - int64_t tns; - int n; - int64_t retval; - int ret=OK; - - - sprintf(mess,"can't set timer\n"); - - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&tns,sizeof(tns)); // total received data - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret!=OK) { - printf(mess); - } - -#ifdef VERBOSE - printf("setting timer %d to %lld ns\n",ind,tns); -#endif - if (ret==OK) { - - if (differentClients==1 && lockStatus==1 && tns!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; - case PROBES_NUMBER: - sprintf(mess,"can't set timer for moench\n"); - ret=FAIL; - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - case SAMPLES_JCTB: - retval=setSamples(tns); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - } - if (ret!=OK) { - printf(mess); - if (differentClients) - ret=FORCE_UPDATE; - } - - if (ret!=OK) { - printf(mess); - printf("set timer failed\n"); - } else if (ind==FRAME_NUMBER) { - // ret=allocateRAM(); - // if (ret!=OK) - // sprintf(mess, "could not allocate RAM for %lld frames\n", tns); - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { -#ifdef VERBOSE - printf("returning ok %d\n",(int)(sizeof(retval))); -#endif - - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - - return ret; - -} - - - - - - - - -int get_time_left(int file_des) { - - enum timerIndex ind; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't get timer\n"); - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - //#ifdef VERBOSE - - printf("getting time left on timer %d \n",ind); - //#endif - - if (ret==OK) { - switch(ind) { - case FRAME_NUMBER: - printf("getting frames \n"); - retval=getFrames(); - break; - case ACQUISITION_TIME: - retval=getExposureTime(); - break; - case FRAME_PERIOD: - retval=getPeriod(); - break; - case DELAY_AFTER_TRIGGER: - retval=getDelay(); - break; - case GATES_NUMBER: - retval=getGates(); - break; - case PROBES_NUMBER: - retval=getProbes(); - break; - case CYCLES_NUMBER: - retval=getTrains(); - break; - case PROGRESS: - retval=getProgress(); - break; - case ACTUAL_TIME: - retval=getActualTime(); - break; - case MEASUREMENT_TIME: - retval=getMeasurementTime(); - break; - case FRAMES_FROM_START: - case FRAMES_FROM_START_PG: - retval=getFramesFromStart(); - break; - case SAMPLES_JCTB: - retval=setSamples(-1); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - - - if (ret!=OK) { - printf("get time left failed\n"); - } else if (differentClients) - ret=FORCE_UPDATE; - - //#ifdef VERBOSE - - printf("time left on timer %d is %lld\n",ind, retval); - //#endif - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&retval,sizeof(retval)); - -#ifdef VERBOSE - - printf("data sent\n"); -#endif - - return ret; - - -} - -int set_dynamic_range(int file_des) { - - - - int dr; - int n; - int retval; - int ret=OK; - - printf("Set dynamic range?\n"); - sprintf(mess,"can't set dynamic range\n"); - - - n = receiveDataOnly(file_des,&dr,sizeof(dr)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (differentClients==1 && lockStatus==1 && dr>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setDynamicRange(dr); - } - - //if (dr>=0 && retval!=dr) ret=FAIL; - if (ret!=OK) { - sprintf(mess,"set dynamic range failed\n"); - } else { - /* ret=allocateRAM(); */ -/* if (ret!=OK) */ -/* sprintf(mess,"Could not allocate RAM for the dynamic range selected\n"); */ -// else - if (differentClients) - ret=FORCE_UPDATE; - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - -int set_roi(int file_des) { - - int i; - int ret=OK; - int nroi=-1; - int n=0; - int retvalsize=0; - ROI arg[MAX_ROIS]; - int retval; - strcpy(mess,"Could not set/get roi\n"); - // u_int32_t disable_reg=0; - - n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if(nroi>=0){ - n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); - if (n != (nroi*sizeof(ROI))) { - sprintf(mess,"Received wrong number of bytes for ROI\n"); - ret=FAIL; - } - - printf("Setting ROI to:"); - for( i=0;i=0){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } else{ - retval=setROI(nroi,arg,&retvalsize,&ret); - if (ret==FAIL){ - printf("mess:%s\n",mess); - sprintf(mess,"Could not set all roi, should have set %d rois, but only set %d rois\n",nroi,retvalsize); - } - } - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - else{ - sendDataOnly(file_des,&retvalsize,sizeof(retvalsize)); - sendDataOnly(file_des,arg,retvalsize*sizeof(ROI)); - } - /*return ok/fail*/ - return ret; -} - -int get_roi(int file_des) { - - - return FAIL; -} - -int set_speed(int file_des) { - - enum speedVariable arg; - int val,n; - int ret=OK; - int retval; - - n=receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - n=receiveDataOnly(file_des,&val,sizeof(val)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - - if (ret==OK) { - - /* if (arg==PHASE_SHIFT || arg==ADC_PHASE) { */ - - - /* retval=phaseStep(val); */ - - /* } else if ( arg==DBIT_PHASE) { */ - /* retval=dbitPhaseStep(val); */ - /* } else { */ - - - /* if (val!=-1) { */ - - - if (differentClients==1 && lockStatus==1 && val>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch (arg) { - case PHASE_SHIFT: - case ADC_PHASE: - if (val==-1) - retval=getPhase(run_clk_c); - else - retval=configurePhase(val,run_clk_c); - break; - - case DBIT_PHASE: - if (val==-1) - retval=getPhase(dbit_clk_c); - else - retval=configurePhase(val,dbit_clk_c); - break; - - case CLOCK_DIVIDER: - retval=configureFrequency(val,run_clk_c);//setClockDivider(val,0); - if (configureFrequency(-1,sync_clk_c)>retval) { - configureFrequency(retval,sync_clk_c); - printf("--Configuring sync clk to %d MHz\n",val); - } else if (configureFrequency(-1,dbit_clk_c)>val && configureFrequency(-1,adc_clk_c)>retval) { - printf("++Configuring sync clk to %d MHz\n",val); - configureFrequency(retval,sync_clk_c); - } - break; - -/* case PHASE_SHIFT: */ -/* retval=phaseStep(val,0); */ -/* break; */ - - case OVERSAMPLING: - retval=setOversampling(val); - break; - - case ADC_CLOCK: - retval=configureFrequency(val,adc_clk_c);//setClockDivider(val,1); - if (configureFrequency(-1,sync_clk_c)>val) { - configureFrequency(retval,sync_clk_c); - printf("--Configuring sync clk to %d MHz\n",val); - } else if (configureFrequency(-1,dbit_clk_c)>val && configureFrequency(-1,run_clk_c)>retval) { - printf("++Configuring sync clk to %d MHz\n",val); - configureFrequency(retval,sync_clk_c); - } - break; - - case DBIT_CLOCK: - retval=configureFrequency(val,dbit_clk_c);//setClockDivider(val,2); - if (configureFrequency(-1,sync_clk_c)>retval){ - configureFrequency(retval,sync_clk_c); - printf("--Configuring sync clk to %d MHz\n",val); - } else if (configureFrequency(-1,adc_clk_c)>retval && configureFrequency(-1,run_clk_c)>retval) { - printf("++Configuring sync clk to %d MHz\n",val); - configureFrequency(retval,sync_clk_c); - } - - break; - - - - case ADC_PIPELINE: - retval=adcPipeline(val); - break; - - - case DBIT_PIPELINE: - retval=dbitPipeline(val); - break; - - default: - ret=FAIL; - sprintf(mess,"Unknown speed parameter %d",arg); - } - } - // } - - - } - - - - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - -int set_readout_flags(int file_des) { - - enum readOutFlags arg; - int ret=OK; - enum readOutFlags v=-1; - - receiveDataOnly(file_des,&arg,sizeof(arg)); - - switch (arg) { - case NORMAL_READOUT: - case DIGITAL_ONLY: - case ANALOG_AND_DIGITAL: - case GET_READOUT_FLAGS: - break; - default: - sprintf(mess,"unknown readout flags for jctb\n"); - ret=FAIL; - } - if (ret==OK) - v=setReadOutMode(arg); - - if (v<0) { - ret=FAIL; - sprintf(mess,"found non valid readout mode (neither analog nor digital)\n"); - } - sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==OK) - sendDataOnly(file_des,&v,sizeof(v)); - else - sendDataOnly(file_des,mess,sizeof(mess)); - // sendDataOnly(file_des,mess,sizeof(mess)); - - return ret; -} - - - - - -int execute_trimming(int file_des) { - - int arg[3]; - int ret=FAIL; - enum trimMode mode; - - sprintf(mess,"can't set execute trimming for moench\n"); - - receiveDataOnly(file_des,&mode,sizeof(mode)); - receiveDataOnly(file_des,arg,sizeof(arg)); - - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - return ret; -} - - -int lock_server(int file_des) { - - - int n; - int ret=OK; - - int lock; - n = receiveDataOnly(file_des,&lock,sizeof(lock)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (lock)\n"); - ret=FAIL; - } - if (lock>=0) { - if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) - lockStatus=lock; - else { - ret=FAIL; - sprintf(mess,"Server already locked by %s\n", lastClientIP); - } - } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); - - return ret; - -} - -int set_port(int file_des) { - int n; - int ret=OK; - int sd=-1; - - enum portType p_type; /** data? control? stop? Unused! */ - int p_number; /** new port number */ - - n = receiveDataOnly(file_des,&p_type,sizeof(p_type)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (ptype)\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&p_number,sizeof(p_number)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (pnum)\n"); - ret=FAIL; - } - if (differentClients==1 && lockStatus==1 ) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - if (p_number<1024) { - sprintf(mess,"Too low port number %d\n", p_number); - printf("\n"); - ret=FAIL; - } - - printf("set port %d to %d\n",p_type, p_number); - - sd=bindSocket(p_number); - } - if (sd>=0) { - ret=OK; - if (differentClients ) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Could not bind port %d\n", p_number); - printf("Could not bind port %d\n", p_number); - if (sd==-10) { - sprintf(mess,"Port %d already set\n", p_number); - printf("Port %d already set\n", p_number); - - } - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&p_number,sizeof(p_number)); - closeConnection(file_des); - exitServer(sockfd); - sockfd=sd; - - } - - return ret; - -} - -int get_last_client_ip(int file_des) { - int ret=OK; - int n; - if (differentClients ) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - - return ret; - -} - - -int send_update(int file_des) { - - int ret=OK; - enum detectorSettings t; - int n;//int thr, n; - //int it; - int64_t retval, tns=-1; - enum readOutFlags v=-1; - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - n = sendDataOnly(file_des,&nModX,sizeof(nModX)); - n = sendDataOnly(file_des,&nModY,sizeof(nModY)); - n = sendDataOnly(file_des,&dynamicRange,sizeof(dynamicRange)); - n = sendDataOnly(file_des,&dataBytes,sizeof(dataBytes)); - t=GET_SETTINGS;//setSettings(GET_SETTINGS,-1); - n = sendDataOnly(file_des,&t,sizeof(t)); -/* thr=getThresholdEnergy(); - n = sendDataOnly(file_des,&thr,sizeof(thr));*/ - retval=setFrames(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setExposureTime(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setPeriod(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setDelay(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setGates(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); -/* retval=setProbes(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t));*/ - retval=setTrains(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setSamples(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - - v=setReadOutMode(-1); - sendDataOnly(file_des,&v,sizeof(v)); - - if (lockStatus==0) { - strcpy(lastClientIP,thisClientIP); - } - - return ret; - - -} -int update_client(int file_des) { - - int ret=OK; - - sendDataOnly(file_des,&ret,sizeof(ret)); - return send_update(file_des); - - - -} - - -int configure_mac(int file_des) { - - int ret=OK; - char arg[5][50]; - int n; - - int imod=0;//should be in future sent from client as -1, arg[2] - int ipad; - long long int imacadd; - long long int idetectormacadd; - int udpport; - int detipad; - int retval=-100; - - sprintf(mess,"Can't configure MAC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - sscanf(arg[0], "%x", &ipad); - sscanf(arg[1], "%llx", &imacadd); - sscanf(arg[2], "%x", &udpport); - sscanf(arg[3], "%llx", &idetectormacadd); - sscanf(arg[4], "%x", &detipad); - - //#ifdef VERBOSE - int i; - printf("\ndigital_test_bit in server %d\t",digitalTestBit); - printf("\nipadd %x\t",ipad); - printf("destination ip is %d.%d.%d.%d = 0x%x \n",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff,ipad); - printf("macad:%llx\n",imacadd); - for (i=0;i<6;i++) - printf("mac adress %d is 0x%x \n",6-i,(unsigned int)(((imacadd>>(8*i))&0xFF))); - printf("udp port:0x%x\n",udpport); - printf("detector macad:%llx\n",idetectormacadd); - for (i=0;i<6;i++) - printf("detector mac adress %d is 0x%x \n",6-i,(unsigned int)(((idetectormacadd>>(8*i))&0xFF))); - printf("detipad %x\n",detipad); - printf("\n"); - //#endif - - - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - - //#ifdef VERBOSE - printf("Configuring MAC of module %d at port %x\n", imod, udpport); - //#endif - //#ifdef MCB_FUNCS - if (ret==OK){ - if(runBusy()){ - ret=stopStateMachine(); - if(ret==FAIL) - strcpy(mess,"could not stop detector acquisition to configure mac"); - } - - if(ret==OK) - configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,udpport); - retval=getAdcConfigured(); - } - //#endif - if (ret==FAIL) - printf("configuring MAC of mod %d failed\n", imod); - else - printf("Configuremac successful of mod %d and adc %d\n",imod,retval); - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - /*return ok/fail*/ - return ret; - -} - - - -int load_image(int file_des) { - int retval; - int ret=OK; - int n; - enum imageType index; - short int ImageVals[N_CHAN*N_CHIP]; - - sprintf(mess,"Loading image failed\n"); - - n = receiveDataOnly(file_des,&index,sizeof(index)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,ImageVals,dataBytes); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - switch (index) { - case DARK_IMAGE : -#ifdef VERBOSE - printf("Loading Dark image\n"); -#endif - break; - case GAIN_IMAGE : -#ifdef VERBOSE - printf("Loading Gain image\n"); -#endif - break; - default: - printf("Unknown index %d\n",index); - sprintf(mess,"Unknown index %d\n",index); - ret=FAIL; - break; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - retval=loadImage(index,ImageVals); - if (retval==-1) - ret = FAIL; - } - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - -int set_master(int file_des) { - - enum masterFlags retval=GET_MASTER; - enum masterFlags arg; - int n; - int ret=OK; - // int regret=OK; - - - sprintf(mess,"can't set master flags\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setMaster(arg); - - } - if (retval==GET_MASTER) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int set_synchronization(int file_des) { - - enum synchronizationMode retval=GET_MASTER; - enum synchronizationMode arg; - int n; - int ret=OK; - //int regret=OK; - - - sprintf(mess,"can't set synchronization mode\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - retval=setSynchronization(arg); - } - if (retval==GET_SYNCHRONIZATION_MODE) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int read_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - //char *retval=NULL; - short int CounterVals[N_CHAN*N_CHIP]; - - sprintf(mess,"Read counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - ret=readCounterBlock(startACQ,CounterVals); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,CounterVals[i]); -#endif - } - } - - if(ret!=FAIL){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,CounterVals,dataBytes);//1280*2 - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - - - -int reset_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - - sprintf(mess,"Reset counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=resetCounterBlock(startACQ); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - - /*return ok/fail*/ - return ret; -} - - - -int calibrate_pedestal(int file_des){ - - int ret=OK; - int retval=-1; - int n; - int frames; - - sprintf(mess,"Could not calibrate pedestal\n"); - - n = receiveDataOnly(file_des,&frames,sizeof(frames)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=calibratePedestal(frames); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - /*return ok/fail*/ - return ret; -} - - -int set_ctb_pattern(int file_des){ - - int ret=OK;//FAIL; - int retval=-1; - int n; - int mode; - uint64_t word, retval64, t; - int addr; - int level, start, stop, nl; - uint64_t pat[1024]; - - sprintf(mess,"Could not set pattern\n"); - - n = receiveDataOnly(file_des,&mode,sizeof(mode)); - printf("pattern mode is %d\n",mode); - switch (mode) { - - case 0: //sets word - n = receiveDataOnly(file_des,&addr,sizeof(addr)); - n = receiveDataOnly(file_des,&word,sizeof(word)); - ret=OK; - - printf("pattern addr is %d %x\n",addr, word); - switch (addr) { - case -1: - retval64=writePatternIOControl(word); - break; - case -2: - retval64=writePatternClkControl(word); - break; - default: - retval64=writePatternWord(addr,word); - }; - - - //write word; - //@param addr address of the word, -1 is I/O control register, -2 is clk control register - //@param word 64bit word to be written, -1 gets - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval64,sizeof(retval64)); - break; - - case 1: //pattern loop - // printf("loop\n"); - n = receiveDataOnly(file_des,&level,sizeof(level)); - n = receiveDataOnly(file_des,&start,sizeof(start)); - n = receiveDataOnly(file_des,&stop,sizeof(stop)); - n = receiveDataOnly(file_des,&nl,sizeof(nl)); - - - - // printf("level %d start %x stop %x nl %d\n",level, start, stop, nl); - /** Sets the pattern or loop limits in the CTB - @param level -1 complete pattern, 0,1,2, loop level - @param start start address if >=0 - @param stop stop address if >=0 - @param n number of loops (if level >=0) - @returns OK/FAIL - */ - ret=setPatternLoop(level, &start, &stop, &nl); - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else { - n += sendDataOnly(file_des,&start,sizeof(start)); - n += sendDataOnly(file_des,&stop,sizeof(stop)); - n += sendDataOnly(file_des,&nl,sizeof(nl)); - } - break; - - - - case 2: //wait address - printf("wait\n"); - n = receiveDataOnly(file_des,&level,sizeof(level)); - n = receiveDataOnly(file_des,&addr,sizeof(addr)); - - - - /** Sets the wait address in the CTB - @param level 0,1,2, wait level - @param addr wait address, -1 gets - @returns actual value - */ - printf("wait addr %d %x\n",level, addr); - retval=setPatternWaitAddress(level,addr); - printf("ret: wait addr %d %x\n",level, retval); - ret=OK; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else { - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - } - - - break; - - - case 3: //wait time - printf("wait time\n"); - n = receiveDataOnly(file_des,&level,sizeof(level)); - n = receiveDataOnly(file_des,&t,sizeof(t)); - - - /** Sets the wait time in the CTB - @param level 0,1,2, wait level - @param t wait time, -1 gets - @returns actual value - */ - - ret=OK; - - retval64=setPatternWaitTime(level,t); - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval64,sizeof(retval64)); - - break; - - - - case 4: - n = receiveDataOnly(file_des,pat,sizeof(pat)); - for (addr=0; addr<1024; addr++) - writePatternWord(addr,word); - ret=OK; - retval=0; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval64,sizeof(retval64)); - - break; - - - - - - default: - ret=FAIL; - printf(mess); - sprintf(mess,"%s - wrong mode %d\n",mess, mode); - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n += sendDataOnly(file_des,mess,sizeof(mess)); - - - - } - - - /*return ok/fail*/ - return ret; -} - - -int write_adc_register(int file_des) { - - int retval; - int ret=OK; - int arg[2]; - int addr, val; - int n; - - sprintf(mess,"Can't write to register\n"); - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - addr=arg[0]; - val=arg[1]; - -#ifdef VERBOSE - printf("writing to register 0x%x data 0x%x\n", addr, val); -#endif - - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } - - - if(ret!=FAIL){ - ret=writeADC(addr,val); - if (ret==OK) - retval=val; - } - - -#ifdef VERBOSE - printf("Data set to 0x%x\n", retval); -#endif - if (retval==val) { - ret=OK; - if (differentClients) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Writing to register 0x%x failed: wrote 0x%x but read 0x%x\n", addr, val, retval); - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int power_chip(int file_des) { - - int retval=-1; - int ret=OK; - int arg=-1; - int n; - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("Power chip to %d\n", arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=powerChip(arg); -#ifdef VERBOSE - printf("Chip powered: %d\n",retval); -#endif - - if (retval==arg || arg<0) { - ret=OK; - } else { - ret=FAIL; - printf("Powering chip failed, wrote %d but read %d\n", arg, retval); - } - - } - if (ret==OK && differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - return ret; -} - - -int reset_fpga(int file_des) { - int ret=OK; - int n; - sprintf(mess,"Reset FPGA unsuccessful\n"); - - resetFPGA(); - initializeDetector(); - - ret = FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - - /*return ok/fail*/ - return ret; -} - - -int program_fpga(int file_des) { - int ret=OK; - int n; - sprintf(mess,"Program FPGA unsuccessful\n"); - char* fpgasrc = NULL; - FILE* fp = NULL; - size_t filesize = 0; - size_t unitprogramsize = 0; - size_t totalsize = 0; - - - //filesize - n = receiveDataOnly(file_des,&filesize,sizeof(filesize)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - totalsize = filesize; -#ifdef VERY_VERBOSE - printf("\n\n Total size is:%d\n",totalsize); -#endif - - //lock - if (ret==OK && differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - filesize = 0; - } - - //opening file pointer to flash and telling FPGA to not touch flash - if(ret == OK && startWritingFPGAprogram(&fp) != OK){ - sprintf(mess,"Could not write to flash. Error at startup.\n"); - cprintf(RED,"%s",mess); - ret=FAIL; - filesize = 0; - } - - //---------------- first ret ---------------- - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - //---------------- first ret ---------------- - - - //erasing flash - if(ret != FAIL){ - eraseFlash(); - fpgasrc = (char*)malloc(MAX_FPGAPROGRAMSIZE); - } - - - - //writing to flash part by part - while(ret != FAIL && filesize){ - - unitprogramsize = MAX_FPGAPROGRAMSIZE; //2mb - if(unitprogramsize > filesize) //less than 2mb - unitprogramsize = filesize; -#ifdef VERY_VERBOSE - printf("unit size to receive is:%d\n",unitprogramsize); - printf("filesize:%d currentpointer:%d\n",filesize,currentPointer); -#endif - - - //receive - n = receiveDataOnly(file_des,fpgasrc,unitprogramsize); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (ret==OK) { - if(!(unitprogramsize - filesize)){ - fpgasrc[unitprogramsize]='\0'; - filesize-=unitprogramsize; - unitprogramsize++; - }else - filesize-=unitprogramsize; - - ret = writeFPGAProgram(fpgasrc,unitprogramsize,fp); - } - - - //---------------- middle rets ---------------- - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - cprintf(RED,"Failure: Breaking out of program receiving\n"); - } - //---------------- middle rets ---------------- - - - if(ret != FAIL){ - //print progress - printf("Writing to Flash:%d%%\r",(int) (((double)(totalsize-filesize)/totalsize)*100) ); - fflush(stdout); - } - - } - - - - printf("\n"); - - //closing file pointer to flash and informing FPGA - if(stopWritingFPGAprogram(fp) == FAIL){ - sprintf(mess,"Could not write to flash. Error at end.\n"); - cprintf(RED,"%s",mess); - ret=FAIL; - } - - if(ret!=FAIL){ - ret=FORCE_UPDATE; - } - - - //---------------- last ret ---------------- - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - //---------------- last ret ---------------- - - - //free resources - if(fpgasrc != NULL) - free(fpgasrc); - if(fp!=NULL) - fclose(fp); -#ifdef VERY_VERBOSE - printf("Done with program receiving command\n"); -#endif - /*return ok/fail*/ - return ret; -} - - -int activate(int file_des) { - - int retval=-1; - int ret=OK; - int arg=-1; - int n; - - sprintf(mess,"Can't activate detector\n"); - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK && differentClients==1) - ret=FORCE_UPDATE; - retval=arg; - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - return ret; -} - -int prepare_acquisition(int file_des) { - int ret = OK; - int n=0; - strcpy(mess,"prepare acquisition failed\n"); - - - ret = FAIL; - strcpy(mess,"Not implemented for this detector\n"); - cprintf(RED, "Warning: %s", mess); - /* - //lock - if (ret==OK && differentClients && lockStatus) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - cprintf(RED, "Warning: %s", mess); - } - else { - ret = startReceiver(1); - if (ret == FAIL) - cprintf(RED, "Warning: %s", mess); - } -*/ - - if(ret==OK && differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; -} - -int cleanup_acquisition(int file_des) { - int ret = OK; - int n=0; - - - //to receive any arguments - while (n > 0) - n = receiveDataOnly(file_des,mess,MAX_STR_LENGTH); - - ret = FAIL; - strcpy(mess,"Not implemented for this detector\n"); - cprintf(RED, "Warning: %s", mess); - /* - if (lockStatus && differentClients){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - cprintf(RED, "Warning: %s", mess); - ret=FAIL; - } - else { - ret=startReceiver(0); - if (ret == FAIL) - cprintf(RED, "Warning: %s", mess); - } - */ - if(ret==OK && differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - return ret; -} diff --git a/slsDetectorSoftware/jctbDetectorServer/server_funcs.h b/slsDetectorSoftware/jctbDetectorServer/server_funcs.h deleted file mode 100755 index 40da3b75a..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/server_funcs.h +++ /dev/null @@ -1,102 +0,0 @@ -#ifndef SERVER_FUNCS_H -#define SERVER_FUNCS_H - - -#include "sls_detector_defs.h" - - -#include -/* -#include -#include -#include -*/ -#include "communication_funcs.h" - - - - -#define GOODBYE -200 - -int sockfd; - -int function_table(); - -int decode_function(int); -const char* getFunctionName(enum detFuncs func); -int init_detector(int,int); - -int M_nofunc(int); -int exit_server(int); - - - - -// General purpose functions -int get_detector_type(int); -int set_number_of_modules(int); -int get_max_number_of_modules(int); - - -int exec_command(int); -int set_external_signal_flag(int); -int set_external_communication_mode(int); -int get_id(int); -int digital_test(int); -int write_register(int); -int read_register(int); -int set_dac(int); -int get_adc(int); -int set_channel(int); -int set_chip(int); -int set_module(int); -int get_channel(int); -int get_chip(int); -int get_module(int); - -int get_threshold_energy(int); -int set_threshold_energy(int); -int set_settings(int); -int start_acquisition(int); -int stop_acquisition(int); -int start_readout(int); -int get_run_status(int); -int read_frame(int); -int read_all(int); -int start_and_read_all(int); -int set_timer(int); -int get_time_left(int); -int set_dynamic_range(int); -int set_roi(int); -int get_roi(int); -int set_speed(int); -int set_readout_flags(int); -int execute_trimming(int); -int lock_server(int); -int set_port(int); -int get_last_client_ip(int); -int set_master(int); -int set_synchronization(int); - -int update_client(int); -int send_update(int); -int configure_mac(int); - -int load_image(int); -int read_counter_block(int); -int reset_counter_block(int); - -int calibrate_pedestal(int); - -int set_roi(int); -int set_ctb_pattern(int); - -int write_adc_register(int); -int power_chip(int); -int reset_fpga(int); -int program_fpga(int); - -int activate(int); -int prepare_acquisition(int); -int cleanup_acquisition(int); -#endif diff --git a/slsDetectorSoftware/jctbDetectorServer/sharedmemory.c b/slsDetectorSoftware/jctbDetectorServer/sharedmemory.c deleted file mode 100755 index 4504cfe05..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/sharedmemory.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "sharedmemory.h" - -struct statusdata *stdata; - -int inism(int clsv) { - -static int scansmid; - - if (clsv==SMSV) { - if ( (scansmid=shmget(SMKEY,1024,IPC_CREAT | 0666 ))==-1 ) { - return -1; - } - if ( (stdata=shmat(scansmid,NULL,0))==(void*)-1) { - return -2; - } - } - - if (clsv==SMCL) { - if ( (scansmid=shmget(SMKEY,0,0) )==-1 ) { - return -3; - } - if ( (stdata=shmat(scansmid,NULL,0))==(void*)-1) { - return -4; - } - } - return 1; -} - -void write_status_sm(char *status) { - strcpy(stdata->status,status); -} - -void write_stop_sm(int v) { - stdata->stop=v; -} - -void write_runnumber_sm(int v) { - stdata->runnumber=v; -} diff --git a/slsDetectorSoftware/jctbDetectorServer/sharedmemory.h b/slsDetectorSoftware/jctbDetectorServer/sharedmemory.h deleted file mode 100755 index bdbddf719..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/sharedmemory.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef SM -#define SM - -#include "sls_detector_defs.h" - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -#include - -#include -#include - -/* key for shared memory */ -#define SMKEY 10001 - -#define SMSV 1 -#define SMCL 2 - - -struct statusdata { - int runnumber; - int stop; - char status[20]; -} ; - - -/* for shared memory */ - -int inism(int clsv); -void write_status_sm(char *status); -void write_stop_sm(int v); -void write_runnumber_sm(int v); - -#endif diff --git a/slsDetectorSoftware/jctbDetectorServer/slow_adc.c b/slsDetectorSoftware/jctbDetectorServer/slow_adc.c deleted file mode 100644 index 6f1b764b0..000000000 --- a/slsDetectorSoftware/jctbDetectorServer/slow_adc.c +++ /dev/null @@ -1,245 +0,0 @@ -#include "firmware_funcs.h" -#include "registers_m.h" -#include "server_defs.h" -#include "blackfin.h" - -int prepareSlowADCSeq() { - - // u_int16_t vv=0x3c40; - u_int16_t codata=( 1<<13) | (7<<10) | (7<<7) | (1<<6) | (0<<3) | (2<<1) | 1; - - u_int32_t valw; - int obit, ibit; - - // int cnv_bit=16, sdi_bit=17, sck_bit=18; - int cnv_bit=10, sdi_bit=8, sck_bit=9; - - // int oval=0; - - - printf("Codata is %04x\n",codata); - - /* //convert */ - valw=(1<> (13-ibit)) & 1); - // printf("%d",obit); - valw = obit << sdi_bit; - - bus_w(ADC_WRITE_REG,valw); - - usleep(20); - - bus_w(ADC_WRITE_REG,valw|(1<> (13-ibit)) & 1); - // printf("%d",obit); - valw = obit << sdi_bit; - - bus_w(ADC_WRITE_REG,valw); - - usleep(20); - - bus_w(ADC_WRITE_REG,valw|(1<7) - return -1; - - - prepareSlowADC(ichan); - - - /* printf("Codata is %04x\n",codata); */ - - /* /\* //convert *\/ */ - /* valw=(1<> (13-ibit)) & 1); */ - /* // printf("%d",obit); */ - /* valw = obit << sdi_bit; */ - - /* bus_w(ADC_WRITE_REG,valw); */ - - /* usleep(20); */ - - /* bus_w(ADC_WRITE_REG,valw|(1< gitInfo.txt - cd ../../ - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -fi \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/AD9257.h b/slsDetectorSoftware/jungfrauDetectorServer/AD9257.h deleted file mode 120000 index 87b70e097..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/AD9257.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/AD9257.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile b/slsDetectorSoftware/jungfrauDetectorServer/Makefile deleted file mode 100755 index a1c89973e..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -CROSS = bfin-uclinux- -CC = $(CROSS)gcc -CFLAGS += -Wall -DJUNGFRAUD -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DSTOP_SERVER #-DVERBOSEI #-DVERBOSE -LDLIBS += -lm -lstdc++ - -PROGS = jungfrauDetectorServer -DESTDIR ?= bin -INSTMODE = 0777 - -SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c -OBJS = $(SRC_CLNT:.c=.o) - -all: clean versioning $(PROGS) - -boot: $(OBJS) - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - -$(PROGS): $(OBJS) -# echo $(OBJS) - mkdir -p $(DESTDIR) - $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) - mv $(PROGS) $(DESTDIR) - rm *.gdb - -clean: - rm -rf $(DESTDIR)/$(PROGS) *.o - - - \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual b/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual deleted file mode 100644 index 97b4812d6..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile.virtual +++ /dev/null @@ -1,27 +0,0 @@ -CC = gcc -CFLAGS += -Wall -DJUNGFRAUD -DVIRTUAL -DSLS_DETECTOR_FUNCTION_LIST -DDACS_INT -DSTOP_SERVER #-DVERBOSEI #-DVERBOSE -LDLIBS += -lm -lstdc++ -pthread - -PROGS = jungfrauDetectorServer_virtual -DESTDIR ?= bin -INSTMODE = 0777 - -SRC_CLNT = communication_funcs.c slsDetectorServer.c slsDetectorServer_funcs.c slsDetectorFunctionList.c -OBJS = $(SRC_CLNT:.c=.o) - -all: clean versioning $(PROGS) - -boot: $(OBJS) - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - -$(PROGS): $(OBJS) -# echo $(OBJS) - mkdir -p $(DESTDIR) - $(CC) -o $@ $^ $(CFLAGS) $(LDLIBS) - mv $(PROGS) $(DESTDIR) - -clean: - rm -rf $(DESTDIR)/$(PROGS) *.o - diff --git a/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h b/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h deleted file mode 100644 index 1c7742e86..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/RegisterDefs.h +++ /dev/null @@ -1,428 +0,0 @@ -#ifndef REGISTER_DEFS_H -#define REGISTER_DEFS_H - -/* Definitions for FPGA*/ - -/* FPGA Version register */ -#define FPGA_VERSION_REG (0x00 << MEM_MAP_SHIFT) - -#define BOARD_REVISION_OFST (0) -#define BOARD_REVISION_MSK (0x00FFFFFF << BOARD_REVISION_OFST) -#define DETECTOR_TYPE_OFST (24) -#define DETECTOR_TYPE_MSK (0x000000FF << DETECTOR_TYPE_OFST) - -/* Fix pattern register */ -#define FIX_PATT_REG (0x01 << MEM_MAP_SHIFT) - -#define FIX_PATT_VAL (0xACDC2014) - -/* Status register */ -#define STATUS_REG (0x02 << MEM_MAP_SHIFT) - -#define RUN_BUSY_OFST (0) -#define RUN_BUSY_MSK (0x00000001 << RUN_BUSY_OFST) -#define WAITING_FOR_TRIGGER_OFST (3) -#define WAITING_FOR_TRIGGER_MSK (0x00000001 << WAITING_FOR_TRIGGER_OFST) -#define DELAYBEFORE_OFST (4) //Not used in software -#define DELAYBEFORE_MSK (0x00000001 << DELAYBEFORE_OFST) //Not used in software -#define DELAYAFTER_OFST (5) //Not used in software -#define DELAYAFTER_MSK (0x00000001 << DELAYAFTER_OFST) //Not used in software -#define STOPPED_OFST (15) -#define STOPPED_MSK (0x00000001 << STOPPED_OFST) -#define RUNMACHINE_BUSY_OFST (17) -#define RUNMACHINE_BUSY_MSK (0x00000001 << RUNMACHINE_BUSY_OFST) - -/* Look at me register */ -#define LOOK_AT_ME_REG (0x03 << MEM_MAP_SHIFT) //Not used in firmware or software - -/* System Status register */ -#define SYSTEM_STATUS_REG (0x04 << MEM_MAP_SHIFT) //Not used in software - -#define DDR3_CAL_DONE_OFST (0) //Not used in software -#define DDR3_CAL_DONE_MSK (0x00000001 << DDR3_CAL_DONE_OFST) //Not used in software -#define DDR3_CAL_FAIL_OFST (1) //Not used in software -#define DDR3_CAL_FAIL_MSK (0x00000001 << DDR3_CAL_FAIL_OFST) //Not used in software -#define DDR3_INIT_DONE_OFST (2) //Not used in software -#define DDR3_INIT_DONE_MSK (0x00000001 << DDR3_INIT_DONE_OFST) //Not used in software -#define RECONFIG_PLL_LCK_OFST (3) //Not used in software -#define RECONFIG_PLL_LCK_MSK (0x00000001 << RECONFIG_PLL_LCK_OFST) //Not used in software -#define PLL_A_LCK_OFST (4) //Not used in software -#define PLL_A_LCK_MSK (0x00000001 << PLL_A_LCK_OFST) //Not used in software -#define DD3_PLL_LCK_OFST (5) //Not used in software -#define DD3_PLL_LCK_MSK (0x00000001 << DD3_PLL_LCK_OFST) //Not used in software - - -/* Module Control Board Serial Number Register */ -#define MOD_SERIAL_NUM_REG (0x0A << MEM_MAP_SHIFT) //Not used in software - -#define HARDWARE_SERIAL_NUM_OFST (0) //Not used in software -#define HARDWARE_SERIAL_NUM_MSK (0x000000FF << HARDWARE_SERIAL_NUM_OFST) //Not used in software -#define HARDWARE_VERSION_NUM_OFST (16) //Not used in software -#define HARDWARE_VERSION_NUM_MSK (0x0000003F << HARDWARE_VERSION_NUM_OFST) //Not used in software - - -/* API Version Register */ -#define API_VERSION_REG (0x0F << MEM_MAP_SHIFT) - -#define API_VERSION_OFST (0) -#define API_VERSION_MSK (0x00FFFFFF << API_VERSION_OFST) -#define API_VERSION_DETECTOR_TYPE_OFST (24) //Not used in software -#define API_VERSION_DETECTOR_TYPE_MSK (0x000000FF << API_VERSION_DETECTOR_TYPE_OFST) //Not used in software - -/* Time from Start 64 bit register */ -#define TIME_FROM_START_LSB_REG (0x10 << MEM_MAP_SHIFT) -#define TIME_FROM_START_MSB_REG (0x11 << MEM_MAP_SHIFT) - -/* Get Delay 64 bit register */ -#define GET_DELAY_LSB_REG (0x12 << MEM_MAP_SHIFT) // different kind of delay -#define GET_DELAY_MSB_REG (0x13 << MEM_MAP_SHIFT) // different kind of delay - -/* Get Cycles 64 bit register */ -#define GET_CYCLES_LSB_REG (0x14 << MEM_MAP_SHIFT) -#define GET_CYCLES_MSB_REG (0x15 << MEM_MAP_SHIFT) - -/* Get Frames 64 bit register */ -#define GET_FRAMES_LSB_REG (0x16 << MEM_MAP_SHIFT) -#define GET_FRAMES_MSB_REG (0x17 << MEM_MAP_SHIFT) - -/* Get Period 64 bit register tT = T x 50 ns */ -#define GET_PERIOD_LSB_REG (0x18 << MEM_MAP_SHIFT) -#define GET_PERIOD_MSB_REG (0x19 << MEM_MAP_SHIFT) - -/** Get Temperature Carlos, incorrectl as get gates */ -#define GET_TEMPERATURE_TMP112_REG (0x1c << MEM_MAP_SHIFT) // (after multiplying by 625) in 10ths of millidegrees of TMP112 - -#define TEMPERATURE_VALUE_BIT (0) -#define TEMPERATURE_VALUE_MSK (0x000007FF << TEMPERATURE_VALUE_BIT) -#define TEMPERATURE_POLARITY_BIT (11) -#define TEMPERATURE_POLARITY_MSK (0x00000001 << TEMPERATURE_POLARITY_BIT) - -/* Get Frames from Start 64 bit register (frames from last reset using CONTROL_CRST) */ -#define FRAMES_FROM_START_PG_LSB_REG (0x24 << MEM_MAP_SHIFT) -#define FRAMES_FROM_START_PG_MSB_REG (0x25 << MEM_MAP_SHIFT) - -/* Measurement Time 64 bit register (timestamp at a frame start until reset)*/ -#define START_FRAME_TIME_LSB_REG (0x26 << MEM_MAP_SHIFT) -#define START_FRAME_TIME_MSB_REG (0x27 << MEM_MAP_SHIFT) - -/* SPI (Serial Peripheral Interface) Register */ -#define SPI_REG (0x40 << MEM_MAP_SHIFT) - -#define DAC_SERIAL_DIGITAL_OUT_OFST (0) -#define DAC_SERIAL_DIGITAL_OUT_MSK (0x00000001 << DAC_SERIAL_DIGITAL_OUT_OFST) -#define DAC_SERIAL_CLK_OUT_OFST (1) -#define DAC_SERIAL_CLK_OUT_MSK (0x00000001 << DAC_SERIAL_CLK_OUT_OFST) -#define DAC_SERIAL_CS_OUT_OFST (2) -#define DAC_SERIAL_CS_OUT_MSK (0x00000001 << DAC_SERIAL_CS_OUT_OFST) -#define HV_SERIAL_DIGITAL_OUT_OFST (8) -#define HV_SERIAL_DIGITAL_OUT_MSK (0x00000001 << HV_SERIAL_DIGITAL_OUT_OFST) -#define HV_SERIAL_CLK_OUT_OFST (9) -#define HV_SERIAL_CLK_OUT_MSK (0x00000001 << HV_SERIAL_CLK_OUT_OFST) -#define HV_SERIAL_CS_OUT_OFST (10) -#define HV_SERIAL_CS_OUT_MSK (0x00000001 << HV_SERIAL_CS_OUT_OFST) - - -/* ADC SPI (Serial Peripheral Interface) Register */ -#define ADC_SPI_REG (0x41 << MEM_MAP_SHIFT) - -#define ADC_SERIAL_CLK_OUT_OFST (0) -#define ADC_SERIAL_CLK_OUT_MSK (0x00000001 << ADC_SERIAL_CLK_OUT_OFST) -#define ADC_SERIAL_DATA_OUT_OFST (1) -#define ADC_SERIAL_DATA_OUT_MSK (0x00000001 << ADC_SERIAL_DATA_OUT_OFST) -#define ADC_SERIAL_CS_OUT_OFST (2) -#define ADC_SERIAL_CS_OUT_MSK (0x0000000F << ADC_SERIAL_CS_OUT_OFST) - -/* ADC offset Register */ -#define ADC_OFST_REG (0x42 << MEM_MAP_SHIFT) - -/* ADC Port Invert Register */ -#define ADC_PORT_INVERT_REG (0x43 << MEM_MAP_SHIFT) - -#define ADC_PORT_INVERT_ADC_0_OFST (0) -#define ADC_PORT_INVERT_ADC_0_MSK (0x000000FF << ADC_PORT_INVERT_ADC_0_OFST) -#define ADC_PORT_INVERT_ADC_1_OFST (8) -#define ADC_PORT_INVERT_ADC_1_MSK (0x000000FF << ADC_PORT_INVERT_ADC_1_OFST) -#define ADC_PORT_INVERT_ADC_2_OFST (16) -#define ADC_PORT_INVERT_ADC_2_MSK (0x000000FF << ADC_PORT_INVERT_ADC_2_OFST) -#define ADC_PORT_INVERT_ADC_3_OFST (24) -#define ADC_PORT_INVERT_ADC_3_MSK (0x000000FF << ADC_PORT_INVERT_ADC_3_OFST) - -/* Receiver IP Address Register */ -#define RX_IP_REG (0x45 << MEM_MAP_SHIFT) - -/* UDP Port */ -#define UDP_PORT_REG (0x46 << MEM_MAP_SHIFT) - -#define UDP_PORT_RX_OFST (0) -#define UDP_PORT_RX_MSK (0x0000FFFF << UDP_PORT_RX_OFST) -#define UDP_PORT_TX_OFST (16) -#define UDP_PORT_TX_MSK (0x0000FFFF << UDP_PORT_TX_OFST) - -/* Receiver Mac Address 64 bit Register */ -#define RX_MAC_LSB_REG (0x47 << MEM_MAP_SHIFT) -#define RX_MAC_MSB_REG (0x48 << MEM_MAP_SHIFT) - -#define RX_MAC_LSB_OFST (0) -#define RX_MAC_LSB_MSK (0xFFFFFFFF << RX_MAC_LSB_OFST) -#define RX_MAC_MSB_OFST (0) -#define RX_MAC_MSB_MSK (0x0000FFFF << RX_MAC_MSB_OFST) - -/* Detector/ Transmitter Mac Address 64 bit Register */ -#define TX_MAC_LSB_REG (0x49 << MEM_MAP_SHIFT) -#define TX_MAC_MSB_REG (0x4A << MEM_MAP_SHIFT) - -#define TX_MAC_LSB_OFST (0) -#define TX_MAC_LSB_MSK (0xFFFFFFFF << TX_MAC_LSB_OFST) -#define TX_MAC_MSB_OFST (0) -#define TX_MAC_MSB_MSK (0x0000FFFF << TX_MAC_MSB_OFST) - -/* Detector/ Transmitter IP Address Register */ -#define TX_IP_REG (0x4B << MEM_MAP_SHIFT) - -/* Detector/ Transmitter IP Checksum Register */ -#define TX_IP_CHECKSUM_REG (0x4C << MEM_MAP_SHIFT) - -#define TX_IP_CHECKSUM_OFST (0) -#define TX_IP_CHECKSUM_MSK (0x0000FFFF << TX_IP_CHECKSUM_OFST) - -/* Configuration Register */ -#define CONFIG_REG (0x4D << MEM_MAP_SHIFT) - -// readout timer (from chip) to stabilize (esp in burst acquisition mode) tRDT = (RDT + 1) * 25ns -#define CONFIG_RDT_TMR_OFST (0) -#define CONFIG_RDT_TMR_MSK (0x0000FFFF << CONFIG_RDT_TMR_OFST) -#define CONFIG_OPRTN_MDE_2_X_10GbE_OFST (16) -#define CONFIG_OPRTN_MDE_2_X_10GbE_MSK (0x00000001 << CONFIG_OPRTN_MDE_2_X_10GbE_OFST) -#define CONFIG_OPRTN_MDE_1_X_10GBE_VAL ((0x0 << CONFIG_OPRTN_MDE_2_X_10GbE_OFST) & CONFIG_OPRTN_MDE_2_X_10GbE_MSK) -#define CONFIG_READOUT_SPEED_OFST (20) -#define CONFIG_READOUT_SPEED_MSK (0x00000003 << CONFIG_READOUT_SPEED_OFST) -#define CONFIG_QUARTER_SPEED_10MHZ_VAL ((0x0 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK) -#define CONFIG_HALF_SPEED_20MHZ_VAL ((0x1 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK) -#define CONFIG_FULL_SPEED_40MHZ_VAL ((0x2 << CONFIG_READOUT_SPEED_OFST) & CONFIG_READOUT_SPEED_MSK) -#define CONFIG_TDMA_OFST (24) -#define CONFIG_TDMA_MSK (0x00000001 << CONFIG_TDMA_OFST) -#define CONFIG_TDMA_DISABLE_VAL ((0x0 << CONFIG_TDMA_OFST) & CONFIG_TDMA_MSK) -#define CONFIG_TDMA_TIMESLOT_OFST (25) // 1ms -#define CONFIG_TDMA_TIMESLOT_MSK (0x0000001F << CONFIG_TDMA_TIMESLOT_OFST) -#define CONFIG_ETHRNT_FLW_CNTRL_OFST (31) -#define CONFIG_ETHRNT_FLW_CNTRL_MSK (0x00000001 << CONFIG_ETHRNT_FLW_CNTRL_OFST) - -/* External Signal Register */ -#define EXT_SIGNAL_REG (0x4E << MEM_MAP_SHIFT) - -#define EXT_SIGNAL_OFST (0) -#define EXT_SIGNAL_MSK (0x00000001 << EXT_SIGNAL_OFST) - -/* Control Register */ -#define CONTROL_REG (0x4F << MEM_MAP_SHIFT) - -#define CONTROL_START_ACQ_OFST (0) -#define CONTROL_START_ACQ_MSK (0x00000001 << CONTROL_START_ACQ_OFST) -#define CONTROL_STOP_ACQ_OFST (1) -#define CONTROL_STOP_ACQ_MSK (0x00000001 << CONTROL_STOP_ACQ_OFST) -#define CONTROL_CORE_RST_OFST (10) -#define CONTROL_CORE_RST_MSK (0x00000001 << CONTROL_CORE_RST_OFST) -#define CONTROL_PERIPHERAL_RST_OFST (11) //DDR3 HMem Ctrlr, GBE, Temp -#define CONTROL_PERIPHERAL_RST_MSK (0x00000001 << CONTROL_PERIPHERAL_RST_OFST) //DDR3 HMem Ctrlr, GBE, Temp -#define CONTROL_DDR3_MEM_RST_OFST (12) //only PHY, not DDR3 PLL ,Not used in software -#define CONTROL_DDR3_MEM_RST_MSK (0x00000001 << CONTROL_DDR3_MEM_RST_OFST) //only PHY, not DDR3 PLL ,Not used in software -#define CONTROL_ACQ_FIFO_CLR_OFST (14) -#define CONTROL_ACQ_FIFO_CLR_MSK (0x00000001 << CONTROL_ACQ_FIFO_CLR_OFST) -#define CONTROL_STORAGE_CELL_NUM_OFST (16) -#define CONTROL_STORAGE_CELL_NUM_MSK (0x0000000F << CONTROL_STORAGE_CELL_NUM_OFST) - -/* Reconfiguratble PLL Paramater Register */ -#define PLL_PARAM_REG (0x50 << MEM_MAP_SHIFT) - -/* Reconfiguratble PLL Control Regiser */ -#define PLL_CONTROL_REG (0x51 << MEM_MAP_SHIFT) - -#define PLL_CTRL_RECONFIG_RST_OFST (0) //parameter reset -#define PLL_CTRL_RECONFIG_RST_MSK (0x00000001 << PLL_CTRL_RECONFIG_RST_OFST) //parameter reset -#define PLL_CTRL_WR_PARAMETER_OFST (2) -#define PLL_CTRL_WR_PARAMETER_MSK (0x00000001 << PLL_CTRL_WR_PARAMETER_OFST) -#define PLL_CTRL_RST_OFST (3) -#define PLL_CTRL_RST_MSK (0x00000001 << PLL_CTRL_RST_OFST) -#define PLL_CTRL_ADDR_OFST (16) -#define PLL_CTRL_ADDR_MSK (0x0000003F << PLL_CTRL_ADDR_OFST) - -/* Sample Register (Obsolete) */ -#define SAMPLE_REG (0x59 << MEM_MAP_SHIFT) - -#define SAMPLE_ADC_SAMPLE_SEL_OFST (0) -#define SAMPLE_ADC_SAMPLE_SEL_MSK (0x00000007 << SAMPLE_ADC_SAMPLE_SEL_OFST) -#define SAMPLE_ADC_SAMPLE_0_VAL ((0x0 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_1_VAL ((0x1 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_2_VAL ((0x2 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_3_VAL ((0x3 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_4_VAL ((0x4 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_5_VAL ((0x5 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_6_VAL ((0x6 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -#define SAMPLE_ADC_SAMPLE_7_VAL ((0x7 << SAMPLE_ADC_SAMPLE_SEL_OFST) & SAMPLE_ADC_SAMPLE_SEL_MSK) -// Decimation = ADF + 1 -#define SAMPLE_ADC_DECMT_FACTOR_OFST (4) -#define SAMPLE_ADC_DECMT_FACTOR_MSK (0x00000007 << SAMPLE_ADC_DECMT_FACTOR_OFST) -#define SAMPLE_ADC_DECMT_FACTOR_0_VAL ((0x0 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_1_VAL ((0x1 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_2_VAL ((0x2 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_3_VAL ((0x3 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_4_VAL ((0x4 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_5_VAL ((0x5 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_6_VAL ((0x6 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) -#define SAMPLE_ADC_DECMT_FACTOR_7_VAL ((0x7 << SAMPLE_ADC_DECMT_FACTOR_OFST) & SAMPLE_ADC_DECMT_FACTOR_MSK) - -#define SAMPLE_DGTL_SAMPLE_SEL_OFST (8) -#define SAMPLE_DGTL_SAMPLE_SEL_MSK (0x0000000F << SAMPLE_DGTL_SAMPLE_SEL_OFST) -#define SAMPLE_DGTL_SAMPLE_0_VAL ((0x0 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_1_VAL ((0x1 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_2_VAL ((0x2 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_3_VAL ((0x3 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_4_VAL ((0x4 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_5_VAL ((0x5 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_6_VAL ((0x6 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_7_VAL ((0x7 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_8_VAL ((0x8 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_9_VAL ((0x9 << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_10_VAL ((0xa << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_11_VAL ((0xb << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_12_VAL ((0xc << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_13_VAL ((0xd << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_14_VAL ((0xe << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) -#define SAMPLE_DGTL_SAMPLE_15_VAL ((0xf << SAMPLE_DGTL_SAMPLE_SEL_OFST) & SAMPLE_DGTL_SAMPLE_SEL_MSK) - -#define SAMPLE_DGTL_DECMT_FACTOR_OFST (12) -#define SAMPLE_DGTL_DECMT_FACTOR_MSK (0x00000003 << SAMPLE_DGTL_DECMT_FACTOR_OFST) -// 1 = full speed, 2 = half speed, 4 = quarter speed -#define SAMPLE_DECMT_FACTOR_1_VAL ((0x0 << SAMPLE_DGTL_DECMT_FACTOR_OFST) & SAMPLE_DGTL_DECMT_FACTOR_MSK) -#define SAMPLE_DECMT_FACTOR_2_VAL ((0x1 << SAMPLE_DGTL_DECMT_FACTOR_OFST) & SAMPLE_DGTL_DECMT_FACTOR_MSK) -#define SAMPLE_DECMT_FACTOR_4_VAL ((0x2 << SAMPLE_DGTL_DECMT_FACTOR_OFST) & SAMPLE_DGTL_DECMT_FACTOR_MSK) - -/** Vref Comp Mod Register */ -#define VREF_COMP_MOD_REG (0x5C << MEM_MAP_SHIFT) - -#define VREF_COMP_MOD_OFST (0) -#define VREF_COMP_MOD_MSK (0x00000FFF << VREF_COMP_MOD_OFST) -#define VREF_COMP_MOD_ENABLE_OFST (31) -#define VREF_COMP_MOD_ENABLE_MSK (0x00000001 << VREF_COMP_MOD_ENABLE_OFST) - - -/** DAQ Register */ -#define DAQ_REG (0x5D << MEM_MAP_SHIFT) - -#define DAQ_SETTINGS_MSK (DAQ_HIGH_GAIN_MSK | DAQ_FIX_GAIN_MSK | DAQ_FRCE_SWTCH_GAIN_MSK) -#define DAQ_HIGH_GAIN_OFST (0) -#define DAQ_HIGH_GAIN_MSK (0x00000001 << DAQ_HIGH_GAIN_OFST) -#define DAQ_FIX_GAIN_DYNMC_VAL ((0x0 << DAQ_HIGH_GAIN_OFST) & DAQ_HIGH_GAIN_MSK) -#define DAQ_FIX_GAIN_HIGHGAIN_VAL ((0x1 << DAQ_HIGH_GAIN_OFST) & DAQ_HIGH_GAIN_MSK) -#define DAQ_FIX_GAIN_OFST (1) -#define DAQ_FIX_GAIN_MSK (0x00000003 << DAQ_FIX_GAIN_OFST) -#define DAQ_FIX_GAIN_STG_1_VAL ((0x1 << DAQ_FIX_GAIN_OFST) & DAQ_FIX_GAIN_MSK) -#define DAQ_FIX_GAIN_STG_2_VAL ((0x3 << DAQ_FIX_GAIN_OFST) & DAQ_FIX_GAIN_MSK) -#define DAQ_CMP_RST_OFST (4) -#define DAQ_CMP_RST_MSK (0x00000001 << DAQ_CMP_RST_OFST) -#define DAQ_STRG_CELL_SLCT_OFST (8) -#define DAQ_STRG_CELL_SLCT_MSK (0x0000000F << DAQ_STRG_CELL_SLCT_OFST) -#define DAQ_FRCE_SWTCH_GAIN_OFST (12) -#define DAQ_FRCE_SWTCH_GAIN_MSK (0x00000003 << DAQ_FRCE_SWTCH_GAIN_OFST) -#define DAQ_FRCE_GAIN_STG_1_VAL ((0x1 << DAQ_FRCE_SWTCH_GAIN_OFST) & DAQ_FRCE_SWTCH_GAIN_MSK) -#define DAQ_FRCE_GAIN_STG_2_VAL ((0x3 << DAQ_FRCE_SWTCH_GAIN_OFST) & DAQ_FRCE_SWTCH_GAIN_MSK) -#define DAQ_ELCTRN_CLLCTN_MDE_OFST (14) -#define DAQ_ELCTRN_CLLCTN_MDE_MSK (0x00000001 << DAQ_ELCTRN_CLLCTN_MDE_OFST) -#define DAQ_G2_CNNT_OFST (15) -#define DAQ_G2_CNNT_MSK (0x00000001 << DAQ_G2_CNNT_OFST) -#define DAQ_CRRNT_SRC_ENBL_OFST (16) -#define DAQ_CRRNT_SRC_ENBL_MSK (0x00000001 << DAQ_CRRNT_SRC_ENBL_OFST) -#define DAQ_CRRNT_SRC_CLMN_FIX_OFST (17) -#define DAQ_CRRNT_SRC_CLMN_FIX_MSK (0x00000001 << DAQ_CRRNT_SRC_CLMN_FIX_OFST) -#define DAQ_CRRNT_SRC_CLMN_SLCT_OFST (20) -#define DAQ_CRRNT_SRC_CLMN_SLCT_MSK (0x0000003F << DAQ_CRRNT_SRC_CLMN_SLCT_OFST) - -/** Chip Power Register */ -#define CHIP_POWER_REG (0x5E << MEM_MAP_SHIFT) - -#define CHIP_POWER_ENABLE_OFST (0) -#define CHIP_POWER_ENABLE_MSK (0x00000001 << CHIP_POWER_ENABLE_OFST) -#define CHIP_POWER_STATUS_OFST (1) -#define CHIP_POWER_STATUS_MSK (0x00000001 << CHIP_POWER_STATUS_OFST) - - -/** Temperature Control Register */ -#define TEMP_CTRL_REG (0x5F << MEM_MAP_SHIFT) - -#define TEMP_CTRL_PROTCT_THRSHLD_OFST (0) -#define TEMP_CTRL_PROTCT_THRSHLD_MSK (0x000007FF << TEMP_CTRL_PROTCT_THRSHLD_OFST) -#define TEMP_CTRL_PROTCT_ENABLE_OFST (16) -#define TEMP_CTRL_PROTCT_ENABLE_MSK (0x00000001 << TEMP_CTRL_PROTCT_ENABLE_OFST) -// set when temp higher than over threshold, write 1 to clear it -#define TEMP_CTRL_OVR_TMP_EVNT_OFST (31) -#define TEMP_CTRL_OVR_TMP_EVNT_MSK (0x00000001 << TEMP_CTRL_OVR_TMP_EVNT_OFST) - -/* Set Delay 64 bit register */ -#define SET_DELAY_LSB_REG (0x60 << MEM_MAP_SHIFT) // different kind of delay -#define SET_DELAY_MSB_REG (0x61 << MEM_MAP_SHIFT) // different kind of delay - -/* Set Cycles 64 bit register */ -#define SET_CYCLES_LSB_REG (0x62 << MEM_MAP_SHIFT) -#define SET_CYCLES_MSB_REG (0x63 << MEM_MAP_SHIFT) - -/* Set Frames 64 bit register */ -#define SET_FRAMES_LSB_REG (0x64 << MEM_MAP_SHIFT) -#define SET_FRAMES_MSB_REG (0x65 << MEM_MAP_SHIFT) - -/* Set Period 64 bit register tT = T x 50 ns */ -#define SET_PERIOD_LSB_REG (0x66 << MEM_MAP_SHIFT) -#define SET_PERIOD_MSB_REG (0x67 << MEM_MAP_SHIFT) - -/* Set Exposure Time 64 bit register eEXP = Exp x 25 ns */ -#define SET_EXPTIME_LSB_REG (0x68 << MEM_MAP_SHIFT) -#define SET_EXPTIME_MSB_REG (0x69 << MEM_MAP_SHIFT) - -/* Trigger Delay 32 bit register */ -#define SET_TRIGGER_DELAY_LSB_REG (0x70 << MEM_MAP_SHIFT) -#define SET_TRIGGER_DELAY_MSB_REG (0x71 << MEM_MAP_SHIFT) - -/* Module Coordinates Register 0 */ -#define COORD_0_REG (0x7C << MEM_MAP_SHIFT) - -#define COORD_0_Y_OFST (0) -#define COORD_0_Y_MSK (0x0000FFFF << COORD_0_Y_OFST) -#define COORD_0_X_OFST (16) -#define COORD_0_X_MSK (0x0000FFFF << COORD_0_X_OFST) - -/* Module Coordinates Register 1 */ -#define COORD_1_REG (0x7D << MEM_MAP_SHIFT) - -#define COORD_0_Z_OFST (0) -#define COORD_0_Z_MSK (0x0000FFFF << COORD_0_Z_OFST) - -/* ASIC Control Register */ -#define ASIC_CTRL_REG (0x7F << MEM_MAP_SHIFT) -// tPC = (PCT + 1) * 25ns -#define ASIC_CTRL_PRCHRG_TMR_OFST (0) -#define ASIC_CTRL_PRCHRG_TMR_MSK (0x000000FF << ASIC_CTRL_PRCHRG_TMR_OFST) -#define ASIC_CTRL_PRCHRG_TMR_VAL ((0x1F << ASIC_CTRL_PRCHRG_TMR_OFST) & ASIC_CTRL_PRCHRG_TMR_MSK) -// tDS = (DST + 1) * 25ns -#define ASIC_CTRL_DS_TMR_OFST (8) -#define ASIC_CTRL_DS_TMR_MSK (0x000000FF << ASIC_CTRL_DS_TMR_OFST) -#define ASIC_CTRL_DS_TMR_VAL ((0x1F << ASIC_CTRL_DS_TMR_OFST) & ASIC_CTRL_DS_TMR_MSK) -// tET = (ET + 1) * 25ns (increase timeout range between 2 consecutive storage cells) -#define ASIC_CTRL_EXPSRE_TMR_OFST (16) -#define ASIC_CTRL_EXPSRE_TMR_MSK (0x0000FFFF << ASIC_CTRL_EXPSRE_TMR_OFST) - - -#endif //REGISTERS_G_H - - - - - - - - - - - - - - - diff --git a/slsDetectorSoftware/jungfrauDetectorServer/ansi.h b/slsDetectorSoftware/jungfrauDetectorServer/ansi.h deleted file mode 120000 index a122db0ad..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/ansi.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServer_virtual b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServer_virtual deleted file mode 100755 index cc33a28696be6e4c77f402d4341231026e5cfe6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97960 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 }feF`Y4%q`XytfDzfd0 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 Rx5@|KSK$4Z^UC%A{{S_k!m|JX diff --git a/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv4.0.1.0 b/slsDetectorSoftware/jungfrauDetectorServer/bin/jungfrauDetectorServerv4.0.1.0 deleted file mode 100755 index b22ca4178e31b2190750311dbbc3078f0d2ed002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116720 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 diff --git a/slsDetectorSoftware/jungfrauDetectorServer/blackfin.h b/slsDetectorSoftware/jungfrauDetectorServer/blackfin.h deleted file mode 120000 index 2873c7dc6..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/blackfin.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/blackfin.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/commonServerFunctions.h b/slsDetectorSoftware/jungfrauDetectorServer/commonServerFunctions.h deleted file mode 120000 index 33bdd8d53..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/commonServerFunctions.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/commonServerFunctions.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt b/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt deleted file mode 100644 index fedb3b251..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/jungfrauDetectorServer -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: f747c908dc4ece72acd29e5b677049b44e5b7da4 -Revision: 167 -Branch: 4.0.1-rc -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4049 -Last Changed Date: 2019-01-07 11:38:36.000000002 +0100 ./RegisterDefs.h diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h deleted file mode 100644 index 148c61817..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrau.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "f747c908dc4ece72acd29e5b677049b44e5b7da4" -#define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4049 -#define GITDATE 0x20190107 -#define GITBRANCH "4.0.1-rc" diff --git a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrauTmp.h b/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrauTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/gitInfoJungfrauTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorSoftware/jungfrauDetectorServer/programfpga.h b/slsDetectorSoftware/jungfrauDetectorServer/programfpga.h deleted file mode 120000 index 72c54d21d..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/programfpga.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/programfpga.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c deleted file mode 100644 index 38d841538..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.c +++ /dev/null @@ -1,1762 +0,0 @@ -//#ifdef SLS_DETECTOR_FUNCTION_LIST - - -#include "slsDetectorFunctionList.h" -#include "gitInfoJungfrau.h" -#include "AD9257.h" // include "commonServerFunctions.h", which in turn includes "blackfin.h" -#include "programfpga.h" -#include "versionAPI.h" - -#ifdef VIRTUAL -#include -#include -#endif -/* global variables */ -//jungfrau doesnt require chips and chans (save memory) -sls_detector_module *detectorModules=NULL; -dacs_t *detectorDacs=NULL; -dacs_t *detectorAdcs=NULL; - -enum detectorSettings thisSettings; -enum masterFlags masterMode = NO_MASTER; - -int highvoltage = 0; -int dacValues[NDAC]; -int32_t clkPhase[2] = {0, 0}; - -#ifdef VIRTUAL -pthread_t pthread_virtual_tid; -int virtual_status = 0; -int virtual_stop = 0; -#endif - - -/* basic tests */ - -int firmware_compatibility = OK; -int firmware_check_done = 0; -char firmware_message[MAX_STR_LENGTH]; - -int isFirmwareCheckDone() { - return firmware_check_done; -} - -int getFirmwareCheckResult(char** mess) { - *mess = firmware_message; - return firmware_compatibility; -} - -void checkFirmwareCompatibility(int flag) { -#ifdef VIRTUAL - cprintf(BLUE,"\n\n" - "********************************************************\n" - "************** Jungfrau Virtual Server *****************\n" - "********************************************************\n\n"); - if (mapCSP0() == FAIL) { - strcpy(firmware_message, - "FATAL ERROR: Could not map to memory. Dangerous to continue.\n"); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - firmware_check_done = 1; - return; -#endif - - defineGPIOpins(); - resetFPGA(); - if (mapCSP0() == FAIL) { - strcpy(firmware_message, - "FATAL ERROR: Could not map to memory. Dangerous to continue.\n"); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - - // does check only if flag is 0 (by default), set by command line - if ((!flag) && ((checkType() == FAIL) || (testFpga() == FAIL) || (testBus() == FAIL))) { - strcpy(firmware_message, - "FATAL ERROR: Could not pass basic tests of FPGA and bus. Dangerous to continue.\n"); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - - uint16_t hversion = getHardwareVersionNumber(); - uint16_t hsnumber = getHardwareSerialNumber(); - uint32_t ipadd = getDetectorIP(); - uint64_t macadd = getDetectorMAC(); - int64_t fwversion = getDetectorId(DETECTOR_FIRMWARE_VERSION); - int64_t swversion = getDetectorId(DETECTOR_SOFTWARE_VERSION); - int64_t sw_fw_apiversion = 0; - int64_t client_sw_apiversion = getDetectorId(CLIENT_SOFTWARE_API_VERSION); - - - if (fwversion >= MIN_REQRD_VRSN_T_RD_API) - sw_fw_apiversion = getDetectorId(SOFTWARE_FIRMWARE_API_VERSION); - cprintf(BLUE,"\n\n" - "********************************************************\n" - "****************** Jungfrau Server *********************\n" - "********************************************************\n\n" - "Hardware Version:\t\t 0x%x\n" - "Hardware Serial Nr:\t\t 0x%x\n" - - "Detector IP Addr:\t\t 0x%x\n" - "Detector MAC Addr:\t\t 0x%llx\n\n" - - "Firmware Version:\t\t 0x%llx\n" - "Software Version:\t\t 0x%llx\n" - "F/w-S/w API Version:\t\t 0x%llx\n" - "Required Firmware Version:\t 0x%x\n" - "Client-Software API Version:\t 0x%llx\n" - "\n" - "********************************************************\n", - hversion, hsnumber, - ipadd, - (long long unsigned int)macadd, - (long long int)fwversion, - (long long int)swversion, - (long long int)sw_fw_apiversion, - REQRD_FRMWR_VRSN, - (long long int)client_sw_apiversion - ); - - // return if flag is not zero, debug mode - if (flag) { - firmware_check_done = 1; - return; - } - - - //cant read versions - printf("Testing Firmware-software compatibility ...\n"); - if(!fwversion || !sw_fw_apiversion){ - strcpy(firmware_message, - "FATAL ERROR: Cant read versions from FPGA. Please update firmware.\n"); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - - //check for API compatibility - old server - if(sw_fw_apiversion > REQRD_FRMWR_VRSN){ - sprintf(firmware_message, - "FATAL ERROR: This detector software software version (0x%llx) is incompatible.\n" - "Please update detector software (min. 0x%llx) to be compatible with this firmware.\n", - (long long int)sw_fw_apiversion, - (long long int)REQRD_FRMWR_VRSN); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - - //check for firmware compatibility - old firmware - if( REQRD_FRMWR_VRSN > fwversion){ - sprintf(firmware_message, - "FATAL ERROR: This firmware version (0x%llx) is incompatible.\n" - "Please update firmware (min. 0x%llx) to be compatible with this server.\n", - (long long int)fwversion, - (long long int)REQRD_FRMWR_VRSN); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - printf("Compatibility - success\n"); - firmware_check_done = 1; -} - - -int checkType() { -#ifdef VIRTUAL - return OK; -#endif - volatile u_int32_t type = ((bus_r(FPGA_VERSION_REG) & DETECTOR_TYPE_MSK) >> DETECTOR_TYPE_OFST); - if (type != JUNGFRAU){ - cprintf(BG_RED,"This is not a Jungfrau Server (read %d, expected %d)\n",type, JUNGFRAU); - return FAIL; - } - - return OK; -} - - - -u_int32_t testFpga(void) { -#ifdef VIRTUAL - return OK; -#endif - printf("\nTesting FPGA...\n"); - - //fixed pattern - int ret = OK; - volatile u_int32_t val = bus_r(FIX_PATT_REG); - if (val == FIX_PATT_VAL) { - printf("Fixed pattern: successful match 0x%08x\n",val); - } else { - cprintf(RED,"Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL); - ret = FAIL; - } - return ret; -} - - -int testBus() { -#ifdef VIRTUAL - return OK; -#endif - printf("\nTesting Bus...\n"); - - int ret = OK; - u_int32_t addr = SET_TRIGGER_DELAY_LSB_REG; - int times = 1000 * 1000; - int i = 0; - - for (i = 0; i < times; ++i) { - bus_w(addr, i * 100); - if (i * 100 != bus_r(addr)) { - cprintf(RED,"ERROR: Mismatch! Wrote 0x%x, read 0x%x\n", - i * 100, bus_r(addr)); - ret = FAIL; - } - } - - bus_w(addr, 0); - - if (ret == OK) - printf("Successfully tested bus %d times\n", times); - return ret; -} - - -int moduleTest( enum digitalTestMode arg, int imod){ - return OK; -} - -int detectorTest( enum digitalTestMode arg){ -#ifdef VIRTUAL - return OK; -#endif - switch(arg){ - case DETECTOR_FIRMWARE_TEST: return testFpga(); - case DETECTOR_BUS_TEST: return testBus(); - //DETECTOR_MEMORY_TEST:testRAM - //DETECTOR_SOFTWARE_TEST: - default: - cprintf(RED,"Warning: Test not implemented for this detector %d\n", (int)arg); - break; - } - return OK; -} - - - - - -/* Ids */ - -int64_t getDetectorId(enum idMode arg){ - int64_t retval = -1; - - switch(arg){ - case DETECTOR_SERIAL_NUMBER: - return getDetectorNumber();// or getDetectorMAC() - case DETECTOR_FIRMWARE_VERSION: - return getFirmwareVersion(); - case SOFTWARE_FIRMWARE_API_VERSION: - return getFirmwareAPIVersion(); - case DETECTOR_SOFTWARE_VERSION: - return (GITDATE & 0xFFFFFF); - case CLIENT_SOFTWARE_API_VERSION: - return APIJUNGFRAU; - default: - return retval; - } -} - -u_int64_t getFirmwareVersion() { -#ifdef VIRTUAL - return 0; -#endif - return ((bus_r(FPGA_VERSION_REG) & BOARD_REVISION_MSK) >> BOARD_REVISION_OFST); -} - -u_int64_t getFirmwareAPIVersion() { -#ifdef VIRTUAL - return 0; -#endif - return ((bus_r(API_VERSION_REG) & API_VERSION_MSK) >> API_VERSION_OFST); -} - -u_int16_t getHardwareVersionNumber() { -#ifdef VIRTUAL - return 0; -#endif - return ((bus_r(MOD_SERIAL_NUM_REG) & HARDWARE_VERSION_NUM_MSK) >> HARDWARE_VERSION_NUM_OFST); -} - -u_int16_t getHardwareSerialNumber() { -#ifdef VIRTUAL - return 0; -#endif - return ((bus_r(MOD_SERIAL_NUM_REG) & HARDWARE_SERIAL_NUM_MSK) >> HARDWARE_SERIAL_NUM_OFST); -} - -u_int32_t getDetectorNumber(){ -#ifdef VIRTUAL - return 0; -#endif - return bus_r(MOD_SERIAL_NUM_REG); -} - -u_int64_t getDetectorMAC() { -#ifdef VIRTUAL - return 0; -#else - char output[255],mac[255]=""; - u_int64_t res=0; - FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - return res; -#endif -} - -u_int32_t getDetectorIP(){ -#ifdef VIRTUAL - return 0; -#endif - char temp[50]=""; - u_int32_t res=0; - //execute and get address - char output[255]; - FILE* sysFile = popen("ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - - //converting IPaddress to hex. - char* pcword = strtok (output,"."); - while (pcword != NULL) { - sprintf(output,"%02x",atoi(pcword)); - strcat(temp,output); - pcword = strtok (NULL, "."); - } - strcpy(output,temp); - sscanf(output, "%x", &res); - //printf("ip:%x\n",res); - - return res; -} - - - - - - - - -/* initialization */ - -void initControlServer(){ - clkPhase[0] = 0; clkPhase[1] = 0; - setupDetector(); - printf("\n"); -} - - - -void initStopServer() { - - usleep(CTRL_SRVR_INIT_TIME_US); - if (mapCSP0() == FAIL) { - cprintf(BG_RED, "Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"); - exit(EXIT_FAILURE); - } -} - - - - - - -/* set up detector */ - -void allocateDetectorStructureMemory(){ - printf("This Server is for 1 Jungfrau module (500k)\n"); - - //Allocation of memory - if (detectorModules!=NULL) free(detectorModules); - if (detectorDacs!=NULL) free(detectorDacs); - if (detectorAdcs!=NULL) free(detectorAdcs); - detectorModules=malloc(sizeof(sls_detector_module)); - detectorDacs=malloc(NDAC*sizeof(dacs_t)); - detectorAdcs=malloc(NADC*sizeof(dacs_t)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); - printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); - printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); -#endif - (detectorModules)->dacs=detectorDacs; - (detectorModules)->adcs=detectorAdcs; - (detectorModules)->ndac=NDAC; - (detectorModules)->nadc=NADC; - (detectorModules)->nchip=NCHIP; - (detectorModules)->nchan=NCHIP*NCHAN; - (detectorModules)->module=0; - (detectorModules)->gain=0; - (detectorModules)->offset=0; - (detectorModules)->reg=0; - thisSettings = UNINITIALIZED; - - { // initialize to -1 - int i = 0; - for (i = 0; i < NDAC; ++i) { - dacValues[i] = -1; - } - } -} - - - -void setupDetector() { - - allocateDetectorStructureMemory(); - - printf("Resetting PLL\n"); - resetPLL(); - resetCore(); - resetPeripheral(); - cleanFifos(); -#ifndef VIRTUAL - prepareADC(); -#endif - // initialize dac series - initDac(0); /* todo might work without */ - initDac(8); //only for old board compatibility - - //set dacs - setDefaultDacs(); - - bus_w(DAQ_REG, 0x0); /* Only once at server startup */ - - setSpeed(CLOCK_DIVIDER, HALF_SPEED); - cleanFifos(); - resetCore(); - - configureASICTimer(); - bus_w(ADC_PORT_INVERT_REG, ADC_PORT_INVERT_VAL); - - //Initialization of acquistion parameters - setSettings(DEFAULT_SETTINGS,-1); - - setTimer(FRAME_NUMBER, DEFAULT_NUM_FRAMES); - setTimer(CYCLES_NUMBER, DEFAULT_NUM_CYCLES); - setTimer(ACQUISITION_TIME, DEFAULT_EXPTIME); - setTimer(FRAME_PERIOD, DEFAULT_PERIOD); - setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY); - setTimer(STORAGE_CELL_NUMBER, DEFAULT_NUM_STRG_CLLS); - selectStoragecellStart(DEFAULT_STRG_CLL_STRT); - /*setSpeed(CLOCK_DIVIDER, HALF_SPEED); depends if all the previous stuff works*/ - setTiming(DEFAULT_TIMING_MODE); - setHighVoltage(DEFAULT_HIGH_VOLTAGE); - - /* temporary set up until new firmware fixes bug */ - // set temperature threshold - setThresholdTemperature(DEFAULT_TMP_THRSHLD); - // reset temp event - setTemperatureEvent(0); - - -} - - -int setDefaultDacs() { - int ret = OK; - printf("Setting Default Dac values\n"); - { - int i = 0; - int retval[2]={-1,-1}; - const int defaultvals[NDAC] = DEFAULT_DAC_VALS; - for(i = 0; i < NDAC; ++i) { - // if not already default, set it to default - if (dacValues[i] != defaultvals[i]) { - setDAC((enum DACINDEX)i,defaultvals[i],0,0,retval); - if (retval[0] != defaultvals[i]) { - cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); - ret = FAIL; - } - } - } - } - return ret; -} - - - - -/* firmware functions (resets) */ - -int powerChip (int on){ - if(on != -1){ - if(on){ - cprintf(BLUE, "\n*** Powering on the chip ***\n"); - bus_w(CHIP_POWER_REG, bus_r(CHIP_POWER_REG) | CHIP_POWER_ENABLE_MSK); - } - else{ - cprintf(BLUE, "\n*** Powering off the chip*** \n"); - bus_w(CHIP_POWER_REG, bus_r(CHIP_POWER_REG) & ~CHIP_POWER_ENABLE_MSK); - } - } - - //return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_ENABLE_MSK) >> CHIP_POWER_ENABLE_OFST); - /**temporary fix until power reg status can be read */ - return ((bus_r(CHIP_POWER_REG) & CHIP_POWER_STATUS_MSK) >> CHIP_POWER_STATUS_OFST); -} - - - -int autoCompDisable(int on) { - if(on != -1){ - if(on){ - cprintf(BLUE, "\n*** Auto comp disable mode: enabling ***\n"); - bus_w(VREF_COMP_MOD_REG, bus_r(VREF_COMP_MOD_REG) | VREF_COMP_MOD_ENABLE_MSK); - } - else{ - cprintf(BLUE, "\n*** Auto comp disable mode: disabling *** \n"); - bus_w(VREF_COMP_MOD_REG, bus_r(VREF_COMP_MOD_REG) & ~VREF_COMP_MOD_ENABLE_MSK); - } - } - - return (bus_r(VREF_COMP_MOD_REG) & VREF_COMP_MOD_ENABLE_MSK); -} - - -void cleanFifos() { -#ifdef VIRTUAL - return; -#endif - printf("\nClearing Acquisition Fifos\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_ACQ_FIFO_CLR_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_ACQ_FIFO_CLR_MSK); -} - -void resetCore() { -#ifdef VIRTUAL - return; -#endif - printf("\nResetting Core\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CORE_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CORE_RST_MSK); -} - -void resetPeripheral() { -#ifdef VIRTUAL - return; -#endif - printf("\nResetting Peripheral\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PERIPHERAL_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PERIPHERAL_RST_MSK); -} - -int adcPhase(int st){ /**carlos needed clkphase 1 and 2? cehck with Aldo */ - printf("Setting ADC Phase to %d\n",st); - if (st > 65535 || st < -65535) - return clkPhase[0]; - - clkPhase[1] = st - clkPhase[0]; - if (clkPhase[1] == 0) - return clkPhase[0]; - - configurePll(); - clkPhase[0] = st; - return clkPhase[0]; -} - -int getPhase() { - return clkPhase[0]; -} - -void configureASICTimer() { - printf("\nConfiguring ASIC Timer\n"); - bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_PRCHRG_TMR_MSK) | ASIC_CTRL_PRCHRG_TMR_VAL); - bus_w(ASIC_CTRL_REG, (bus_r(ASIC_CTRL_REG) & ~ASIC_CTRL_DS_TMR_MSK) | ASIC_CTRL_DS_TMR_VAL); -} - - - - - - - - -/* set parameters - nmod, dr, roi */ - -int setNMod(int nm, enum dimension dim){ - return NMOD; -} - - -int getNModBoard(enum dimension arg){ - return NMAXMOD; -} - - -int setDynamicRange(int dr){ - return DYNAMIC_RANGE; -} - - - - -/* parameters - readout */ - -int setSpeed(enum speedVariable arg, int val) { - - if (arg != CLOCK_DIVIDER) - return -1; - - // setting - if(val >= 0) { - - // stop state machine if running - if(runBusy()) - stopStateMachine(); - - uint32_t txndelay_msk = 0; - - switch(val){ - - // todo in firmware, for now setting half speed - case FULL_SPEED://40 - printf("\nSetting Half Speed (20 MHz):\n"); - - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED); - bus_w(SAMPLE_REG, SAMPLE_ADC_HALF_SPEED); - - txndelay_msk = (bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK); // read config tdma timeslot value - printf("Setting Config Reg to 0x%x\n", CONFIG_HALF_SPEED | txndelay_msk); - bus_w(CONFIG_REG, CONFIG_HALF_SPEED | txndelay_msk); - - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL); - bus_w(ADC_OFST_REG, ADC_OFST_HALF_SPEED_VAL); - - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED); - adcPhase(ADC_PHASE_HALF_SPEED); - - break; - case HALF_SPEED: - printf("\nSetting Half Speed (20 MHz):\n"); - - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_HALF_SPEED); - bus_w(SAMPLE_REG, SAMPLE_ADC_HALF_SPEED); - - txndelay_msk = (bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK); // read config tdma timeslot value - printf("Setting Config Reg to 0x%x\n", CONFIG_HALF_SPEED | txndelay_msk); - bus_w(CONFIG_REG, CONFIG_HALF_SPEED | txndelay_msk); - - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_HALF_SPEED_VAL); - bus_w(ADC_OFST_REG, ADC_OFST_HALF_SPEED_VAL); - - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_HALF_SPEED); - adcPhase(ADC_PHASE_HALF_SPEED); - - break; - case QUARTER_SPEED: - printf("\nSetting Half Speed (10 MHz):\n"); - - printf("Setting Sample Reg to 0x%x\n", SAMPLE_ADC_QUARTER_SPEED); - bus_w(SAMPLE_REG, SAMPLE_ADC_QUARTER_SPEED); - - txndelay_msk = (bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK); // read config tdma timeslot value - printf("Setting Config Reg to 0x%x\n", CONFIG_QUARTER_SPEED | txndelay_msk); - bus_w(CONFIG_REG, CONFIG_QUARTER_SPEED | txndelay_msk); - - printf("Setting ADC Ofst Reg to 0x%x\n", ADC_OFST_QUARTER_SPEED_VAL); - bus_w(ADC_OFST_REG, ADC_OFST_QUARTER_SPEED_VAL); - - printf("Setting ADC Phase Reg to 0x%x\n", ADC_PHASE_QUARTER_SPEED); - adcPhase(ADC_PHASE_QUARTER_SPEED); - - break; - } - printf("\n"); - } - - //getting - u_int32_t speed = bus_r(CONFIG_REG) & CONFIG_READOUT_SPEED_MSK; - switch(speed){ - case CONFIG_FULL_SPEED_40MHZ_VAL: - return FULL_SPEED; - case CONFIG_HALF_SPEED_20MHZ_VAL: - return HALF_SPEED; - case CONFIG_QUARTER_SPEED_10MHZ_VAL: - return QUARTER_SPEED; - default: - return -1; - } -} - - - - - - -/* parameters - timer */ -int selectStoragecellStart(int pos) { - if (pos >= 0) { - bus_w(DAQ_REG, bus_r(DAQ_REG) & ~DAQ_STRG_CELL_SLCT_MSK); - bus_w(DAQ_REG, bus_r(DAQ_REG) | ((pos << DAQ_STRG_CELL_SLCT_OFST) & DAQ_STRG_CELL_SLCT_MSK)); - } - return ((bus_r(DAQ_REG) & DAQ_STRG_CELL_SLCT_MSK) >> DAQ_STRG_CELL_SLCT_OFST); -} - - - -int64_t setTimer(enum timerIndex ind, int64_t val) { - - int64_t retval = -1; - switch(ind){ - - case FRAME_NUMBER: - if(val >= 0) - printf("\nSetting #frames: %lld\n",(long long int)val); - retval = set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); - printf("Getting #frames: %lld\n",(long long int)retval); - break; - - case ACQUISITION_TIME: - if(val >= 0){ - printf("\nSetting exptime: %lldns\n", (long long int)val); - val *= (1E-3 * CLK_RUN); - val -= ACQ_TIME_MIN_CLOCK; - if(val < 0) val = 0; - } - retval = (set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) + ACQ_TIME_MIN_CLOCK) / (1E-3 * CLK_RUN); - printf("Getting exptime: %lldns\n", (long long int)retval); - break; - - case FRAME_PERIOD: - if(val >= 0){ - printf("\nSetting period to %lldns\n",(long long int)val); - val *= (1E-3 * CLK_SYNC); - } - retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * CLK_SYNC); - printf("Getting period: %lldns\n", (long long int)retval); - break; - - case DELAY_AFTER_TRIGGER: - if(val >= 0){ - printf("\nSetting delay to %lldns\n", (long long int)val); - val *= (1E-3 * CLK_SYNC); - } - retval = set64BitReg(val, SET_TRIGGER_DELAY_LSB_REG, SET_TRIGGER_DELAY_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting delay: %lldns\n", (long long int)retval); - break; - - case CYCLES_NUMBER: - if(val >= 0) - printf("\nSetting #cycles to %lld\n", (long long int)val); - retval = set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); - printf("Getting #cycles: %lld\n", (long long int)retval); - break; - - case STORAGE_CELL_NUMBER: - if(val >= 0) { - printf("\nSetting #storage cells to %lld\n", (long long int)val); - bus_w(CONTROL_REG, (bus_r(CONTROL_REG) & ~CONTROL_STORAGE_CELL_NUM_MSK) | - ((val << CONTROL_STORAGE_CELL_NUM_OFST) & CONTROL_STORAGE_CELL_NUM_MSK)); - } - retval = ((bus_r(CONTROL_REG) & CONTROL_STORAGE_CELL_NUM_MSK) >> CONTROL_STORAGE_CELL_NUM_OFST); - printf("Getting #storage cells: %lld\n", (long long int)retval); - break; - - default: - cprintf(RED,"Warning: Timer Index not implemented for this detector: %d\n", ind); - break; - } - - return retval; - -} - - - -int64_t getTimeLeft(enum timerIndex ind){ -#ifdef VIRTUAL - return 0; -#endif - int64_t retval = -1; - switch(ind){ - - case FRAME_NUMBER: - retval = get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); - printf("Getting number of frames left: %lld\n",(long long int)retval); - break; - - case FRAME_PERIOD: - retval = get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting period left: %lldns\n", (long long int)retval); - break; -/* - case DELAY_AFTER_TRIGGER: - retval = get64BitReg(xxx) / (1E-3 * CLK_SYNC); - printf("Getting delay left: %lldns\n", (long long int)retval); - break; -*/ - case CYCLES_NUMBER: - retval = get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); - printf("Getting number of cycles left: %lld\n", (long long int)retval); - break; - - case ACTUAL_TIME: - retval = get64BitReg(TIME_FROM_START_LSB_REG, TIME_FROM_START_MSB_REG) / (1E-9 * CLK_SYNC); - printf("Getting actual time (time from start): %lld\n", (long long int)retval); - break; - - case MEASUREMENT_TIME: - retval = get64BitReg(START_FRAME_TIME_LSB_REG, START_FRAME_TIME_MSB_REG) / (1E-9 * CLK_SYNC); - printf("Getting measurement time (timestamp/ start frame time): %lld\n", (long long int)retval); - break; - - case FRAMES_FROM_START: - case FRAMES_FROM_START_PG: - retval = get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - printf("Getting frames from start run control %lld\n", (long long int)retval); - break; - - default: - cprintf(RED, "Warning: Remaining Timer index not implemented for this detector: %d\n", ind); - break; - } - - return retval; -} - - - - - - -/* parameters - channel, chip, module, settings */ - - -int setModule(sls_detector_module myMod){ - int retval[2]; - int i; - - //#ifdef VERBOSE - printf("Setting module with settings %d\n",myMod.reg); - //#endif - - setSettings( (enum detectorSettings)myMod.reg,-1); - - //copy module locally - if (detectorModules) - copyModule(detectorModules,&myMod); - - //set dac values - for(i=0;i vmax)) { - cprintf(RED,"Voltage value (to convert to dac value) is outside bounds: %d\n", value); - return -1; - } - return (int)(((value - vmin) / (vmax - vmin)) * (nsteps - 1) + 0.5); -} - -int dacToVoltage(unsigned int digital){ - int vmin = 0; - int vmax = 2500; - int nsteps = 4096; - int v = vmin + (vmax - vmin) * digital / (nsteps - 1); - if((v < 0) || (v > nsteps - 1)) { - cprintf(RED,"Voltage value (converted from dac value) is outside bounds: %d\n", v); - return -1; - } - return v; -} - - - -void setDAC(enum DACINDEX ind, int val, int imod, int mV, int retval[]){ - int dacval = val; - - //if set and mv, convert to dac - if (val > 0 && mV) { - val = voltageToDac(val); //gives -1 on error - } - - if ( (val >= 0) || (val == -100)) { -#ifdef VIRTUAL - dacValues[ind] = dacval; -#else - u_int32_t codata; - int csdx = ind / NDAC + DAC_SERIAL_CS_OUT_OFST; // old board (16 dacs),so can be DAC_SERIAL_CS_OUT_OFST or +1 - int dacchannel = ind % NDAC; // 0-8, dac channel number (also for dacnum 9-15 in old board) - - printf("\nSetting of DAC %d : %d dac units (%d mV)\n",ind, dacval, val); - // command - if (val >= 0) { - printf(" Write to Input Register and Update\n"); - codata = LTC2620_DAC_CMD_SET; - - } else if (val == -100) { - printf(" POWER DOWN\n"); - codata = LTC2620_DAC_CMD_POWER_DOWN; - } - // address - printf(" Chip select bit:%d\n" - " Dac Channel:0x%x\n" - " Dac Value:0x%x\n", - csdx, dacchannel, val); - codata += ((dacchannel << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) + - ((val << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK); - // to spi - serializeToSPI(SPI_REG, codata, (0x1 << csdx), LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); - - dacValues[ind] = dacval; - - if (ind == VREF_COMP) { - bus_w (VREF_COMP_MOD_REG, (bus_r(VREF_COMP_MOD_REG) &~ (VREF_COMP_MOD_MSK)) // reset - | ((val << VREF_COMP_MOD_OFST) & VREF_COMP_MOD_MSK)); // or it with value - } -#endif - } - - printf("Getting DAC %d : ",ind); - retval[0] = dacValues[ind]; printf("%d dac units ", retval[0]); - retval[1] = dacToVoltage(retval[0]);printf("(%d mV)\n", retval[1]); -} - - -int getADC(enum ADCINDEX ind, int imod){ -#ifdef VIRTUAL - return 0; -#endif - char tempnames[2][40]={"VRs/FPGAs Temperature", "ADCs/ASICs Temperature"}; - printf("Getting Temperature for %s\n",tempnames[ind]); - u_int32_t addr = GET_TEMPERATURE_TMP112_REG; - uint32_t regvalue = bus_r(addr); - uint32_t value = regvalue & TEMPERATURE_VALUE_MSK; - double retval = value; - - // negative - if (regvalue & TEMPERATURE_POLARITY_MSK) { - // 2s complement - int ret = (~value) + 1; - // attach negative sign - ret = 0 - value; - retval = ret; - } - - // conversion - retval *= 625.0/10.0; - printf("\nReal Temperature %s: %f °C\n",tempnames[ind],retval/1000.00); - return retval; -} - - - -int setHighVoltage(int val){ -#ifdef VIRTUAL - if (val >= 0) - highvoltage = val; - return highvoltage; -#endif - u_int32_t dacvalue; - float alpha = 0.55; - // setting hv - if (val >= 0) { - // limit values - if (val < 60) { - dacvalue = 0; - val = 0; - } else if (val >= 200) { - dacvalue = 0x1; - val = 200; - } else { - dacvalue = 1. + (200.-val) / alpha; - val=200.-(dacvalue-1)*alpha; - } - printf ("\nSetting High voltage to %d (dacval %d)\n",val, dacvalue); - dacvalue &= MAX1932_HV_DATA_MSK; - serializeToSPI(SPI_REG, dacvalue, HV_SERIAL_CS_OUT_MSK, MAX1932_HV_NUMBITS, - HV_SERIAL_CLK_OUT_MSK, HV_SERIAL_DIGITAL_OUT_MSK, HV_SERIAL_DIGITAL_OUT_OFST); - highvoltage = val; - } - return highvoltage; -} - - - - - - -/* parameters - timing, extsig */ - - -enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ - - if(arg != GET_EXTERNAL_COMMUNICATION_MODE){ - switch((int)arg){ - case AUTO_TIMING: bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) & ~EXT_SIGNAL_MSK); break; - case TRIGGER_EXPOSURE: bus_w(EXT_SIGNAL_REG, bus_r(EXT_SIGNAL_REG) | EXT_SIGNAL_MSK); break; - default: - cprintf(RED,"Unknown timing mode %d\n", arg); - return GET_EXTERNAL_COMMUNICATION_MODE; - } - } - if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) - return TRIGGER_EXPOSURE; - return AUTO_TIMING; -} - - - - - -/* configure mac */ - - -long int calcChecksum(int sourceip, int destip) { - - ip_header ip; - int count; - unsigned short *addr; - long int sum = 0; - long int checksum; - ip.ip_ver = 0x4; - ip.ip_ihl = 0x5; - ip.ip_tos = 0x0; - ip.ip_len = IP_PACKETSIZE; - ip.ip_ident = 0x0000; - ip.ip_flag = 0x2; //not nibble aligned (flag& offset - ip.ip_offset = 0x000; - ip.ip_ttl = 0x40; - ip.ip_protocol = 0x11; - ip.ip_chksum = 0x0000 ; // pseudo - ip.ip_sourceip = sourceip; - ip.ip_destip = destip; - - count = sizeof(ip); - addr =& (ip); /* warning: assignment from incompatible pointer type */ - while( count > 1 ) { - sum += *addr++; - count -= 2; - } - if (count > 0) sum += *addr; // Add left-over byte, if any - while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - checksum = (~sum) & 0xffff; - - printf("IP checksum is 0x%lx\n",checksum); - - return checksum; -} - - - -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival){ -#ifdef VIRTUAL - return 0; -#endif - cprintf(BLUE, "\n*** Configuring MAC ***\n"); - uint32_t sourceport = DEFAULT_TX_UDP_PORT; - - printf("Source IP : %d.%d.%d.%d \t\t(0x%08x)\n",(sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip); - printf("Source MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((sourcemac>>40)&0xFF), - (unsigned int)((sourcemac>>32)&0xFF), - (unsigned int)((sourcemac>>24)&0xFF), - (unsigned int)((sourcemac>>16)&0xFF), - (unsigned int)((sourcemac>>8)&0xFF), - (unsigned int)((sourcemac>>0)&0xFF), - (long long unsigned int)sourcemac); - printf("Source Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport); - - printf("Dest. IP : %d.%d.%d.%d \t\t(0x%08x)\n",(destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip); - printf("Dest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((destmac>>40)&0xFF), - (unsigned int)((destmac>>32)&0xFF), - (unsigned int)((destmac>>24)&0xFF), - (unsigned int)((destmac>>16)&0xFF), - (unsigned int)((destmac>>8)&0xFF), - (unsigned int)((destmac>>0)&0xFF), - (long long unsigned int)destmac); - printf("Dest. Port : %d \t\t\t(0x%08x)\n",udpport, udpport); - - long int checksum=calcChecksum(sourceip, destip); - bus_w(TX_IP_REG, sourceip); - bus_w(RX_IP_REG, destip); - -/* - bus_w(TX_MAC_LSB_REG,(destmac>>32)&0xFFFFFFFF);//rx_udpmacH_AReg_c - bus_w(TX_MAC_MSB_REG,(destmac)&0xFFFFFFFF);//rx_udpmacL_AReg_c - bus_w(RX_MAC_MSB_REG,(sourcemac>>32)&0xFFFFFFFF);//detectormacH_AReg_c - bus_w(RX_MAC_LSB_REG,(sourcemac)&0xFFFFFFFF);//detectormacL_AReg_c - bus_w(UDP_PORT_REG,((sourceport&0xFFFF)<<16)+(udpport&0xFFFF));//udpports_AReg_c -*/ - uint32_t val = 0; - - val = ((sourcemac >> LSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(TX_MAC_LSB_REG, val); -#ifdef VERBOSE - printf("Read from TX_MAC_LSB_REG: 0x%08x\n", bus_r(TX_MAC_LSB_REG)); -#endif - - val = ((sourcemac >> MSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(TX_MAC_MSB_REG,val); -#ifdef VERBOSE - printf("Read from TX_MAC_MSB_REG: 0x%08x\n", bus_r(TX_MAC_MSB_REG)); -#endif - - val = ((destmac >> LSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(RX_MAC_LSB_REG, val); -#ifdef VERBOSE - printf("Read from RX_MAC_LSB_REG: 0x%08x\n", bus_r(RX_MAC_LSB_REG)); -#endif - - val = ((destmac >> MSB_OF_64_BIT_REG_OFST) & BIT_32_MSK); - bus_w(RX_MAC_MSB_REG, val); -#ifdef VERBOSE - printf("Read from RX_MAC_MSB_REG: 0x%08x\n", bus_r(RX_MAC_MSB_REG)); -#endif - - val = (((sourceport << UDP_PORT_TX_OFST) & UDP_PORT_TX_MSK) | - ((udpport << UDP_PORT_RX_OFST) & UDP_PORT_RX_MSK)); - bus_w(UDP_PORT_REG, val); -#ifdef VERBOSE - printf("Read from UDP_PORT_REG: 0x%08x\n", bus_r(UDP_PORT_REG)); -#endif - - bus_w(TX_IP_CHECKSUM_REG,(checksum << TX_IP_CHECKSUM_OFST) & TX_IP_CHECKSUM_MSK); -#ifdef VERBOSE - printf("Read from TX_IP_CHECKSUM_REG: 0x%08x\n", bus_r(TX_IP_CHECKSUM_REG)); -#endif - cleanFifos(); - resetCore(); - - usleep(500 * 1000); /* todo maybe without */ - return 0; -} - - -int setDetectorPosition(int pos[]) { - int ret = OK; - - bus_w(COORD_0_REG, bus_r(COORD_0_REG) | ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK)); - if ((bus_r(COORD_0_REG) & COORD_0_X_MSK) != ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK)) - ret = FAIL; - - bus_w(COORD_0_REG, bus_r(COORD_0_REG) | ((pos[1] << COORD_0_Y_OFST) & COORD_0_Y_MSK)); - if ((bus_r(COORD_0_REG) & COORD_0_Y_MSK) != ((pos[1] << COORD_0_Y_OFST) & COORD_0_Y_MSK)) - ret = FAIL; - - bus_w(COORD_1_REG, bus_r(COORD_1_REG) | ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK)); - if ((bus_r(COORD_1_REG) & COORD_0_Z_MSK) != ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK)) - ret = FAIL; - - if (ret == OK) - printf("Position set to [%d, %d, %d]\n", pos[0], pos[1], pos[2]); - return ret; -} - - - -/* jungfrau specific - pll, flashing fpga */ - - - -void resetPLL() { -#ifdef VIRTUAL - return; -#endif - // reset PLL Reconfiguration and PLL - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_RECONFIG_RST_MSK | PLL_CTRL_RST_MSK); - usleep(100); - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) & ~PLL_CTRL_RECONFIG_RST_MSK & ~PLL_CTRL_RST_MSK); -} - - -u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val) { -#ifdef VIRTUAL - return val; -#endif - // set parameter - bus_w(PLL_PARAM_REG, val); - - // set address - bus_w(PLL_CONTROL_REG, (reg << PLL_CTRL_ADDR_OFST) & PLL_CTRL_ADDR_MSK); - usleep(10*1000); - - //write parameter - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_WR_PARAMETER_MSK); - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) & ~PLL_CTRL_WR_PARAMETER_MSK); - usleep(10*1000); - - return val; -} - - - - -void configurePll() { -#ifdef VIRTUAL - return; -#endif - u_int32_t val; - int32_t phase=0, inv=0; - // ensuring PLL is never configured with same phase - if (clkPhase[1] == 0) { - return; - } - - printf("Configuring PLL with phase in %d\n", clkPhase[1]); - if (clkPhase[1]>0) { - inv=0; - phase=clkPhase[1]; - } else { - inv=1; - phase=-1*clkPhase[1]; - } - printf(" phase out %d (0x%08x)\n", phase, phase); - - if (inv) { - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C1_VAL + PLL_SHIFT_UP_DOWN_NEG_VAL; - printf(" phase word 0x%08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - } else { - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C0_VAL + PLL_SHIFT_UP_DOWN_NEG_VAL; - printf(" phase word 0x%08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - - printf(" phase word 0x%08x\n", val); - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C2_VAL; - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - } - usleep(10000); -} - - - -int setThresholdTemperature(int val) { - - if (val >= 0) { - printf("\nThreshold Temperature: %d\n", val); - - val *= (10.0/625.0); -#ifdef VERBOSE - printf("Converted Threshold Temperature: %d\n", val); -#endif - bus_w(TEMP_CTRL_REG, (bus_r(TEMP_CTRL_REG) &~(TEMP_CTRL_PROTCT_THRSHLD_MSK) &~(TEMP_CTRL_OVR_TMP_EVNT_MSK)) - | (((val << TEMP_CTRL_PROTCT_THRSHLD_OFST) & TEMP_CTRL_PROTCT_THRSHLD_MSK))); -#ifdef VERBOSE - printf("Converted Threshold Temperature set to %d\n", ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> TEMP_CTRL_PROTCT_THRSHLD_OFST)); -#endif - } - uint32_t temp = ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_THRSHLD_MSK) >> TEMP_CTRL_PROTCT_THRSHLD_OFST); - - // conversion - temp *= (625.0/10.0); - printf("Threshold Temperature %f °C\n",(double)temp/1000.00); - - return temp; - -} - - -int setTemperatureControl(int val) { - if (val >= 0) { - // binary value - if (val > 0 ) val = 1; - printf("\nTemperature control: %d\n", val); - bus_w(TEMP_CTRL_REG, (bus_r(TEMP_CTRL_REG) &~(TEMP_CTRL_PROTCT_ENABLE_MSK) &~(TEMP_CTRL_OVR_TMP_EVNT_MSK)) - | (((val << TEMP_CTRL_PROTCT_ENABLE_OFST) & TEMP_CTRL_PROTCT_ENABLE_MSK))); -#ifdef VERBOSE - printf("Temperature control set to %d\n", ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> TEMP_CTRL_PROTCT_ENABLE_OFST)); -#endif - } - return ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_PROTCT_ENABLE_MSK) >> TEMP_CTRL_PROTCT_ENABLE_OFST); -} - - -int setTemperatureEvent(int val) { -#ifdef VIRTUAL - return 0; -#endif - if (val >= 0) { - // set bit to clear it - val = 1; - printf("\nTemperature Event: %d\n", val); - bus_w(TEMP_CTRL_REG, (bus_r(TEMP_CTRL_REG) &~TEMP_CTRL_OVR_TMP_EVNT_MSK) - | (((val << TEMP_CTRL_OVR_TMP_EVNT_OFST) & TEMP_CTRL_OVR_TMP_EVNT_MSK))); -#ifdef VERBOSE - printf("Temperature Event set to %d\n", ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> TEMP_CTRL_OVR_TMP_EVNT_OFST)); -#endif - } - return ((bus_r(TEMP_CTRL_REG) & TEMP_CTRL_OVR_TMP_EVNT_MSK) >> TEMP_CTRL_OVR_TMP_EVNT_OFST); -} - - - -int setNetworkParameter(enum NETWORKINDEX mode, int value) { - if (mode != TXN_FRAME) - return -1; - - if (value >= 0) { - printf("\nSetting transmission delay: %d\n", value); - bus_w(CONFIG_REG, (bus_r(CONFIG_REG) &~CONFIG_TDMA_TIMESLOT_MSK) - | (((value << CONFIG_TDMA_TIMESLOT_OFST) & CONFIG_TDMA_TIMESLOT_MSK))); - if (value == 0) - bus_w(CONFIG_REG, bus_r(CONFIG_REG) &~ CONFIG_TDMA_MSK); - else - bus_w(CONFIG_REG, bus_r(CONFIG_REG) | CONFIG_TDMA_MSK); -#ifdef VERBOSE - printf("Transmission delay set to %d\n", ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> CONFIG_TDMA_TIMESLOT_OFST)); -#endif - } - - return ((bus_r(CONFIG_REG) & CONFIG_TDMA_TIMESLOT_MSK) >> CONFIG_TDMA_TIMESLOT_OFST); -} - - - - - -/* aquisition */ - -int startStateMachine(){ -#ifdef VIRTUAL - virtual_status = 1; - virtual_stop = 0; - if(pthread_create(&pthread_virtual_tid, NULL, &start_timer, NULL)) { - virtual_status = 0; - cprintf(RED,"Could not start Virtual acquisition thread\n"); - return FAIL; - } - cprintf(GREEN,"***Virtual Acquisition started\n"); - return OK; -#endif - printf("*******Starting State Machine*******\n"); - - cleanFifos(); - - //start state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_START_ACQ_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_START_ACQ_MSK); - - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - -#ifdef VIRTUAL -void* start_timer(void* arg) { - int wait_in_s = (setTimer(FRAME_NUMBER, -1) * - setTimer(CYCLES_NUMBER, -1) * - (setTimer(STORAGE_CELL_NUMBER, -1) + 1) * - (setTimer(FRAME_PERIOD, -1)/(1E9))); - cprintf(GREEN,"going to wait for %d s\n", wait_in_s); - while(!virtual_stop && (wait_in_s >= 0)) { - usleep(1000 * 1000); - wait_in_s--; - } - cprintf(GREEN,"Virtual Timer Done***\n"); - - virtual_status = 0; - return NULL; -} -#endif - -int stopStateMachine(){ - cprintf(BG_RED,"*******Stopping State Machine*******\n"); -#ifdef VIRTUAL - virtual_stop = 0; - return OK; -#endif - //stop state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STOP_ACQ_MSK); - usleep(100); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STOP_ACQ_MSK); - - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - - - - -enum runStatus getRunStatus(){ -#ifdef VIRTUAL - if(virtual_status == 0){ - printf("Status: IDLE\n"); - return IDLE; - }else{ - printf("Status: RUNNING...\n"); - return RUNNING; - } -#endif -#ifdef VERBOSE - printf("Getting status\n"); -#endif - - enum runStatus s; - u_int32_t retval = bus_r(STATUS_REG); - printf("Status Register: %08x\n",retval); - - //running - if(((retval & RUN_BUSY_MSK) >> RUN_BUSY_OFST)) { - if ((retval & WAITING_FOR_TRIGGER_MSK) >> WAITING_FOR_TRIGGER_OFST) { - printf("-----------------------------------WAITING-----------------------------------\n"); - s=WAITING; - } - else{ - printf("-----------------------------------RUNNING-----------------------------------\n"); - s=RUNNING; - } - } - - //not running - else { - // stopped or error - if ((retval & STOPPED_MSK) >> STOPPED_OFST) { - printf("-----------------------------------STOPPED--------------------------\n"); - s=STOPPED; - } else if ((retval & RUNMACHINE_BUSY_MSK) >> RUNMACHINE_BUSY_OFST) { - printf("-----------------------------------READ MACHINE BUSY--------------------------\n"); - s=TRANSMITTING; - } else if (!retval) { - printf("-----------------------------------IDLE--------------------------------------\n"); - s=IDLE; - } else { - printf("-----------------------------------Unknown status %08x--------------------------------------\n", retval); - s=ERROR; - } - } - - return s; -} - - - -void readFrame(int *ret, char *mess){ -#ifdef VIRTUAL - while(virtual_status) { - //cprintf(RED,"Waiting for finished flag\n"); - usleep(5000); - } - *ret = (int)FINISHED; - strcpy(mess,"acquisition successfully finished\n"); - return; -#endif - // wait for status to be done - while(runBusy()){ - usleep(500); - } - - // frames left to give status - int64_t retval = getTimeLeft(FRAME_NUMBER) + 1; - if ( retval > 0) { - *ret = (int)FAIL; - sprintf(mess,"no data and run stopped: %lld frames left\n",(long long int)retval); - cprintf(RED,"%s\n",mess); - } else { - *ret = (int)FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s",mess); - } -} - - - -u_int32_t runBusy(void) { -#ifdef VIRTUAL - return virtual_status; -#endif - u_int32_t s = ((bus_r(STATUS_REG) & RUN_BUSY_MSK) >> RUN_BUSY_OFST); -#ifdef VERBOSE - printf("Status Register: %08x\n", s); -#endif - return s; -} - - - - - - - - -/* common */ - -//jungfrau doesnt require chips and chans (save memory) -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod){ - - int idac, iadc; - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",srcMod,destMod); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ - - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - -int calculateDataBytes(){ - return DATA_BYTES; -} - -int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerModule() * (int)getTotalNumberOfModules());} -int getTotalNumberOfChips(){return ((int)getNumberOfChipsPerModule() * (int)getTotalNumberOfModules());} -int getTotalNumberOfModules(){return NMOD;} -int getNumberOfChannelsPerModule(){return ((int)getNumberOfChannelsPerChip() * (int)getTotalNumberOfChips());} -int getNumberOfChipsPerModule(){return NCHIP;} -int getNumberOfDACsPerModule(){return NDAC;} -int getNumberOfADCsPerModule(){return NADC;} -int getNumberOfChannelsPerChip(){return NCHAN;} - - - -/* sync */ - -enum masterFlags setMaster(enum masterFlags arg){ - return NO_MASTER; -} - -enum synchronizationMode setSynchronization(enum synchronizationMode arg){ - return NO_SYNCHRONIZATION; -} - - - - - - -//#endif diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.h deleted file mode 120000 index 345b8c029..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorFunctionList.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorFunctionList.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer.c deleted file mode 120000 index a7eb59acb..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer.c +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer.c \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h deleted file mode 100644 index ee74bcd40..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_defs.h +++ /dev/null @@ -1,176 +0,0 @@ -#ifndef SLSDETECTORSERVER_DEFS_H -#define SLSDETECTORSERVER_DEFS_H - -#include "sls_detector_defs.h" //default dynamicgain in settings -#include "RegisterDefs.h" -#include - - - -#define GOODBYE (-200) -#define PROGRAMMING_MODE (-200) -#define MIN_REQRD_VRSN_T_RD_API 0x171220 -#define REQRD_FRMWR_VRSN 0x181206 // temp bug fix from last version, timing mode is backwards compatible - - -/* Struct Definitions */ -typedef struct ip_header_struct { - uint16_t ip_len; - uint8_t ip_tos; - uint8_t ip_ihl:4 ,ip_ver:4; - uint16_t ip_offset:13,ip_flag:3; - uint16_t ip_ident; - uint16_t ip_chksum; - uint8_t ip_protocol; - uint8_t ip_ttl; - uint32_t ip_sourceip; - uint32_t ip_destip; -} ip_header; - -/* Enums */ -enum CLK_SPEED_INDEX {FULL_SPEED, HALF_SPEED, QUARTER_SPEED}; -enum ADCINDEX {TEMP_FPGA, TEMP_ADC}; -enum DACINDEX {VB_COMP, VDD_PROT, VIN_COM, VREF_PRECH, VB_PIXBUF, VB_DS, VREF_DS, VREF_COMP }; -#define DEFAULT_DAC_VALS { 1220, /* VB_COMP */ \ - 3000, /* VDD_PROT */ \ - 1053, /* VIN_COM */ \ - 1450, /* VREF_PRECH */ \ - 750, /* VB_PIXBUF */ \ - 1000, /* VB_DS */ \ - 480, /* VREF_DS */ \ - 420 /* VREF_COMP */ \ - }; - -enum NETWORKINDEX { TXN_FRAME }; - - - -/* Hardware Definitions */ -#define NMAXMOD (1) -#define NMOD (1) -#define NCHAN (256 * 256) -#define NCHIP (8) -#define NADC (0) -#define NDAC (8) -#define NDAC_OLDBOARD (16) -#define DYNAMIC_RANGE (16) -#define NUM_BITS_PER_PIXEL (DYNAMIC_RANGE / 8) -#define DATA_BYTES (NCHIP * NCHAN * NUM_BITS_PER_PIXEL) -#define IP_PACKETSIZE (0x2052) -#define CLK_RUN (40) /* MHz */ -#define CLK_SYNC (20) /* MHz */ - - -/** Default Parameters */ -#define DEFAULT_NUM_FRAMES (100*1000*1000) -#define DEFAULT_NUM_CYCLES (1) -#define DEFAULT_EXPTIME (10*1000) //ns -#define DEFAULT_PERIOD (2*1000*1000) //ns -#define DEFAULT_DELAY (0) -#define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) -#define DEFAULT_SETTINGS (DYNAMICGAIN) -#define DEFAULT_TX_UDP_PORT (0x7e9a) -#define DEFAULT_TMP_THRSHLD (65*1000) //milli degree Celsius -#define DEFAULT_NUM_STRG_CLLS (0) -#define DEFAULT_STRG_CLL_STRT (0xf) - -/* Defines in the Firmware */ -#define MAX_TIMESLOT_VAL (0x1F) -#define MAX_THRESHOLD_TEMP_VAL (127999) //millidegrees -#define MAX_STORAGE_CELL_VAL (15) //0xF -#define ACQ_TIME_MIN_CLOCK (2) - - -#define SAMPLE_ADC_HALF_SPEED (SAMPLE_DECMT_FACTOR_2_VAL + SAMPLE_DGTL_SAMPLE_0_VAL + SAMPLE_ADC_DECMT_FACTOR_0_VAL + SAMPLE_ADC_SAMPLE_0_VAL) /* 0x1000 */ -#define SAMPLE_ADC_QUARTER_SPEED (SAMPLE_DECMT_FACTOR_4_VAL + SAMPLE_DGTL_SAMPLE_8_VAL + SAMPLE_ADC_DECMT_FACTOR_1_VAL + SAMPLE_ADC_SAMPLE_0_VAL) /* 0x2810 */ -#define CONFIG_HALF_SPEED (CONFIG_TDMA_DISABLE_VAL + CONFIG_HALF_SPEED_20MHZ_VAL + CONFIG_OPRTN_MDE_1_X_10GBE_VAL) -#define CONFIG_QUARTER_SPEED (CONFIG_TDMA_DISABLE_VAL + CONFIG_QUARTER_SPEED_10MHZ_VAL + CONFIG_OPRTN_MDE_1_X_10GBE_VAL) -#define ADC_OFST_HALF_SPEED_VAL (0x1f) //(0x20) -#define ADC_OFST_QUARTER_SPEED_VAL (0x0f) //(0x0f) -#define ADC_PHASE_HALF_SPEED (0x2D) //45 -#define ADC_PHASE_QUARTER_SPEED (0x2D) //45 -#define ADC_PORT_INVERT_VAL (0x453b2a9c) - -/* Maybe not required for jungfrau */ -#define NTRIMBITS (6) -#define NCOUNTBITS (24) -#define NCHIPS_PER_ADC (2) -#define TRIM_DR (((int)pow(2,NTRIMBITS))-1) -#define COUNT_DR (((int)pow(2,NCOUNTBITS))-1) -#define ALLMOD (0xffff) -#define ALLFIFO (0xffff) - -/* MSB & LSB DEFINES */ -#define MSB_OF_64_BIT_REG_OFST (32) -#define LSB_OF_64_BIT_REG_OFST (0) -#define BIT_32_MSK (0xFFFFFFFF) - -/* LTC2620 DAC DEFINES */ -#define LTC2620_DAC_CMD_OFST (20) -#define LTC2620_DAC_CMD_MSK (0x0000000F << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_ADDR_OFST (16) -#define LTC2620_DAC_ADDR_MSK (0x0000000F << LTC2620_DAC_ADDR_OFST) -#define LTC2620_DAC_DATA_OFST (4) -#define LTC2620_DAC_DATA_MSK (0x00000FFF << LTC2620_DAC_DATA_OFST) - -#define LTC2620_DAC_CMD_WRITE (0x00000000 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_CMD_SET (0x00000003 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_CMD_POWER_DOWN (0x00000004 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_NUMBITS (24) - - -/* MAX1932 HV DEFINES */ -#define MAX1932_HV_NUMBITS (8) -#define MAX1932_HV_DATA_OFST (0) -#define MAX1932_HV_DATA_MSK (0x000000FF << MAX1932_HV_DATA_OFST) - - - -/** PLL Reconfiguration Registers */ -//https://www.altera.com/documentation/mcn1424769382940.html -#define PLL_MODE_REG (0x00) -#define PLL_STATUS_REG (0x01) -#define PLL_START_REG (0x02) -#define PLL_N_COUNTER_REG (0x03) -#define PLL_M_COUNTER_REG (0x04) -#define PLL_C_COUNTER_REG (0x05) -#define PLL_PHASE_SHIFT_REG (0x06) - -#define PLL_SHIFT_NUM_SHIFTS_OFST (0) -#define PLL_SHIFT_NUM_SHIFTS_MSK (0x0000FFFF << PLL_SHIFT_NUM_SHIFTS_OFST) - -#define PLL_SHIFT_CNT_SELECT_OFST (16) -#define PLL_SHIFT_CNT_SELECT_MSK (0x0000001F << PLL_SHIFT_CNT_SELECT_OFST) -#define PLL_SHIFT_CNT_SLCT_C0_VAL ((0x0 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C1_VAL ((0x1 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C2_VAL ((0x2 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C3_VAL ((0x3 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C4_VAL ((0x4 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C5_VAL ((0x5 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C6_VAL ((0x6 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C7_VAL ((0x7 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C8_VAL ((0x8 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C9_VAL ((0x9 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C10_VAL ((0x10 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C11_VAL ((0x11 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C12_VAL ((0x12 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C13_VAL ((0x13 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C14_VAL ((0x14 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C15_VAL ((0x15 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C16_VAL ((0x16 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C17_VAL ((0x17 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) - -#define PLL_SHIFT_UP_DOWN_OFST (21) -#define PLL_SHIFT_UP_DOWN_MSK (0x00000001 << PLL_SHIFT_UP_DOWN_OFST) -#define PLL_SHIFT_UP_DOWN_NEG_VAL ((0x0 << PLL_SHIFT_UP_DOWN_OFST) & PLL_SHIFT_UP_DOWN_MSK) -#define PLL_SHIFT_UP_DOWN_POS_VAL ((0x1 << PLL_SHIFT_UP_DOWN_OFST) & PLL_SHIFT_UP_DOWN_MSK) - -#define PLL_K_COUNTER_REG (0x07) -#define PLL_BANDWIDTH_REG (0x08) -#define PLL_CHARGEPUMP_REG (0x09) -#define PLL_VCO_DIV_REG (0x1c) -#define PLL_MIF_REG (0x1f) - - -#endif /* SLSDETECTORSERVER_DEFS_H */ diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.c deleted file mode 120000 index a7532ccd4..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.h deleted file mode 120000 index 7569daf47..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/slsDetectorServer_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/sls_detector_defs.h b/slsDetectorSoftware/jungfrauDetectorServer/sls_detector_defs.h deleted file mode 120000 index c5062e03f..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/sls_detector_defs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/sls_detector_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/sls_detector_funcs.h deleted file mode 120000 index 844b67129..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/sls_detector_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_defs.h b/slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_defs.h deleted file mode 120000 index 1de31caf5..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_defs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_funcs.h deleted file mode 120000 index c2ea4ded9..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/sls_receiver_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/updateAPIVersion.sh b/slsDetectorSoftware/jungfrauDetectorServer/updateAPIVersion.sh deleted file mode 100755 index ef65ec7e7..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/updateAPIVersion.sh +++ /dev/null @@ -1,7 +0,0 @@ -SRCFILE=gitInfoJungfrau.h -DSTFILE=versionAPI.h - -SRCPATTERN=GITDATE -DSTPATTERN=APIJUNGFRAU - -awk -v a="$SRCFILE" -v b="$DSTFILE" -v c="$SRCPATTERN" -v d="$DSTPATTERN" 'FNR==NR&&$2==c{x=$3} NR!=FNR{if($2==d){$3="0x"substr(x,5)}print > b}' $SRCFILE $DSTFILE \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/updateGitVersion.sh b/slsDetectorSoftware/jungfrauDetectorServer/updateGitVersion.sh deleted file mode 100755 index 0c25e7f1e..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/updateGitVersion.sh +++ /dev/null @@ -1,31 +0,0 @@ -SERVER=jungfrauDetectorServer -MAINDIR=slsDetectorsPackage -SPECDIR=slsDetectorSoftware/$SERVER -TMPFILE=gitInfoJungfrauTmp.h -INCLFILE=gitInfoJungfrau.h - - -#evaluate the variables -EVALFILE=../../evalVersionVariables.sh -source $EVALFILE - - -#get modified date -#RDATE1='git log --pretty=format:"%ci" -1' -RDATE1="find ../slsDetectorServer . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|bin|.git|updateGitVersion|.o' | head -n 1" -RDATE=`eval $RDATE1` -NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') -NEWDATE=${NEWDATE/#/0x} - - -#get old date from INCLFILE -OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') - - -#update INCLFILE if changes -if [ "$OLDDATE" != "$NEWDATE" ]; then - echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt - cd ../../ - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -fi \ No newline at end of file diff --git a/slsDetectorSoftware/jungfrauDetectorServer/versionAPI.h b/slsDetectorSoftware/jungfrauDetectorServer/versionAPI.h deleted file mode 120000 index d3bf8d6cf..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/versionAPI.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/versionAPI.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/.target-makefrag b/slsDetectorSoftware/moenchDetectorServer/.target-makefrag deleted file mode 100755 index ce093ecac..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/.target-makefrag +++ /dev/null @@ -1 +0,0 @@ -AXIS_BUILDTYPE ?= cris-axis-linux-gnu diff --git a/slsDetectorSoftware/moenchDetectorServer/Makefile b/slsDetectorSoftware/moenchDetectorServer/Makefile deleted file mode 100755 index 490d4761b..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - - -CROSS = bfin-uclinux- -CC = $(CROSS)gcc - -CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG #-DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER - - -PROGS= moenchDetectorServer -INSTDIR= /tftpboot -INSTMODE= 0777 - - - -BINS = testlib_sharedlibc -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c -OBJS = $(SRCS:%.c=%.o) - - - -all: clean versioning $(PROGS) - -boot: $(OBJS) - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - -$(PROGS): $(OBJS) - echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - - -romfs: - $(ROMFSINST) /bin/$(PROGS) - -clean: - rm -rf $(PROGS) *.o *.gdb - - - - - - diff --git a/slsDetectorSoftware/moenchDetectorServer/Makefile.virtual b/slsDetectorSoftware/moenchDetectorServer/Makefile.virtual deleted file mode 100755 index 38dd2537c..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/Makefile.virtual +++ /dev/null @@ -1,30 +0,0 @@ - -DESTDIR ?= ./ - -CC = gcc -CFLAGS += -Wall -DMOENCHD -DMCB_FUNCS -DDACS_INT -DDEBUG -DVIRTUAL - - -PROGS= $(DESTDIR)/moenchVirtualServer - - -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c -OBJS = $(SRCS:%.c=%.o) - -moenchVirtualServer = $(PROGS) - -all: clean $(PROGS) - - -$(PROGS): $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - - -clean: - rm -rf $(PROGS) *.o *.gdb - - - - - - diff --git a/slsDetectorSoftware/moenchDetectorServer/ansi.h b/slsDetectorSoftware/moenchDetectorServer/ansi.h deleted file mode 120000 index a122db0ad..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/ansi.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/communication_funcs.c b/slsDetectorSoftware/moenchDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/communication_funcs.h b/slsDetectorSoftware/moenchDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c b/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c deleted file mode 100755 index 25b6e7598..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.c +++ /dev/null @@ -1,2613 +0,0 @@ - -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "registers_m.h" - -#ifdef SHAREDMEMORY -#include "sharedmemory.h" -#endif - -#include -#include -#include - -#include - -//for memory mapping -u_int64_t CSP0BASE; - -FILE *debugfp, *datafp; - -int fr; -int wait_time; -int *fifocntrl; - -//int *statusreg; commented out by dhanya -const int nModY=1; -int nModBoard; -int nModX=NMAXMOD; -int dynamicRange=16;//32; -int dataBytes=NMAXMOD*NCHIP*NCHAN*2; -int storeInRAM=0; -int ROI_flag=0; -int adcConfigured=-1; -u_int32_t *ram_values=NULL; -volatile char *now_ptr=NULL; -volatile u_int16_t *values; -int ram_size=0; - -int64_t totalTime=1; -u_int32_t progressMask=0; - -int phase_shift=0;//DEFAULT_PHASE_SHIFT; -int ipPacketSize=DEFAULT_IP_PACKETSIZE; -int udpPacketSize=DEFAULT_UDP_PACKETSIZE; - - -int ififostart, ififostop, ififostep, ififo; - -int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; - -enum externalSignalFlag signals[4]={EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF, EXT_SIG_OFF}; - - -#ifdef MCB_FUNCS -extern const int nChans; -extern const int nChips; -//extern const int nDacs; -//extern const int nAdcs; -#endif -#ifndef MCB_FUNCS - -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -#endif - - - - -/** - ENEt conf structs -*/ -typedef struct mac_header_struct{ - u_int8_t mac_dest_mac2; - u_int8_t mac_dest_mac1; - u_int8_t mac_dummy1; - u_int8_t mac_dummy2; - u_int8_t mac_dest_mac6; - u_int8_t mac_dest_mac5; - u_int8_t mac_dest_mac4; - u_int8_t mac_dest_mac3; - u_int8_t mac_src_mac4; - u_int8_t mac_src_mac3; - u_int8_t mac_src_mac2; - u_int8_t mac_src_mac1; - u_int16_t mac_ether_type; - u_int8_t mac_src_mac6; - u_int8_t mac_src_mac5; -} mac_header; - -typedef struct ip_header_struct { - u_int16_t ip_len; - u_int8_t ip_tos; - u_int8_t ip_ihl:4 ,ip_ver:4; - u_int16_t ip_offset:13,ip_flag:3; - u_int16_t ip_ident; - u_int16_t ip_chksum; - u_int8_t ip_protocol; - u_int8_t ip_ttl; - u_int32_t ip_sourceip; - u_int32_t ip_destip; -} ip_header; - -typedef struct udp_header_struct{ - u_int16_t udp_destport; - u_int16_t udp_srcport; - u_int16_t udp_chksum; - u_int16_t udp_len; -} udp_header; - -typedef struct mac_conf_struct{ - mac_header mac; - ip_header ip; - udp_header udp; - u_int32_t npack; - u_int32_t lpack; - u_int32_t npad; - u_int32_t cdone; -} mac_conf; - -typedef struct tse_conf_struct{ - u_int32_t rev; //0x0 - u_int32_t scratch; - u_int32_t command_config; - u_int32_t mac_0; //0x3 - u_int32_t mac_1; - u_int32_t frm_length; - u_int32_t pause_quant; - u_int32_t rx_section_empty; //0x7 - u_int32_t rx_section_full; - u_int32_t tx_section_empty; - u_int32_t tx_section_full; - u_int32_t rx_almost_empty; //0xB - u_int32_t rx_almost_full; - u_int32_t tx_almost_empty; - u_int32_t tx_almost_full; - u_int32_t mdio_addr0; //0xF - u_int32_t mdio_addr1; -}tse_conf; - - - -int mapCSP0(void) { - printf("Mapping memory\n"); -#ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } - printf("/dev/mem opened\n"); - - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSP0 mapped\n"); - -#endif -#ifdef VIRTUAL - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); -#endif -#ifdef SHAREDMEMORY - if ( (res=inism(SMSV))<0) { - printf("error attaching shared memory! %i",res); - return FAIL; - } -#endif - printf("CSPObase is 0x%x \n",CSP0BASE); - printf("CSPOBASE=from %08x to %x\n",CSP0BASE,CSP0BASE+MEM_SIZE); - - u_int32_t address; - address = FIFO_DATA_REG_OFF; - values=(u_int16_t*)(CSP0BASE+address*2); - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - printf("\n\n"); - return OK; -} - -u_int16_t bus_r16(u_int32_t offset){ - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - return *ptr1; -} - -u_int16_t bus_w16(u_int32_t offset, u_int16_t data) { - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; -} - -/** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ -u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data) { - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Writing to addr:%x\n",adr); - return bus_w16(adr,data); -} - -/** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ -u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch){ - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Reading from addr:%x\n",adr); - return bus_r16(adr); -} - -u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - volatile u_int32_t *ptr1; - - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - *ptr1=data; - - return OK; -} - - -u_int32_t bus_r(u_int32_t offset) { - volatile u_int32_t *ptr1; - - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - return *ptr1; -} - - -int setPhaseShiftOnce(){ - u_int32_t addr, reg; - int i; - addr=MULTI_PURPOSE_REG; - reg=bus_r(addr); -#ifdef VERBOSE - printf("Multipurpose reg:%x\n",reg); -#endif - - //Checking if it is power on(negative number) - // if(((reg&0xFFFF0000)>>16)>0){ - //bus_w(addr,0x0); //clear the reg - - if(reg==0){ - printf("\nImplementing phase shift of %d\n",phase_shift); - for (i=1;i0) { - bus_w(PLL_CNTRL_REG, 1);//reset PLL - bus_w(PLL_CNTRL_REG, 0); - phase_shift=0; - for (i=0;i1) nc=d;// nc=161/d; - else return -1; - - if (nc>255) - return -1; - - int addr, addr1, addr0; - u_int32_t pat,pat1,pat0; - - addr= PLL_PARAM_REG; - addr0= PLL_PARAM_OUT_REG; - addr1=PLL_CNTRL_REG; - pat1=0x10; - - - //write high count c0 -/* pat=(1<<12)|(7<<9)|nc; */ -/* bus_w(addr, pat); */ -/* bus_w(addr1, pat1); */ -/* bus_w(addr1, 0); */ -/* usleep (1000); */ -/* pat=bus_r(addr0); */ -/* bus_w(addr1, 0x4); */ -/* bus_w(addr1, 0); */ -/* pat=bus_r(addr0); */ -/* printf("M nominal count read %x (%d)\n",pat,(pat&0x1ff)); */ - - - - //write low count c0 - pat=(nc-1)|(4<<12)|(1<<9); - bus_w(addr, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - pat0=bus_r(PLL_PARAM_OUT_REG); - usleep (1000); - printf("C0 low count status %x\n",pat0); - - //write high count c0 - pat=(nc)|(4<<12)|(0<<9); - bus_w(addr, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - pat0=bus_r(PLL_PARAM_OUT_REG); - printf("C0 high count status %x\n",pat0); - usleep (1000); - - //write low count c1 - pat=(nc-1)|(5<<12)|(1<<9); - bus_w(addr, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - pat0=bus_r(PLL_PARAM_OUT_REG); - printf("C1 high count status %x\n",pat0); - usleep (1000); - - //write high count c1 - pat=(nc)|(5<<12)|(0<<9); - bus_w(addr, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - pat0=bus_r(PLL_PARAM_OUT_REG); - printf("C1 low count status %x\n",pat0); - usleep (1000); - - //reconfigure pll - pat1=0x8; - bus_w(addr1, pat1); - bus_w(addr1, 0); - pat0=bus_r(PLL_PARAM_OUT_REG); - printf("configure status %d\n",pat0); - sleep (1); - printf("finish status %x\n",pat0); - - - bus_w(PLL_CNTRL_REG, 1); //reset PLL - bus_w(PLL_CNTRL_REG, 0); - - return 0; -} - -u_int32_t getClockDivider() { - int addr, addr1, addr0; - u_int32_t pat,pat1; - - addr0= PLL_PARAM_REG; - addr= PLL_PARAM_OUT_REG; - addr1=PLL_CNTRL_REG; - pat1=0x4; - - - //write low count c0 - pat=(4<<12)|(1<<9); - bus_w(addr0, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - usleep (1000); - pat=bus_r(addr); - printf("C0 low count read %x (%d)\n",pat,(pat&0xff)); - - //write high count c0 - pat=(4<<12)|(0<<9); - bus_w(addr0, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - usleep (1000); - pat=bus_r(addr); - printf("C0 high count read %x (%d)\n",pat,(pat&0xff)); - - - //write low count c1 - pat=(5<<12)|(1<<9); - bus_w(addr0, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - usleep (1000); - pat=bus_r(addr); - printf("C1 low count read %x (%d)\n",pat,(pat&0xff)); - - //write high count c1 - pat=(5<<12)|(0<<9); - bus_w(addr0, pat); - bus_w(addr1, pat1); - bus_w(addr1, 0); - usleep (1000); - pat=bus_r(addr); - printf("C1 high count read %x (%d)\n",pat,(pat&0xff)); - - - return (pat&0xff); - -/* //write low count c0 */ -/* pat=(0<<12)|(7<<9); */ -/* bus_w(addr0, pat); */ -/* bus_w(addr1, pat1); */ -/* bus_w(addr1, 0); */ -/* usleep (1000); */ -/* pat=bus_r(addr); */ -/* printf("N nominal count read %x (%d)\n",pat,pat&0x1ff); */ - -/* //write high count c0 */ -/* pat=(1<<12)|(7<<9); */ -/* bus_w(addr0, pat); */ -/* bus_w(addr1, pat1); */ -/* bus_w(addr1, 0); */ -/* usleep (1000); */ -/* pat=bus_r(addr); */ -/* printf("M nominal count read %x (%d)\n",pat,(pat&0x1ff)); */ - - - -/* if ((pat&0x1ff)!=0) */ -/* return 161/(pat&0x1ff); */ -/* else */ -/* return -1; */ -} - -u_int32_t setSetLength(int d) { - return 0; -} - -u_int32_t getSetLength() { - return 0; -} - -u_int32_t setOversampling(int d) { - - if (d>=0 && d<=255) - bus_w(OVERSAMPLING_REG, d); - - return bus_r(OVERSAMPLING_REG); -} - - -u_int32_t setWaitStates(int d1) { - return 0; -} - -u_int32_t getWaitStates() { - return 0; -} - - -u_int32_t setTotClockDivider(int d) { - return 0; -} - -u_int32_t getTotClockDivider() { - return 0; -} - - -u_int32_t setTotDutyCycle(int d) { - return 0; -} - -u_int32_t getTotDutyCycle() { - return 0; -} - - -u_int32_t setExtSignal(int d, enum externalSignalFlag mode) { - - //int modes[]={EXT_SIG_OFF, EXT_GATE_IN_ACTIVEHIGH, EXT_GATE_IN_ACTIVELOW,EXT_TRIG_IN_RISING,EXT_TRIG_IN_FALLING,EXT_RO_TRIG_IN_RISING, EXT_RO_TRIG_IN_FALLING,EXT_GATE_OUT_ACTIVEHIGH, EXT_GATE_OUT_ACTIVELOW, EXT_TRIG_OUT_RISING, EXT_TRIG_OUT_FALLING, EXT_RO_TRIG_OUT_RISING, EXT_RO_TRIG_OUT_FALLING}; - // int off=d*SIGNAL_OFFSET; - - u_int32_t c; - c=bus_r(EXT_SIGNAL_REG); - - if (d>=0 && d<4) { - signals[d]=mode; -#ifdef VERBOSE - printf("settings signal variable number %d to value %04x\n", d, signals[d]); -#endif - - // if output signal, set it! - - switch (mode) { - case GATE_IN_ACTIVE_HIGH: - case GATE_IN_ACTIVE_LOW: - if (timingMode==GATE_FIX_NUMBER || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case TRIGGER_IN_RISING_EDGE: - case TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_EXPOSURE || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case RO_TRIGGER_IN_RISING_EDGE: - case RO_TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_READOUT) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case MASTER_SLAVE_SYNCHRONIZATION: - setSynchronization(syncMode); - break; - default: - setFPGASignal(d,mode); - break; - } - - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - } - - -// if (mode<=RO_TRIGGER_OUT_FALLING_EDGE && mode>=0) -// bus_w(EXT_SIGNAL_REG,((modes[mode])<=0) { -#ifdef VERBOSE - printf("writing signal register number %d mode %04x\n",d, modes[mode]); -#endif - bus_w(EXT_SIGNAL_REG,((modes[mode])<>off); - - if (mode=0 && d<4) { -#ifdef VERBOSE - printf("gettings signal variable number %d value %04x\n", d, signals[d]); -#endif - return signals[d]; - } else - return -1; - - -} - - -int getFPGASignal(int d) { - - int modes[]={SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE, GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE, TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,RO_TRIGGER_OUT_FALLING_EDGE}; - - int off=d*SIGNAL_OFFSET; - int mode=((bus_r(EXT_SIGNAL_REG)&(SIGNAL_MASK<>off); - - if (mode<=RO_TRIGGER_OUT_FALLING_EDGE) { - if (modes[mode]!=SIGNAL_OFF && signals[d]!=MASTER_SLAVE_SYNCHRONIZATION) - signals[d]=modes[mode]; -#ifdef VERYVERBOSE - printf("gettings signal register number %d value %04x\n", d, modes[mode]); -#endif - return modes[mode]; - } else - return -1; - -} - - - - - -/* -enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE -}; -*/ - - -int setTiming(int ti) { - - - int ret=GET_EXTERNAL_COMMUNICATION_MODE; - - int g=-1, t=-1, rot=-1; - - int i; - - switch (ti) { - case AUTO_TIMING: - timingMode=ti; - // disable all gates/triggers in except if used for master/slave synchronization - for (i=0; i<4; i++) { - if (getFPGASignal(i)>0 && getFPGASignal(i)=0 && t>=0 && rot<0) { - ret=GATE_WITH_START_TRIGGER; - } else if (g<0 && t>=0 && rot<0) { - ret=TRIGGER_EXPOSURE; - } else if (g>=0 && t<0 && rot<0) { - ret=GATE_FIX_NUMBER; - } else if (g<0 && t<0 && rot>0) { - ret=TRIGGER_READOUT; - } else if (g<0 && t<0 && rot<0) { - ret=AUTO_TIMING; - } - - // timingMode=ret; - - return ret; - -} - - - -int setConfigurationRegister(int d) { -#ifdef VERBOSE - printf("Setting configuration register to %x",d); -#endif - if (d>=0) { - bus_w(CONFIG_REG,d); - } -#ifdef VERBOSE - printf("configuration register is %x", bus_r(CONFIG_REG)); -#endif - return bus_r(CONFIG_REG); -} - -int setToT(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting ToT to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: ToT is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("ToT is %x\n", reg); -#endif - if (reg&TOT_ENABLE_BIT) - return 1; - else - return 0; -} - -int setContinousReadOut(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting Continous readout to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: Continous readout is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Continous readout is %x\n", reg); -#endif - if (reg&CONT_RO_ENABLE_BIT) - return 1; - else - return 0; -} - - -int startReceiver(int start) { - u_int32_t addr=CONFIG_REG; -#ifdef VERBOSE - if(start) - printf("Setting up detector to send to Receiver\n"); - else - printf("Setting up detector to send to CPU\n"); -#endif - int reg=bus_r(addr); - //for start recever, write 0 and for stop, write 1 - if (!start) - bus_w(CONFIG_REG,reg|CPU_OR_RECEIVER_BIT); - else - bus_w(CONFIG_REG,reg&(~CPU_OR_RECEIVER_BIT)); - - reg=bus_r(addr); -//#ifdef VERBOSE - printf("Config Reg %x\n", reg); -//#endif - int d =reg&CPU_OR_RECEIVER_BIT; - if(d!=0) d=1; - if(d!=start) - return OK; - else - return FAIL; -} - - -u_int64_t getDetectorNumber() { - char output[255],mac[255]=""; - u_int64_t res=0; - FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - return res; -} - -u_int32_t getFirmwareVersion() { - return bus_r(FPGA_VERSION_REG); -} - -u_int32_t getFirmwareSVNVersion(){ - return bus_r(FPGA_SVN_REG); -} - - -// for fpga test -u_int32_t testFpga(void) { - printf("Testing FPGA:\n"); - volatile u_int32_t val,addr,val2; - int result=OK,i; - //fixed pattern - val=bus_r(FIX_PATT_REG); - if (val==FIXED_PATT_VAL) { - printf("fixed pattern ok!! %08x\n",val); - } else { - printf("fixed pattern wrong!! %08x\n",val); - result=FAIL; - } - - //dummy register - addr = DUMMY_REG; - for(i=0;i<1000000;i++) - { - val=0x5A5A5A5A-i; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x5A5A5A5A-i) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); - result=FAIL; - } - val=(i+(i<<10)+(i<<20)); - bus_w(addr, val); - val2=bus_r(addr); - if (val2!=val) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); - result=FAIL; - } - val=0x0F0F0F0F; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x0F0F0F0F) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); - result=FAIL; - } - val=0xF0F0F0F0; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0xF0F0F0F0) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); - result=FAIL; - } - } - if(result==OK) - { - printf("----------------------------------------------------------------------------------------------"); - printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); - printf("----------------------------------------------------------------------------------------------"); - } - printf("\n"); - return result; -} - - -// for fpga test -u_int32_t testRAM(void) { - int result=OK; - int i=0; - allocateRAM(); - // while(i<100000) { - memcpy(ram_values, values, dataBytes); - printf ("Testing RAM:\t%d: copied fifo %x to memory %x size %d\n",i++, (unsigned int)(values), (unsigned int)(ram_values), dataBytes); - // } - return result; -} - -int getNModBoard() { - return nModX; -} - -int setNMod(int n) { - return nModX; -} - - -// fifo test -int testFifos(void) { - printf("Fifo test not implemented!\n"); - bus_w16(CONTROL_REG, START_FIFOTEST_BIT); - bus_w16(CONTROL_REG, 0x0); - return OK; -} - - - -// program dacq settings - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - if (value!=-1) { - vLSB=value&(0xffffffff); - bus_w(aLSB,vLSB); - v64=value>> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - } - return get64BitReg(aLSB, aMSB); - -} - -int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vLSB=bus_r(aLSB); - vMSB=bus_r(aMSB); - v64=vMSB; - v64=(v64<<32) | vLSB; - - printf("reg64(%x,%x) %x %x %llx\n", aLSB, aMSB, vLSB, vMSB, v64); - - return v64; -} - -int64_t setFrames(int64_t value){ - return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); -} - -int64_t getFrames(){ - printf("gf"); - return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); -} - -int64_t setExposureTime(int64_t value){ - /* time is in ns */ - if (value!=-1) - value*=(1E-9*CLK_FREQ); - return set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getExposureTime(){ - return get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t setGates(int64_t value){ - return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); -} - -int64_t getGates(){ - return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); -} - -int64_t setPeriod(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value*=(1E-9*CLK_FREQ); - } - - - - return set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getPeriod(){ - return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t setDelay(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value*=(1E-9*CLK_FREQ); - } - return set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getDelay(){ - return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t setTrains(int64_t value){ - return set64BitReg(value, SET_TRAINS_LSB_REG, SET_TRAINS_MSB_REG); -} - -int64_t getTrains(){ - return get64BitReg(GET_TRAINS_LSB_REG, GET_TRAINS_MSB_REG); -} - - -int64_t setProbes(int64_t value){ - return 0; -} - - -int64_t setProgress() { - - //????? eventually call after setting the registers - -return 0; - -} - - -int64_t getProgress() { - - - //should be done in firmware!!!! - - return 0; - -} - -int64_t getActualTime(){ - return get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getMeasurementTime(){ - int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); - int64_t mask=0x8000000000000000; - if (v & mask ) { -#ifdef VERBOSE - printf("no measurement time left\n"); -#endif - return -1E+9; - } else - return v/(1E-9*CLK_FREQ); -} - - - - -int loadImage(int index, short int ImageVals[]){ - u_int32_t address; - switch (index) { - case DARK_IMAGE : - address = DARK_IMAGE_REG; - break; - case GAIN_IMAGE : - address = GAIN_IMAGE_REG; - break; - } - volatile u_int16_t *ptr; - ptr=(u_int16_t*)(CSP0BASE+address*2); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,ImageVals[i]); -#endif - memcpy(ptr,ImageVals ,dataBytes); -#ifdef VERBOSE - printf("\nLoaded x%08x address with image of index %d\n",(unsigned int)(ptr),index); -#endif - return OK; -} - - - -int64_t getProbes(){ - return 0; -} - - -int setDACRegister(int idac, int val, int imod) { - u_int32_t addr, reg, mask; - int off; -#ifdef VERBOSE - if(val==-1) - printf("Getting dac register%d module %d\n",idac,imod); - else - printf("Setting dac register %d module %d to %d\n",idac,imod,val); -#endif - - switch(idac){ - case 0: - case 1: - case 2: - addr=MOD_DACS1_REG; - break; - case 3: - case 4: - case 5: - addr=MOD_DACS2_REG; - break; - case 6: - case 7: - addr=MOD_DACS3_REG; - break; - default: - printf("weird idac value %d\n",idac); - return -1; - break; - } - //saving only the msb - val=val>>2; - - off=(idac%3)*10; - mask=~((0x3ff)<=0 && val>off)&0x3ff; - //since we saved only the msb - val=val<<2; - - //val=(bus_r(addr)>>off)&0x3ff; - - -#ifdef VERBOSE - printf("Dac %d module %d register is %d\n\n",idac,imod,val); -#endif - return val; -} - - -int getTemperature(int tempSensor, int imod){ - int val; - imod=0;//ignoring more than 1 mod for now - int i,j,repeats=6; - u_int32_t tempVal=0; -#ifdef VERBOSE - char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; - printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); -#endif - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs - - for(i=0;i<20;i++) { - //repeats is number of register writes for delay - for(j=0;j>1);//fpga - } - } - - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - val=((int)tempVal)/4.0; - -#ifdef VERBOSE - printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); -#endif - return val; -} - - - -int initHighVoltage(int val, int imod){ -#ifdef VERBOSE - printf("Setting/Getting High Voltage of module:%d with val:%d\n",imod,val); -#endif - volatile u_int32_t addr=HV_REG; - int writeVal,writeVal2; - switch(val){ - case -1: break; - case 0: writeVal=0x0; writeVal2=0x0; break; - case 90: writeVal=0x0; writeVal2=0x1; break; - case 110:writeVal=0x2; writeVal2=0x3; break; - case 120:writeVal=0x4; writeVal2=0x5; break; - case 150:writeVal=0x6; writeVal2=0x7; break; - case 180:writeVal=0x8; writeVal2=0x9; break; - case 200:writeVal=0xA; writeVal2=0xB; break; - default :printf("Invalid voltage\n");return -2;break; - } - //to set value - if(val!=-1){ - //set value to converted value - bus_w(addr,writeVal); - bus_w(addr,writeVal2); -#ifdef VERBOSE - printf("Value sent is %d and then %d\n",writeVal,writeVal2); -#endif - } - //read value and return the converted value - val=bus_r(addr); -#ifdef VERBOSE - printf("Value read from reg is %d\n",val); -#endif - switch(val){ - case 0x0:val=0;break; - case 0x1:val=90;break; - case 0x3:val=110;break; - case 0x5:val=120;break; - case 0x7:val=150;break; - case 0x9:val=180;break; - case 0xB:val=200;break; - default:printf("Weird value read:%d\n",val);return -3;break; - } -#ifdef VERBOSE - printf("High voltage of module:%d is %d\n",imod,val); -#endif - return val; -} - - - -int initConfGain(int isettings,int val,int imod){ - int retval; - u_int32_t addr=GAIN_REG; - - if(val!=-1){ -#ifdef VERBOSE - printf("Setting Gain of module:%d with val:%d\n",imod,val); -#endif - bus_w(addr,((val<>SETTINGS_OFFSET); -#ifdef VERBOSE - printf("Settings read from reg is %d\n",retval); -#endif - if((isettings!=-1)&&(retval!=isettings)){ - printf("\n\nSettings r\n\n"); - return -1; - } - - return retval; -} - - - -int setADC(int adc){ - int reg,nchips,mask,nchans; - - if(adc==-1) ROI_flag=0; - else ROI_flag=1; - - setDAQRegister();//token timing - cleanFifo();//adc sync - -/* if(adc==-1){*/ - //set packet size - ipPacketSize= DEFAULT_IP_PACKETSIZE; - udpPacketSize=DEFAULT_UDP_PACKETSIZE; - //set channel mask - nchips = NCHIP; - nchans = NCHANS; - mask = ACTIVE_ADC_MASK; - /* - //with moench module 1 adc -- NOT IMPLEMENTED - else{ - ipPacketSize= ADC1_IP_PACKETSIZE; - udpPacketSize=ADC1_UDP_PACKETSIZE; - //set channel mask - nchips = NCHIPS_PER_ADC; - nchans = GOTTHARDNCHAN; - mask = 1<mac.mac_dest_mac1 =((macad>>(8*5))&0xFF);// 0x00; //pc7060 - mac_conf_regs->mac.mac_dest_mac2 =((macad>>(8*4))&0xFF);// 0x19; //pc7060 - mac_conf_regs->mac.mac_dest_mac3 =((macad>>(8*3))&0xFF);// 0x99; //pc7060 - mac_conf_regs->mac.mac_dest_mac4 =((macad>>(8*2))&0xFF);// 0x24; //pc7060 - mac_conf_regs->mac.mac_dest_mac5 =((macad>>(8*1))&0xFF);// 0xEB; //pc7060 - mac_conf_regs->mac.mac_dest_mac6 =((macad>>(8*0))&0xFF);// 0xEE; //pc7060 - - /* - mac_conf_regs->mac.mac_src_mac1 = 0x00; - mac_conf_regs->mac.mac_src_mac2 = 0xAA; - mac_conf_regs->mac.mac_src_mac3 = 0xBB; - mac_conf_regs->mac.mac_src_mac4 = 0xCC; - mac_conf_regs->mac.mac_src_mac5 = 0xDD; - mac_conf_regs->mac.mac_src_mac6 = 0xEE; - */ - mac_conf_regs->mac.mac_src_mac1 =((detectormacad>>(8*5))&0xFF); - mac_conf_regs->mac.mac_src_mac2 =((detectormacad>>(8*4))&0xFF); - mac_conf_regs->mac.mac_src_mac3 =((detectormacad>>(8*3))&0xFF); - mac_conf_regs->mac.mac_src_mac4 =((detectormacad>>(8*2))&0xFF); - mac_conf_regs->mac.mac_src_mac5 =((detectormacad>>(8*1))&0xFF); - mac_conf_regs->mac.mac_src_mac6 =((detectormacad>>(8*0))&0xFF); - mac_conf_regs->mac.mac_ether_type = 0x0800; //ipv4 - - - - mac_conf_regs->ip.ip_ver = 0x4; - mac_conf_regs->ip.ip_ihl = 0x5; - mac_conf_regs->ip.ip_tos = 0x0; - mac_conf_regs->ip.ip_len = ipPacketSize;//0x0522; // was 0x0526; - mac_conf_regs->ip.ip_ident = 0x0000; - mac_conf_regs->ip.ip_flag = 0x2; - mac_conf_regs->ip.ip_offset = 0x00; - mac_conf_regs->ip.ip_ttl = 0x70; - mac_conf_regs->ip.ip_protocol = 0x11; - mac_conf_regs->ip.ip_chksum = 0x0000 ; //6E42 now is automatically computed - mac_conf_regs->ip.ip_sourceip = detipad; //0x8181CA2E;129.129.202.46 - mac_conf_regs->ip.ip_destip = ipad; //CA57 - - //#ifdef VERBOSE - printf("mac_dest:%llx %x:%x:%x:%x:%x:%x\n", - macad, - mac_conf_regs->mac.mac_dest_mac1, - mac_conf_regs->mac.mac_dest_mac2, - mac_conf_regs->mac.mac_dest_mac3, - mac_conf_regs->mac.mac_dest_mac4, - mac_conf_regs->mac.mac_dest_mac5, - mac_conf_regs->mac.mac_dest_mac6); - printf("mac_src:%llx %x:%x:%x:%x:%x:%x\n", - detectormacad, - mac_conf_regs->mac.mac_src_mac1, - mac_conf_regs->mac.mac_src_mac2, - mac_conf_regs->mac.mac_src_mac3, - mac_conf_regs->mac.mac_src_mac4, - mac_conf_regs->mac.mac_src_mac5, - mac_conf_regs->mac.mac_src_mac6); - printf("ip_ttl:%x\n",mac_conf_regs->ip.ip_ttl); - printf("det_ip: %x %x\n",detipad, mac_conf_regs->ip.ip_sourceip); - printf("dest_ip: %x %x\n",ipad, mac_conf_regs->ip.ip_destip); - - //#endif - - //checksum - count=sizeof(mac_conf_regs->ip); - addr=&(mac_conf_regs->ip); - while( count > 1 ) { - sum += *addr++; - count -= 2; - } - if( count > 0 ) sum += *addr; // Add left-over byte, if any - while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - checksum = (~sum)&0xffff; - mac_conf_regs->ip.ip_chksum = checksum; - //#ifdef VERBOSE - printf("IP header checksum is 0x%x s\n",(unsigned int)(checksum)); - //#endif - - mac_conf_regs->udp.udp_srcport = 0xE185; - mac_conf_regs->udp.udp_destport = udpport;//0xC351; - mac_conf_regs->udp.udp_len = udpPacketSize;//0x050E; //was 0x0512; - mac_conf_regs->udp.udp_chksum = 0x0000; - -#ifdef VERBOSE - printf("Configuring TSE\n"); -#endif - tse_conf_regs->rev = 0xA00; - tse_conf_regs->scratch = 0xCCCCCCCC; - tse_conf_regs->command_config = 0xB; - tse_conf_regs->mac_0 = 0x17231C00; - tse_conf_regs->mac_1 = 0xCB4A; - tse_conf_regs->frm_length = 0x5DC; //max frame length (1500 bytes) (was 0x41C) - tse_conf_regs->pause_quant = 0x0; - tse_conf_regs->rx_section_empty = 0x7F0; - tse_conf_regs->rx_section_full = 0x10; - tse_conf_regs->tx_section_empty = 0x3F8; //was 0x7F0; - tse_conf_regs->tx_section_full = 0x16; - tse_conf_regs->rx_almost_empty = 0x8; - tse_conf_regs->rx_almost_full = 0x8; - tse_conf_regs->tx_almost_empty = 0x8; - tse_conf_regs->tx_almost_full = 0x3; - tse_conf_regs->mdio_addr0 = 0x12; - tse_conf_regs->mdio_addr1 = 0x0; - - mac_conf_regs->cdone = 0xFFFFFFFF; - - - if(ival) - bus_w(addrr,(INT_RSTN_BIT|ENET_RESETN_BIT|WRITE_BACK_BIT|DIGITAL_TEST_BIT)); //0x2840,write shadow regs.. - else - bus_w(addrr,(INT_RSTN_BIT|ENET_RESETN_BIT|WRITE_BACK_BIT)); //0x2840,write shadow regs.. - - val=bus_r(addrr); -#ifdef VERBOSE - printf("Value read from Multi-purpose Reg:%x\n",val); -#endif - // if(val!=0x2840) return -1; - - usleep(100000); - - if(ival) - bus_w(addrr,(INT_RSTN_BIT|ENET_RESETN_BIT|SW1_BIT|DIGITAL_TEST_BIT)); //0x2820,write shadow regs.. - else - bus_w(addrr,(INT_RSTN_BIT|ENET_RESETN_BIT|SW1_BIT)); //0x2820,write shadow regs.. - - val=bus_r(addrr); -#ifdef VERBOSE - printf("Value read from Multi-purpose Reg:%x\n",val); -#endif - // if(val!=0x2820) return -1; - - - - - return adcConfigured; -} - - -int getAdcConfigured(){ - return adcConfigured; -} - -u_int32_t runBusy(void) { - u_int32_t s = bus_r(STATUS_REG) & 1; -#ifdef VERBOSE - printf("status %04x\n",s); -#endif - return s; -} - -u_int32_t dataPresent(void) { - return bus_r(LOOK_AT_ME_REG); -} - -u_int32_t runState(void) { - int s=bus_r(STATUS_REG); -#ifdef SHAREDMEMORY - if (s&RUN_BUSY_BIT) - write_status_sm("Running"); - else - write_status_sm("Stopped"); -#endif -#ifdef VERBOSE - printf("status %04x\n",s); -#endif - -/* if (s==0x62001) - exit(-1);*/ - return s; -} - - -// State Machine - -int startStateMachine(){ -int i; -//#ifdef VERBOSE - printf("*******Starting State Machine*******\n"); -//#endif - cleanFifo(); - // fifoReset(); - now_ptr=(char*)ram_values; -#ifdef SHAREDMEMORY - write_stop_sm(0); - write_status_sm("Started"); -#endif - - - for(i=0;i<100;i++){ - //start state machine - bus_w16(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT); - bus_w16(CONTROL_REG, 0x0); - //verify - if(bus_r(STATUS_REG) & RUN_BUSY_BIT) - break; - else - usleep(5000); - } - if(i!=0) - printf("tried to start state machine %d times\n",i); - if(i==100){ - printf("\n***********COULD NOT START STATE MACHINE***************\n"); - return FAIL; - } - - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - return OK; -} - - - - -int stopStateMachine(){ - int i; -//#ifdef VERBOSE - printf("*******Stopping State Machine*******\n"); -//#endif -#ifdef SHAREDMEMORY - write_stop_sm(1); - write_status_sm("Stopped"); -#endif - for(i=0;i<100;i++){ - //stop state machine - bus_w16(CONTROL_REG, STOP_ACQ_BIT); - bus_w16(CONTROL_REG, 0x0); - usleep(5000); - //verify - if(!(bus_r(STATUS_REG)&RUNMACHINE_BUSY_BIT)) - break; - } - if(i!=0) - printf("tried to stop state machine %d times\n",i); - if(i==100){ - printf("\n***********COULD NOT STOP STATE MACHINE***************\n"); - return FAIL; - } - -/* - usleep(5000); - // if (!runBusy()) - if(!(bus_r(STATUS_REG)&RUNMACHINE_BUSY_BIT)) - return OK; - else - return FAIL; - */ - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - return OK; -} - - -int startReadOut(){ - u_int32_t status; -#ifdef VERBOSE - printf("Starting State Machine Readout\n"); -#endif - status=bus_r(STATUS_REG)&RUN_BUSY_BIT; -#ifdef DEBUG - printf("State machine status is %08x\n",bus_r(STATUS_REG)); -#endif - bus_w16(CONTROL_REG, START_ACQ_BIT |START_READOUT_BIT); // start readout - bus_w16(CONTROL_REG, 0x0); - return OK; -} - - -// fifo routines - -u_int32_t fifoReset(void) { - return -1; -} - - -u_int32_t setNBits(u_int32_t n) { - return -1; -} - -u_int32_t getNBits(){ - return -1; -} - - -u_int32_t fifoReadCounter(int fifonum){ - return -1; -} - -u_int32_t fifoReadStatus() -{ - // reads from the global status register - - return bus_r(STATUS_REG)&(SOME_FIFO_FULL_BIT | ALL_FIFO_EMPTY_BIT); -} - -u_int32_t fifo_full(void) -{ - // checks fifo empty flag returns 1 if fifo is empty - // otherwise 0 - return bus_r(STATUS_REG)&SOME_FIFO_FULL_BIT; -} - - -u_int32_t* fifo_read_event() -{ - - int i=0; - -#ifdef VIRTUAL - return NULL; -#endif - -#ifdef VERBOSE - printf("before looping\n"); -#endif - volatile u_int32_t t = bus_r(LOOK_AT_ME_REG); - -#ifdef VERBOSE - printf("lookatmereg=x%x\n",t); -#endif -/* - while ((t&0x1)==0) - { - t = bus_r(LOOK_AT_ME_REG); - if (!runBusy()){ - return NULL; - } - } -*/ - - while((t&0x1)==0) { -#ifdef VERYVERBOSE - printf("before readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); -#endif -#ifdef VERYVERBOSE - printf("look at me reg:%08x\n",bus_r(LOOK_AT_ME_REG)); -#endif - if (runBusy()==0) { - t = bus_r(LOOK_AT_ME_REG); -#ifdef VERYVERBOSE - printf("status should be idle!..look at me reg:%08x\n",bus_r(LOOK_AT_ME_REG)); -#endif - if ((t&0x1)==0) { -#ifdef VERBOSE - printf("no frame found - exiting\n"); - printf("%08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); -#endif -#ifdef VERYVERBOSE - printf("returning null\n"); -#endif - printf("lookatmereg=x%x\n",t); - return NULL; - } else { -#ifdef VERBOSE - printf("no frame found %x status %x\n", bus_r(LOOK_AT_ME_REG),runState()); -#endif - break; - } - } - t = bus_r(LOOK_AT_ME_REG); -#ifdef VERYVERBOSE - printf("before starting while loop again: look at me reg:%08x\n\n",bus_r(LOOK_AT_ME_REG)); -#endif - if (i%1000==0) - printf("%08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); - i++; - } -#ifdef VERYVERBOSE - printf(" out of while loop!\n"); -#endif -#ifdef VERYVERBOSE - printf("before readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); -#endif - - dma_memcpy(now_ptr,values ,dataBytes); - - -#ifdef VERYVERBOSE - int a; - for (a=0;a<8; a=a+2) - printf("\n%d %d: x%04x x%04x ",a+1,a,*(now_ptr+a+1),*(now_ptr+a) ); - for (a=2554;a<2560; a=a+2) - printf("\n%d %d: x%04x x%04x ",a+1,a,*(now_ptr+a+1),*(now_ptr+a) ); - printf("********\n"); - //memcpy(now_ptr, values, dataBytes); -#endif -#ifdef VERYVERBOSE - printf("Copying to ptr %08x %d\n",(unsigned int)(now_ptr), dataBytes); - printf("after readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); -#endif - - if (storeInRAM>0) { - now_ptr+=dataBytes; - } - printf("lookatmereg=x%x\n",t); - return ram_values; -} - - - -u_int32_t* decode_data(int *datain) -{ - u_int32_t *dataout; - // const char one=1; - const int bytesize=8; - char *ptr=(char*)datain; - //int nbits=dynamicRange; - int ipos=0, ichan=0;; - //int nch, boff=0; - int ibyte;//, ibit; - char iptr; - -#ifdef VERBOSE - printf("Decoding data for DR %d\n",dynamicRange); -#endif - dataout=malloc(nChans*nChips*nModX*4); - ichan=0; - switch (dynamicRange) { - case 1: - for (ibyte=0; ibyte>(ipos))&0x1; - ichan++; - } - } - break; - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan0) - storeInRAM=1; - else - storeInRAM=0; - return allocateRAM(); -} - - -int allocateRAM() { - size_t size; - u_int32_t nt, nf; - nt=setTrains(-1); - nf=setFrames(-1); - if (nt==0) nt=1; - if (nf==0) nf=1; - // ret=clearRAM(); - if (storeInRAM) { - size=dataBytes*nf*nt; - if (size>(23-i))&0x1)<> 8); - // printf("%i: %i %i\n",a, frame[a],v); - avg[a] += ((double)frame[a])/(double)frames; - //if(frame[a] == 8191) - // printf("ch %i: %u\n",a,frame[a]); - } - // printf("********\n"); - numberFrames++; - } - - //no more data or no data - else { - if(getFrames()>-2) { - dataret=FAIL; - printf("no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - - } else { - dataret=FINISHED; - printf("acquisition successfully finished\n"); - - } - printf("dataret %d\n",dataret); - } - } - - - - double nf = (double)numberFrames; - for(i =0; i < 1280; i++){ - adc = i / 256; - adcCh = (i - adc * 256) / 32; - Ch = i - adc * 256 - adcCh * 32; - adc--; - double v2 = avg[i]; - avg[i] = avg[i]/ ((double)numberFrames/(double)frames); - unsigned short v = (unsigned short)avg[i]; - printf("setting avg for channel %i(%i,%i,%i): %i (double= %f (%f))\t", i,adc,adcCh,Ch, v,avg[i],v2); - v=i*100; - ram_w16(DARK_IMAGE_REG,adc,adcCh,Ch,v-4096); - if(ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch) != v-4096){ - printf("value is wrong (%i,%i,%i): %i \n",adc,adcCh,Ch, ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch)); - } - } - - /*for(adc = 1; adc < 5; adc++){ - for(adcCh = 0; adcCh < 8; adcCh++){ - for(Ch=0 ; Ch < 32; Ch++){ - int channel = (adc+1) * 32 * 8 + adcCh * 32 + Ch; - double v2 = avg[channel]; - avg[channel] = avg[channel]/ ((double)numberFrames/(double)frames); - unsigned short v = (unsigned short)avg[channel]; - printf("setting avg for channel %i: %i (double= %f (%f))\t", channel, v,avg[channel],v2); - ram_w16(DARK_IMAGE_REG,adc,adcCh,Ch,v-4096); - if(ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch) != v-4096){ - printf("value is wrong (%i,%i,%i): %i \n",adc,adcCh,Ch, ram_r16(DARK_IMAGE_REG,adc,adcCh,Ch)); - } - } - } - }*/ - - - - printf("frames: %i\n",numberFrames); - printf("corrected avg by: %f\n",(double)numberFrames/(double)frames); - - printf("restoring previous condition\n"); - setFrames(framesBefore); - setPeriod(periodBefore); - - printf("---------------------------\n"); - return 0; -} - diff --git a/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.h b/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.h deleted file mode 100755 index 48918e428..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/firmware_funcs.h +++ /dev/null @@ -1,179 +0,0 @@ -#ifndef FIRMWARE_FUNCS_H -#define FIRMWARE_FUNCS_H - - -#include "sls_detector_defs.h" - - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -int mapCSP0(void); - -u_int16_t bus_r16(u_int32_t offset); -u_int16_t bus_w16(u_int32_t offset, u_int16_t data);//aldos function -u_int32_t bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); - -int setPhaseShiftOnce(); -int phaseStep(int st); -int cleanFifo(); -int setDAQRegister(); - -u_int32_t putout(char *s, int modnum); -u_int32_t readin(int modnum); -u_int32_t setClockDivider(int d); -u_int32_t getClockDivider(); -u_int32_t setSetLength(int d); -u_int32_t getSetLength(); -u_int32_t setWaitStates(int d); -u_int32_t getWaitStates(); -u_int32_t setTotClockDivider(int d); -u_int32_t getTotClockDivider(); -u_int32_t setTotDutyCycle(int d); -u_int32_t getTotDutyCycle(); -u_int32_t setOversampling(int d); - -u_int32_t setExtSignal(int d, enum externalSignalFlag mode); -int getExtSignal(int d); - -u_int32_t setFPGASignal(int d, enum externalSignalFlag mode); -int getFPGASignal(int d); - -int setTiming(int t); - - -int setConfigurationRegister(int d); -int setToT(int d); -int setContinousReadOut(int d); -int startReceiver(int d); - -int setDACRegister(int idac, int val, int imod); - -int getTemperature(int tempSensor,int imod); -int initHighVoltage(int val,int imod); -int initConfGain(int isettings,int val,int imod); - -int setADC(int adc); -int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int ival, int udpport); -int getAdcConfigured(); - - -u_int64_t getDetectorNumber(); -u_int32_t getFirmwareVersion(); -int testFifos(void); -u_int32_t testFpga(void); -u_int32_t testRAM(void); -int testBus(void); -int setDigitalTestBit(int ival); - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB); -int64_t get64BitReg(int aLSB, int aMSB); - -int64_t setFrames(int64_t value); -int64_t getFrames(); - -int64_t setExposureTime(int64_t value); -int64_t getExposureTime(); - -int64_t setGates(int64_t value); -int64_t getGates(); - -int64_t setDelay(int64_t value); -int64_t getDelay(); - -int64_t setPeriod(int64_t value); -int64_t getPeriod(); - -int64_t setTrains(int64_t value); -int64_t getTrains(); - -int64_t setProbes(int64_t value); -int64_t getProbes(); - -int64_t getProgress(); -int64_t setProgress(); - -int64_t getActualTime(); -int64_t getMeasurementTime(); - - -u_int32_t runBusy(void); -u_int32_t runState(void); -u_int32_t dataPresent(void); - - -int startStateMachine(); -int stopStateMachine(); -int startReadOut(); -u_int32_t fifoReset(void); -u_int32_t fifoReadCounter(int fifonum); -u_int32_t fifoReadStatus(); - - -u_int32_t fifo_full(void); - - - -u_int32_t* fifo_read_event(); -u_int32_t* decode_data(int* datain); -//u_int32_t move_data(u_int64_t* datain, u_int64_t* dataout); -int setDynamicRange(int dr); -int getDynamicRange(); -int getNModBoard(); -int setNMod(int n); -int setStoreInRAM(int b); -int allocateRAM(); -int clearRAM(); - - -int setMaster(int f); -int setSynchronization(int s); - -int loadImage(int index, short int ImageVals[]); -int readCounterBlock(int startACQ, short int CounterVals[]); -int resetCounterBlock(int startACQ); - -int calibratePedestal(int frames); - - - -/* - -u_int32_t setNBits(u_int32_t); -u_int32_t getNBits(); -*/ - -/* -//move to mcb_funcs? - -int readOutChan(int *val); -u_int32_t getModuleNumber(int modnum); -int testShiftIn(int imod); -int testShiftOut(int imod); -int testShiftStSel(int imod); -int testDataInOut(int num, int imod); -int testExtPulse(int imod); -int testExtPulseMux(int imod, int ow); -int testDataInOutMux(int imod, int ow, int num); -int testOutMux(int imod); -int testFpgaMux(int imod); -int calibration_sensor(int num, int *values, int *dacs) ; -int calibration_chip(int num, int *values, int *dacs); -*/ - - -#endif diff --git a/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt b/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt deleted file mode 100644 index 4ff46c75b..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/moenchDetectorServer -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: e6bd874a88493557fc5127d4a1686832299aaf06 -Revision: 85 -Branch: 3.0.1 -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 3346 -Last Changed Date: 2018-02-07 09:14:36.000000002 +0100 ./server_funcs.c diff --git a/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h b/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h deleted file mode 100644 index 96f110d39..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/gitInfoMoench.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "e6bd874a88493557fc5127d4a1686832299aaf06" -#define GITAUTH "Dhanya_Thattil" -#define GITREV 0x3346 -#define GITDATE 0x20180207 -#define GITBRANCH "3.0.1" diff --git a/slsDetectorSoftware/moenchDetectorServer/gitInfoMoenchTmp.h b/slsDetectorSoftware/moenchDetectorServer/gitInfoMoenchTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/gitInfoMoenchTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorSoftware/moenchDetectorServer/mcb_funcs.c b/slsDetectorSoftware/moenchDetectorServer/mcb_funcs.c deleted file mode 100755 index 1db487a31..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/mcb_funcs.c +++ /dev/null @@ -1,2528 +0,0 @@ -#ifdef MCB_FUNCS - -#include -#include -#include -#include -#include -#include "registers_m.h" - -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" - - -/* global variables */ -#undef DEBUG -#undef DEBUGOUT - -extern int nModX; -//extern int dataBytes; -extern int dynamicRange; -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; -const int allSelected=-2; -const int noneSelected=-1; - - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -int *detectorDacs=NULL; -int *detectorAdcs=NULL; -//int numberOfProbes; - -ROI rois[MAX_ROIS]; -int nROI=0; - - -int initDetector() { - - int imod; - // sls_detector_module *myModule; - int n=getNModBoard(); - nModX=n; - -#ifdef VERBOSE - printf("Board is for %d modules\n",n); -#endif - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorChips=malloc(n*NCHIP*sizeof(int)); - detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(n*NDAC*sizeof(int)); - detectorAdcs=malloc(n*NADC*sizeof(int)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",(unsigned int)(detectorModules), (unsigned int)(detectorModules+n)); - printf("chips from 0x%x to 0x%x\n",(unsigned int)(detectorChips), (unsigned int)(detectorChips+n*NCHIP)); - printf("chans from 0x%x to 0x%x\n",(unsigned int)(detectorChans), (unsigned int)(detectorChans+n*NCHIP*NCHAN)); - printf("dacs from 0x%x to 0x%x\n",(unsigned int)(detectorDacs), (unsigned int)(detectorDacs+n*NDAC)); - printf("adcs from 0x%x to 0x%x\n",(unsigned int)(detectorAdcs), (unsigned int)(detectorAdcs+n*NADC)); -#endif - for (imod=0; imoddacs=detectorDacs+imod*NDAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; - (detectorModules+imod)->ndac=NDAC; - (detectorModules+imod)->nadc=NADC; - (detectorModules+imod)->nchip=NCHIP; - (detectorModules+imod)->nchan=NCHIP*NCHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ - } - thisSettings=UNINITIALIZED; - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - - /* - setCSregister(ALLMOD); //commented out by dhanya - setSSregister(ALLMOD); - counterClear(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - */ - - /* initialize dynamic range etc. */ - /* dynamicRange=getDynamicRange(); //always 16 not required commented out - nModX=setNMod(-1);*/ - - //dataBytes=nModX*NCHIP*NCHAN*4; - // dynamicRange=32; - // initChip(0, 0,ALLMOD); - //nModX=n; - // - allocateRAM(); - - - return OK; -} - - - - -int copyChannel(sls_detector_channel *destChan, sls_detector_channel *srcChan) { - destChan->chan=srcChan->chan; - destChan->chip=srcChan->chip; - destChan->module=srcChan->module; - destChan->reg=srcChan->reg; - return OK; -} - - -int copyChip(sls_detector_chip *destChip, sls_detector_chip *srcChip) { - - int ichan; - int ret=OK; - if ((srcChip->nchan)>(destChip->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - - destChip->nchan=srcChip->nchan; - destChip->reg=srcChip->reg; - destChip->chip=srcChip->chip; - destChip->module=srcChip->module; - for (ichan=0; ichan<(srcChip->nchan); ichan++) { - *((destChip->chanregs)+ichan)=*((srcChip->chanregs)+ichan); - } - return ret; -} - - -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - - int ichip, idac, ichan, iadc; - - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",(unsigned int)(srcMod),(unsigned int)(destMod)); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ -/* #ifdef VERBOSE */ -/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ -/* #endif */ - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - - - - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - - -/* Register commands */ - - -int clearDACSregister(int imod) { - - putout("1111111111111111",imod);//reset - putout("1111111111111110",imod);//cs down - - /* commented out by dhanya - putout("0000000001000000",imod); - putout("0000000101000000",imod); - putout("0000000101000000",imod); - putout("0000000001000000",imod); - */ -#ifdef DEBUG - fprintf(stdout, "Clearing DAC shiftregister\n"); -#endif - // sDac=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - -int nextDAC(int imod) { - - putout("1111111111111011",imod);//cs up - putout("1111111111111001",imod);//clk down - putout("1111111111111111",imod);//reset - - /*commented out by dhanya - putout("0000000001000000",imod); - putout("0000000001001000",imod); - putout("0000000001000000",imod); - */ -#ifdef DEBUG - fprintf(stdout, "Next DAC\n"); -#endif - // sDac++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - - -int clearCSregister(int imod) { - - putout("0000000001000000",imod); - putout("0000100001000000",imod); - putout("0000100001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Clearing CS shiftregister\n"); -#endif - /* - sChan=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - */ - sChip=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - //putout("0000000000000000",imod); - return 0; -} - -int setCSregister(int imod){ - - putout("0000000001000000",imod); - putout("0001000001000000",imod); - putout("0001000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Setting CS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChip=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextChip(int imod){ - - putout("0000000001000000",imod); - putout("0010000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Next Chip\n"); -#endif - sChip++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int firstChip(int imod){ - - putout("0100000001000000",imod); - putout("0110000001000000",imod); - putout("0100000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "First Chip\n"); -#endif - sChip=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int clearSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0000111000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Clearing SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int setSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0001011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Setting SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextStrip(int imod){ - putout("0000011000000000",imod); - putout("0010011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"|-"); -#endif - sChan++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int selChannel(const int strip,int imod) { - int istrip; - clearSSregister(imod); - nextStrip(imod); - for (istrip=0; istrip=0 && imod=0) - initDAC(ind,val, imod); - - if (imod>=0 && imodndac) - return (detectorDacs[ind+imod*NDAC]); - } - return FAIL; - */ - return setDACRegister(ind, -1, imod); -} - - -int initDAC(int dac_addr, int value, int imod) { -// int i; -#ifdef VERBOSE - printf("Programming dac %d with value %d\n", dac_addr, value); -#endif - clearDACSregister(imod); - program_one_dac(dac_addr,value,imod); - nextDAC(imod); - clearDACSregister(imod); - - return 0; -} - -int getTemperatureByModule(int tempSensor, int imod) -{ - int im; - //for the particular module - if (imod>=0 && imod=0 && imod=0 && imod=0) { -#ifdef VERBOSE - fprintf(stdout, "voltage %d\n", *(v+iaddr)); -#endif - program_one_dac(iaddr, *(v+iaddr),imod); - } - nextDAC(imod); - } - - - clearDACSregister(imod); - - return 0; - -} - - - - -int setSettings(int i, int imod) { -#ifdef VERBOSE - if(i==-1) - printf("\nReading settings of detector...\n"); - else - printf("\ninside set settings wit settings=%d...\n",i); -#endif - int confgain[] = CONF_GAIN; - int isett=-2,retval; - - //reading settings - if(i==GET_SETTINGS){ - retval=initConfGainByModule(i,i,imod); - if(retval==i) - isett=UNDEFINED; - } - //writing settings - else{ - retval=initConfGainByModule(i,confgain[i],imod); - if(retval!=i) - isett=UNDEFINED; - } - //if error while read/writing - if(isett==UNDEFINED) - printf("Error:Weird Value read back from the Gain/Settings Reg\n"); - else{ - //validating the settings read back - if((retval>=HIGHGAIN)&&(retval<=VERYHIGHGAIN)) - isett=retval; - else{ - isett=UNDEFINED; - printf("Error:Wrong Settings Read out:%d\n",retval); - } - } - thisSettings=isett; -#ifdef VERBOSE - printf("detector settings are %d\n",thisSettings); -#endif - return thisSettings; -} - - - - -/* Initialization*/ - -int initChannelbyNumber(sls_detector_channel myChan) { - int reg=myChan.reg; - int ft=reg & TRIM_DR; - int cae=(reg>>(NTRIMBITS))&1; - int ae=(reg>>(NTRIMBITS+1))&1; - int coe=(reg>>(NTRIMBITS+2))&1; - int ocoe=(reg>>(NTRIMBITS+3))&1; - int counts=(reg>>(NTRIMBITS+4)); -#ifdef VERBOSE - printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); - printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); -#endif - - if (myChan.chip<0) - setCSregister(myChan.module); - else - selChip(myChan.chip,myChan.module); - - if (myChan.chan<0) - setSSregister(myChan.module); - else - selChannel(myChan.chan,myChan.module); - - initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); - - setDynamicRange(dynamicRange); - - setCSregister(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - - return myChan.reg; - -} - -int getChannelbyNumber(sls_detector_channel* myChan) { - int imod, ichip, ichan; - imod=myChan->module; - ichip=myChan->chip; - ichan=myChan->chan; - - if (detectorChans) { - if (imod=0) { - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; - return OK; - } - } - return FAIL; - -} - -int getTrimbit(int imod, int ichip, int ichan) { - if (detectorChans) { - if (imod=0) - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); - } - - return -1; -} - -int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){ - - int ibit, bit, i, im, ichip, ichan; - int chanmi, chanma, chipmi, chipma, modmi, modma; - - - - sMod=imod; - // printf("initializing module %d\n",sMod); - if (imod==ALLMOD) { - sMod=allSelected; - - // printf("initializing all modules\n"); - } - - if (sChan==allSelected) { - // printf("initializing all channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=NCHAN; - } else if (sChan==noneSelected || sChan>NCHAN || sChan<0) { - // printf("initializing no channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=-1; - } else { - // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); - chanmi=sChan; - chanma=sChan+1; - } - - if (sChip==allSelected) { - // printf("initializing all chips\n"); - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - // printf("initializing no chips\n"); - chipmi=0; - chipma=-1; - } else { - // printf("initializing chip %d\n",sChip); - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - return 1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChans) { - for (im=modmi; im63 || ft<0) { - fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); - return 1; - } - /*cal_enable*/ - if (cae) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - } - /*n_an_enable*/ - if (ae) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } else { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } - /*trb5*/ - ibit=5; - bit=ft & (1<>1; - int nchan, ichan; - int ft, cae, ae, coe, ocoe, counts, chanreg; - - - - nchan=myChip.nchan; - if (ichip<0) - setCSregister(imod); - else - selChip(ichip,imod); - - clearSSregister(imod); - for (ichan=0; ichan>(NTRIMBITS+1))&1; - ae=(chanreg>>(NTRIMBITS+2))&1; - coe=((chanreg)>>(NTRIMBITS+3))&1; - ocoe=((chanreg)>>(NTRIMBITS+4))&1; - counts=((chanreg)>>(NTRIMBITS+5)); - nextStrip(imod); - initChannel(ft,cae,ae, coe, ocoe, counts,imod); - } - initChip(obe,ow,imod); - return myChip.reg; - -} - -int getChipbyNumber(sls_detector_chip* myChip){ - int imod, ichip; - imod=myChip->module; - ichip=myChip->chip; - - if (detectorChips) { - if (imodnchip) { - myChip->reg=detectorChips[ichip+imod*NCHIP]; - myChip->nchan=NCHAN; - myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; - return OK; - } - } - return FAIL; - -} - - - -int initChip(int obe, int ow,int imod){ - int i; - int im, ichip; - int chipmi, chipma, modmi, modma; - /* switch (ow) { - case 0:; - case 1: - setDynamicRange(32); - break; - case 2: - setDynamicRange(16); - break; - case 3: - setDynamicRange(8); - break; - case 4: - setDynamicRange(4); - break; - case 5: - setDynamicRange(1); - break; - default: - setDynamicRange(32); - break; - } - */ - -#ifdef DEBUGOUT - printf("Initializing chip\n"); -#endif - putout("0000000000000000",imod); -#ifdef DEBUGOUT - printf("Output mode= %d\n", ow); -#endif - - /* clearing shift in register */ - for (i=0; i<10; i++) - putout("0000100000000000",imod); - putout("0000000000000000",imod); - - if (ow>0) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - for (i=0; i<(OUTMUX_OFFSET-1); i++) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>1) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>2) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>3) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>4) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - } -#ifdef DEBUGOUT - printf("Output buffer enable= %d\n", obe); -#endif - if (obe) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - /*}*/ - putout("0000000000000000",imod); - - - - - - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - - - if (sChip==allSelected) { - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imNCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imnModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorModules) { - for (im=modmi; imreg)=cm; -#ifdef VERBOSE - printf("imod=%d reg=%d (%x)\n",im,(detectorModules+im)->reg,(unsigned int)((detectorModules+im))); -#endif - } - } - return 0; -} - -int initModulebyNumber(sls_detector_module myMod) { - - printf("\ninside initmoduleynumber..\n"); - - int nchip,nchan;//int ichip, nchip, ichan, nchan; - int im, modmi,modma; - // int ft, cae, ae, coe, ocoe, counts, chanreg; - int imod; - // int obe; - // int ow; - int v[NDAC]; - - - nchip=myMod.nchip; - nchan=(myMod.nchan)/nchip; - - imod=myMod.module; - sMod=imod; - - if (sMod==ALLMOD) - sMod=allSelected; - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {// (sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - - /* - for (idac=0; idacmodule; -#ifdef VERBOSE - printf("Getting module %d\n",imod); -#endif - if (detectorModules) { - copyModule(myMod,detectorModules+imod); - ; - } else - return FAIL; - - return OK; -} - -/* To chips */ -int clearCounter(int imod){ - int i; -#ifdef DEBUG - printf("Clearing counter with contclear\n"); -#endif - putout("0000000000000000",imod); - for (i=0; i<10; i++) - putout("0000000000010000",imod); - putout("0000000000000000",imod); - - return 0; -} - -int clearOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Clearing output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0000110000000000",imod); - putout("0000010000000000",imod); - return 0; -} -int setOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Setting output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0001010000000000",imod); - putout("0000010000000000",imod); - return 0; -} - - -int extPulse(int ncal, int imod) { - int ical; -#ifdef DEBUG - printf("Giving a clock pulse to the counter\n"); -#endif - for (ical=0; ical0 && i%2==0) { - printf("Shift in: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<0 && (dum & (1<0) { - printf("Shift out: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, (dum &1<0 && i%2==0) { - printf("Shift stsel: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<> 1; - - - putout("0000000000000000",ALLMOD); - putout("0010000000000000",ALLMOD); //change mux setting - putout("0000000000000000",ALLMOD); - } - - printf("Test FpgaMux module %d : %d errors\n", imod,result); - if (result) - return 1; - else - return 0; -} - - - - - - - - - -int calibration_sensor(int num, int *v, int *dacs) { - int ich, ichip, imod; - int val[10]; - - - printf("calibrating sensor..."); - for (imod=0; imod=0){ - - if(n==0) - adc=-1; - else{ - //if its for 1 adc or general - if ((arg[0].xmin==0) && (arg[0].xmax==GOTTHARDNCHIP*GOTTHARDNCHAN)) - adc=-1; - else{ - //adc = mid value/numchans also for only 1 roi - adc = ((((arg[0].xmax)+(arg[0].xmin))/2)/(GOTTHARDNCHAN*NCHIPS_PER_ADC)); - if((adc>=0) && (adc<=4)); - else { - printf("warning:adc value greater than 5. deleting roi\n"); - adc=-1; - } - } - } - - - //set rois for just 1 adc - take only 1st roi - if(adc!=-1){ - rois[0].xmin=adc*(GOTTHARDNCHAN*NCHIPS_PER_ADC); - rois[0].xmax=(adc+1)*(GOTTHARDNCHAN*NCHIPS_PER_ADC)-1; - rois[0].ymin=-1; - rois[0].ymax=-1; - nROI = 1; - }else - nROI = 0; - - if((arg[0].xmin!=rois[0].xmin)||(arg[0].xmax!=rois[0].xmax)||(arg[0].ymin!=rois[0].ymin)||(arg[0].ymax!=rois[0].ymax)) - *ret=FAIL; - if(n!=nROI) - *ret=FAIL; - - //set adc of interest - setADC(adc); - }*/ - -//#ifdef VERBOSE - printf("Rois:\n"); - for( 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 Nk5l4rl$-I|{{$6L%BKJT diff --git a/slsDetectorSoftware/moenchDetectorServer/registers_m.h b/slsDetectorSoftware/moenchDetectorServer/registers_m.h deleted file mode 100755 index 87c398d87..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/registers_m.h +++ /dev/null @@ -1,309 +0,0 @@ -#ifndef REGISTERS_G_H -#define REGISTERS_G_H - - -#include "sls_detector_defs.h" - - -/* Definitions for FPGA*/ -#define CSP0 0x20200000 -#define MEM_SIZE 0x100000 - - - -/* values defined for FPGA */ -#define MCSNUM 0x0 -#define FIXED_PATT_VAL 0xacdc1980 - - -#define FPGA_INIT_PAT 0x60008 -#define FPGA_INIT_ADDR 0xb0000000 - - - - -/* registers defined in FPGA */ -#define PCB_REV_REG 0x2c<<11 -#define GAIN_REG 0x10<<11 -//#define FLOW_CONTROL_REG 0x11<<11 -//#define FLOW_STATUS_REG 0x12<<11 -//#define FRAME_REG 0x13<<11 -#define MULTI_PURPOSE_REG 0x14<<11 -#define DAQ_REG 0x15<<11 -//#define TIME_FROM_START_REG 0x16<<11 -#define MCB_CNTRL_REG_OFF 0x17<<11// control the dacs -//ADC -#define ADC_WRITE_REG 0x18<<11 -#define ADC_SYNC_REG 0x19<<11 -//#define MUTIME_REG 0x1a<<11 -//temperature -#define TEMP_IN_REG 0x1b<<11 -#define TEMP_OUT_REG 0x1c<<11 -//configure MAC -#define TSE_CONF_REG 0x1d<<11 -#define ENET_CONF_REG 0x1e<<11 -//#define WRTSE_SHAD_REG 0x1f<<11 -//HV -#define HV_REG 0x20<<11 - - -#define DUMMY_REG 0x21<<11 -#define FPGA_VERSION_REG 0x22<<11 -#define FIX_PATT_REG 0x23<<11 -#define CONTROL_REG 0x24<<11 -#define STATUS_REG 0x25<<11 -#define CONFIG_REG 0x26<<11 -#define EXT_SIGNAL_REG 0x27<<11 -#define FPGA_SVN_REG 0x29<<11 - - -#define CHIP_OF_INTRST_REG 0x2A<<11 - -//FIFO -#define LOOK_AT_ME_REG 0x28<<11 - -#define FIFO_DATA_REG_OFF 0x50<<11 /////// - - -//to read back dac registers -#define MOD_DACS1_REG 0x65<<11 -#define MOD_DACS2_REG 0x66<<11 -#define MOD_DACS3_REG 0x67<<11 - -//user entered -#define SET_DELAY_LSB_REG 0x68<<11 -#define SET_DELAY_MSB_REG 0x69<<11 -#define GET_DELAY_LSB_REG 0x6a<<11 -#define GET_DELAY_MSB_REG 0x6b<<11 - -#define SET_TRAINS_LSB_REG 0x6c<<11 -#define SET_TRAINS_MSB_REG 0x6d<<11 -#define GET_TRAINS_LSB_REG 0x6e<<11 -#define GET_TRAINS_MSB_REG 0x6f<<11 - -#define SET_FRAMES_LSB_REG 0x70<<11 -#define SET_FRAMES_MSB_REG 0x71<<11 -#define GET_FRAMES_LSB_REG 0x72<<11 -#define GET_FRAMES_MSB_REG 0x73<<11 - -#define SET_PERIOD_LSB_REG 0x74<<11 -#define SET_PERIOD_MSB_REG 0x75<<11 -#define GET_PERIOD_LSB_REG 0x76<<11 -#define GET_PERIOD_MSB_REG 0x77<<11 - -#define SET_EXPTIME_LSB_REG 0x78<<11 -#define SET_EXPTIME_MSB_REG 0x79<<11 -#define GET_EXPTIME_LSB_REG 0x7a<<11 -#define GET_EXPTIME_MSB_REG 0x7b<<11 - -#define SET_GATES_LSB_REG 0x7c<<11 -#define SET_GATES_MSB_REG 0x7d<<11 -#define GET_GATES_LSB_REG 0x7e<<11 -#define GET_GATES_MSB_REG 0x7f<<11 - - - -#define PLL_PARAM_REG 0x37<<11 -#define PLL_PARAM_OUT_REG 0x38<<11 -#define PLL_CNTRL_REG 0x34<<11 - -#define ROI_REG 0x35<<11 -#define OVERSAMPLING_REG 0x36<<11 -#define MOENCH_CNTR_REG 0x31<<11 -#define MOENCH_CNTR_OUT_REG 0x33<<11 -#define MOENCH_CNTR_CONF_REG 0x32<<11 - - - -//image -#define DARK_IMAGE_REG 0x81<<11 -#define GAIN_IMAGE_REG 0x82<<11 - -//counter block memory -#define COUNTER_MEMORY_REG 0x85<<11 - - -#define GET_MEASUREMENT_TIME_LSB_REG 0x023000 -#define GET_MEASUREMENT_TIME_MSB_REG 0x024000 - -#define GET_ACTUAL_TIME_LSB_REG 0x025000 -#define GET_ACTUAL_TIME_MSB_REG 0x026000 - - -//not used -//#define MCB_DOUT_REG_OFF 0x200000 -//#define FIFO_CNTRL_REG_OFF 0x300000 -//#define FIFO_COUNTR_REG_OFF 0x400000 -//not used so far -//#define SPEED_REG 0x006000 -//#define SET_NBITS_REG 0x008000 -//not used -//#define GET_SHIFT_IN_REG 0x022000 - - - -#define SHIFTMOD 2 -#define SHIFTFIFO 9 - -/** for PCB_REV_REG */ -#define DETECTOR_TYPE_MASK 0xF0000 -#define DETECTOR_TYPE_OFFSET 16 -#define BOARD_REVISION_MASK 0xFFFF -#define MOENCH_MODULE 2 - - - - -/* for control register */ -#define START_ACQ_BIT 0x00000001 -#define STOP_ACQ_BIT 0x00000002 -#define START_FIFOTEST_BIT 0x00000004 // ????? -#define STOP_FIFOTEST_BIT 0x00000008 // ?????? -#define START_READOUT_BIT 0x00000010 -#define STOP_READOUT_BIT 0x00000020 -#define START_EXPOSURE_BIT 0x00000040 -#define STOP_EXPOSURE_BIT 0x00000080 -#define START_TRAIN_BIT 0x00000100 -#define STOP_TRAIN_BIT 0x00000200 -#define SYNC_RESET 0x00000400 - -/* for status register */ -#define RUN_BUSY_BIT 0x00000001 -#define READOUT_BUSY_BIT 0x00000002 -#define FIFOTEST_BUSY_BIT 0x00000004 //???? -#define WAITING_FOR_TRIGGER_BIT 0x00000008 -#define DELAYBEFORE_BIT 0x00000010 -#define DELAYAFTER_BIT 0x00000020 -#define EXPOSING_BIT 0x00000040 -#define COUNT_ENABLE_BIT 0x00000080 -#define READSTATE_0_BIT 0x00000100 -#define READSTATE_1_BIT 0x00000200 -#define READSTATE_2_BIT 0x00000400 - -#define RUNSTATE_0_BIT 0x00001000 -#define RUNSTATE_1_BIT 0x00002000 -#define RUNSTATE_2_BIT 0x00004000 -#define SOME_FIFO_FULL_BIT 0x00008000 // error! -#define ALL_FIFO_EMPTY_BIT 0x00010000 // data ready -#define RUNMACHINE_BUSY_BIT 0x00020000 -#define READMACHINE_BUSY_BIT 0x00040000 - - - -/* for fifo status register */ -#define FIFO_ENABLED_BIT 0x80000000 -#define FIFO_DISABLED_BIT 0x01000000 -#define FIFO_ERROR_BIT 0x08000000 -#define FIFO_EMPTY_BIT 0x04000000 -#define FIFO_DATA_READY_BIT 0x02000000 -#define FIFO_COUNTER_MASK 0x000001ff -#define FIFO_NM_MASK 0x00e00000 -#define FIFO_NM_OFF 21 -#define FIFO_NC_MASK 0x001ffe00 -#define FIFO_NC_OFF 9 - -/* for config register *///not really used yet -#define TOT_ENABLE_BIT 0x00000002 -#define TIMED_GATE_BIT 0x00000004 -#define CONT_RO_ENABLE_BIT 0x00080000 -#define CPU_OR_RECEIVER_BIT 0x00001000 - - - -/* for speed register */ -#define CLK_DIVIDER_MASK 0x000000ff -#define CLK_DIVIDER_OFFSET 0 -#define SET_LENGTH_MASK 0x00000f00 -#define SET_LENGTH_OFFSET 8 -#define WAIT_STATES_MASK 0x0000f000 -#define WAIT_STATES_OFFSET 12 -#define TOTCLK_DIVIDER_MASK 0xff000000 -#define TOTCLK_DIVIDER_OFFSET 24 -#define TOTCLK_DUTYCYCLE_MASK 0x00ff0000 -#define TOTCLK_DUTYCYCLE_OFFSET 16 - -/* for external signal register */ -#define SIGNAL_OFFSET 4 -#define SIGNAL_MASK 0xF -#define EXT_SIG_OFF 0x0 -#define EXT_GATE_IN_ACTIVEHIGH 0x1 -#define EXT_GATE_IN_ACTIVELOW 0x2 -#define EXT_TRIG_IN_RISING 0x3 -#define EXT_TRIG_IN_FALLING 0x4 -#define EXT_RO_TRIG_IN_RISING 0x5 -#define EXT_RO_TRIG_IN_FALLING 0x6 -#define EXT_GATE_OUT_ACTIVEHIGH 0x7 -#define EXT_GATE_OUT_ACTIVELOW 0x8 -#define EXT_TRIG_OUT_RISING 0x9 -#define EXT_TRIG_OUT_FALLING 0xA -#define EXT_RO_TRIG_OUT_RISING 0xB -#define EXT_RO_TRIG_OUT_FALLING 0xC - - - -/* for temperature register */ -#define T1_CLK_BIT 0x00000001 -#define T1_CS_BIT 0x00000002 -#define T2_CLK_BIT 0x00000004 -#define T2_CS_BIT 0x00000008 - - - -/* fifo control register */ -#define FIFO_RESET_BIT 0x00000001 -#define FIFO_DISABLE_TOGGLE_BIT 0x00000002 - - -//chip shiftin register meaning -#define OUTMUX_OFF 20 -#define OUTMUX_MASK 0x1f -#define PROBES_OFF 4 -#define PROBES_MASK 0x7f -#define OUTBUF_OFF 0 -#define OUTBUF_MASK 1 - - -/* multi purpose register */ -#define PHASE_STEP_BIT 0x00000001 -#define PHASE_STEP_OFFSET 0 -// #define xxx_BIT 0x00000002 -#define RESET_COUNTER_BIT 0x00000004 -#define RESET_COUNTER_OFFSET 2 -//#define xxx_BIT 0x00000008 -//#define xxx_BIT 0x00000010 -#define SW1_BIT 0x00000020 -#define SW1_OFFSET 5 -#define WRITE_BACK_BIT 0x00000040 -#define WRITE_BACK_OFFSET 6 -#define RESET_BIT 0x00000080 -#define RESET_OFFSET 7 -#define ENET_RESETN_BIT 0x00000800 -#define ENET_RESETN_OFFSET 11 -#define INT_RSTN_BIT 0x00002000 -#define INT_RSTN_OFFSET 13 -#define DIGITAL_TEST_BIT 0x00004000 -#define DIGITAL_TEST_OFFSET 14 -//#define CHANGE_AT_POWER_ON_BIT 0x00008000 -//#define CHANGE_AT_POWER_ON_OFFSET 15 - - -/* settings/conf gain register */ -#define GAIN_MASK 0x0000000f -#define GAIN_OFFSET 0 -#define SETTINGS_MASK 0x000000f0 -#define SETTINGS_OFFSET 4 - - -/* CHIP_OF_INTRST_REG */ -#define CHANNEL_MASK 0xffff0000 -#define CHANNEL_OFFSET 16 -#define ACTIVE_ADC_MASK 0x0000001f - - - -/**ADC SYNC CLEAN FIFO*/ -#define ADCSYNC_CLEAN_FIFO_BITS 0x300000 -#define CLEAN_FIFO_MASK 0x0fffff - -#endif - diff --git a/slsDetectorSoftware/moenchDetectorServer/server.c b/slsDetectorSoftware/moenchDetectorServer/server.c deleted file mode 100755 index acf625119..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/server.c +++ /dev/null @@ -1,112 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ - -#include "sls_detector_defs.h" - -#include "communication_funcs.h" -#include "server_funcs.h" -#include - - -extern int sockfd; -extern int phase_shift; - - - -void error(char *msg) -{ - perror(msg); -} - -int main(int argc, char *argv[]) -{ - int portno, b; - char cmd[500]; - int retval=OK; - int sd, fd; - int iarg; - - - for(iarg=1; iarg 2) && (!strcasecmp(argv[2],"stopserver"))){ - portno = DEFAULT_PORTNO+1; - if ( sscanf(argv[1],"%d",&portno) ==0) { - printf("could not open stop server: unknown port\n"); - return 1; - } - b=0; - printf("\n\nStop Server\nOpening stop server on port %d\n",portno); - } - - //control server - else { - portno = DEFAULT_PORTNO; - sprintf(cmd,"%s %d stopserver &",argv[0],DEFAULT_PORTNO+1); - printf("\n\nControl Server\nOpening control server on port %d\n",portno ); - - //printf("\n\ncmd:%s\n",cmd); - system(cmd); - b=1; - } - - - init_detector(b); - - - sd=bindSocket(portno); - sockfd=sd; - if (getServerError(sd)) { - printf("server error!\n"); - return -1; - } - - /* assign function table */ - function_table(); -#ifdef VERBOSE - printf("function table assigned \n"); -#endif - - - /* waits for connection */ - while(retval!=GOODBYE) { -#ifdef VERBOSE - printf("\n"); -#endif -#ifdef VERY_VERBOSE - printf("Waiting for client call\n"); -#endif - fd=acceptConnection(sockfd); -#ifdef VERY_VERBOSE - printf("Conenction accepted\n"); -#endif - retval=decode_function(fd); -#ifdef VERY_VERBOSE - printf("function executed\n"); -#endif - closeConnection(fd); -#ifdef VERY_VERBOSE - printf("connection closed\n"); -#endif - } - - exitServer(sockfd); - printf("Goodbye!\n"); - - return 0; -} - diff --git a/slsDetectorSoftware/moenchDetectorServer/server_defs.h b/slsDetectorSoftware/moenchDetectorServer/server_defs.h deleted file mode 100755 index e86b3107f..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/server_defs.h +++ /dev/null @@ -1,61 +0,0 @@ -#ifndef SERVER_DEFS_H -#define SERVER_DEFS_H - -#include "sls_detector_defs.h" - -#include - - -// Hardware definitions - -#define NCHAN (160*160) -#define NCHIP 1 -#define NMAXMODX 1 -#define NMAXMODY 1 -#define NMAXMOD (NMAXMODX*NMAXMODY) -#define NDAC 8 -#define NADC 1 - - - - - - -#define NCHANS (NCHAN*NCHIP*NMAXMOD) -#define NDACS (NDAC*NMAXMOD) - -#define NTRIMBITS 6 -#define NCOUNTBITS 24 - -#define NCHIPS_PER_ADC 2 - -//#define TRIM_DR ((2**NTRIMBITS)-1) -//#define COUNT_DR ((2**NCOUNTBITS)-1) -#define TRIM_DR (((int)pow(2,NTRIMBITS))-1) -#define COUNT_DR (((int)pow(2,NCOUNTBITS))-1) - - -#define ALLMOD 0xffff -#define ALLFIFO 0xffff - -#define GOTTHARD_ADCSYNC_VAL 0x32214 -#define ADCSYNC_VAL 0x02111 -#define TOKEN_RESTART_DELAY 0x88000000 -#define TOKEN_RESTART_DELAY_ROI 0x1b000000 -#define TOKEN_TIMING_REV1 0x1f16 -#define TOKEN_TIMING_REV2 0x1f0f - -#define DEFAULT_PHASE_SHIFT 0 // 120 -#define DEFAULT_IP_PACKETSIZE 0x0522 -#define DEFAULT_UDP_PACKETSIZE 0x050E -#define ADC1_IP_PACKETSIZE 256*2+14+20 -#define ADC1_UDP_PACKETSIZE 256*2+4+8+2 - -#ifdef VIRTUAL -#define DEBUGOUT -#endif - -#define CLK_FREQ 65.6E+6 - - -#endif diff --git a/slsDetectorSoftware/moenchDetectorServer/server_funcs.c b/slsDetectorSoftware/moenchDetectorServer/server_funcs.c deleted file mode 100755 index 33f776c33..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/server_funcs.c +++ /dev/null @@ -1,3083 +0,0 @@ -#include "sls_detector_defs.h" -#include "server_funcs.h" -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "trimming_funcs.h" -#include "registers_m.h" -#include "gitInfoMoench.h" - -#define FIFO_DATA_REG_OFF 0x50<<11 -#define CONTROL_REG 0x24<<11 -// Global variables - - -int (*flist[256])(int); - - -//defined in the detector specific file -#ifdef MYTHEND -const enum detectorType myDetectorType=MYTHEN; -#elif GOTTHARDD -const enum detectorType myDetectorType=GOTTHARD; -#elif EIGERD -const enum detectorType myDetectorType=EIGER; -#elif PICASSOD -const enum detectorType myDetectorType=PICASSO; -#elif MOENCHD -const enum detectorType myDetectorType=MOENCH; -#else -const enum detectorType myDetectorType=GENERIC; -#endif - - -extern int nModX; -extern int nModY; -extern int dataBytes; -extern int dynamicRange; -extern int storeInRAM; - -extern int lockStatus; -extern char lastClientIP[INET_ADDRSTRLEN]; -extern char thisClientIP[INET_ADDRSTRLEN]; -extern int differentClients; - -/* global variables for optimized readout */ -extern unsigned int *ram_values; -char *dataretval=NULL; -int nframes, iframes, dataret; -char mess[MAX_STR_LENGTH]; - -int digitalTestBit = 0; - - -int init_detector(int b) { - if (mapCSP0()==FAIL) { printf("Could not map memory\n"); - exit(1); - } - - // - - bus_w16(CONTROL_REG, SYNC_RESET); - bus_w16(CONTROL_REG, 0x0); - - //confirm if it is really moench - if(((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET) != MOENCH_MODULE ){ - printf("This is a Gotthard detector. Exiting Moench Server.\n\n"); - exit(-1); - } - - if (b) { - printf("***This is a MOENCH detector with %d chips per module***\n",NCHIP); - -#ifdef MCB_FUNCS - printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); - initDetector(); - printf("Initializing Detector\n"); - bus_w16(CONTROL_REG, SYNC_RESET); // reset registers -#endif - - - testFpga(); - testRAM(); - printf("ADC_SYNC_REG:%x\n",bus_r(ADC_SYNC_REG)); - //moench specific - - // setPhaseShiftOnce(); //firmware.h - - - prepareADC(); // server_funcs - setADC(-1); //already does setdaqreg and clean fifo - setSettings(GET_SETTINGS,-1); - - //Initialization - setFrames(1); - setTrains(1); - setExposureTime(1e3); - setPeriod(1E6); - setDelay(0); - setGates(0); - - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - setMaster(GET_MASTER); - setSynchronization(GET_SYNCHRONIZATION_MODE); - startReceiver(0); //firmware - } - strcpy(mess,"dummy message"); - strcpy(lastClientIP,"none"); - strcpy(thisClientIP,"none1"); - lockStatus=0; - return OK; -} - - -int decode_function(int file_des) { - int fnum,n; - int retval=FAIL; -#ifdef VERBOSE - printf( "receive data\n"); -#endif - n = receiveDataOnly(file_des,&fnum,sizeof(fnum)); - if (n <= 0) { -#ifdef VERBOSE - printf("ERROR reading from socket %d, %d %d\n", n, fnum, file_des); -#endif - return FAIL; - } -#ifdef VERBOSE - else - printf("size of data received %d\n",n); -#endif - -#ifdef VERBOSE - printf( "calling function fnum = %d %x\n",fnum,(unsigned int)(flist[fnum])); -#endif - if (fnum<0 || fnum>255) - fnum=255; - retval=(*flist[fnum])(file_des); - if (retval==FAIL) - printf( "Error executing the function = %d \n",fnum); - return retval; -} - - -int function_table() { - int i; - for (i=0;i<256;i++){ - flist[i]=&M_nofunc; - } - flist[F_EXIT_SERVER]=&exit_server; - flist[F_EXEC_COMMAND]=&exec_command; - flist[F_GET_DETECTOR_TYPE]=&get_detector_type; - flist[F_SET_NUMBER_OF_MODULES]=&set_number_of_modules; - flist[F_GET_MAX_NUMBER_OF_MODULES]=&get_max_number_of_modules; - flist[F_SET_EXTERNAL_SIGNAL_FLAG]=&set_external_signal_flag; - flist[F_SET_EXTERNAL_COMMUNICATION_MODE]=&set_external_communication_mode; - flist[F_GET_ID]=&get_id; - flist[F_DIGITAL_TEST]=&digital_test; - flist[F_WRITE_REGISTER]=&write_register; - flist[F_READ_REGISTER]=&read_register; - flist[F_SET_DAC]=&set_dac; - flist[F_GET_ADC]=&get_adc; - flist[F_SET_CHANNEL]=&set_channel; - flist[F_SET_CHIP]=&set_chip; - flist[F_SET_MODULE]=&set_module; - flist[F_GET_CHANNEL]=&get_channel; - flist[F_GET_CHIP]=&get_chip; - flist[F_GET_MODULE]=&get_module; - flist[F_GET_THRESHOLD_ENERGY]=&get_threshold_energy; - flist[F_SET_THRESHOLD_ENERGY]=&set_threshold_energy; - flist[F_SET_SETTINGS]=&set_settings; - flist[F_START_ACQUISITION]=&start_acquisition; - flist[F_STOP_ACQUISITION]=&stop_acquisition; - flist[F_START_READOUT]=&start_readout; - flist[F_GET_RUN_STATUS]=&get_run_status; - flist[F_READ_FRAME]=&read_frame; - flist[F_READ_ALL]=&read_all; - flist[F_START_AND_READ_ALL]=&start_and_read_all; - flist[F_SET_TIMER]=&set_timer; - flist[F_GET_TIME_LEFT]=&get_time_left; - flist[F_SET_DYNAMIC_RANGE]=&set_dynamic_range; - flist[F_SET_ROI]=&set_roi; - flist[F_SET_SPEED]=&set_speed; - flist[F_SET_READOUT_FLAGS]=&set_readout_flags; - flist[F_EXECUTE_TRIMMING]=&execute_trimming; - flist[F_LOCK_SERVER]=&lock_server; - flist[F_SET_PORT]=&set_port; - flist[F_GET_LAST_CLIENT_IP]=&get_last_client_ip; - flist[F_UPDATE_CLIENT]=&update_client; - flist[F_CONFIGURE_MAC]=&configure_mac; - flist[F_LOAD_IMAGE]=&load_image; - flist[F_SET_MASTER]=&set_master; - flist[F_SET_SYNCHRONIZATION_MODE]=&set_synchronization; - flist[F_READ_COUNTER_BLOCK]=&read_counter_block; - flist[F_RESET_COUNTER_BLOCK]=&reset_counter_block; - flist[F_START_RECEIVER]=&start_receiver; - flist[F_STOP_RECEIVER]=&stop_receiver; - flist[F_CALIBRATE_PEDESTAL]=&calibrate_pedestal; - return OK; -} - - -int M_nofunc(int file_des){ - - int ret=FAIL; - sprintf(mess,"Unrecognized Function\n"); - printf(mess); - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - - -int exit_server(int file_des) { - int retval=FAIL; - sendDataOnly(file_des,&retval,sizeof(retval)); - printf("closing server."); - sprintf(mess,"closing server"); - sendDataOnly(file_des,mess,sizeof(mess)); - return GOODBYE; -} - -int exec_command(int file_des) { - char cmd[MAX_STR_LENGTH]; - char answer[MAX_STR_LENGTH]; - int retval=OK; - int sysret=0; - int n=0; - - /* receive arguments */ - n = receiveDataOnly(file_des,cmd,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - - /* execute action if the arguments correctly arrived*/ - if (retval==OK) { -#ifdef VERBOSE - printf("executing command %s\n", cmd); -#endif - if (lockStatus==0 || differentClients==0) - sysret=system(cmd); - - //should be replaced by popen - if (sysret==0) { - sprintf(answer,"Succeeded\n"); - if (lockStatus==1 && differentClients==1) - sprintf(answer,"Detector locked by %s\n", lastClientIP); - } else { - sprintf(answer,"Failed\n"); - retval=FAIL; - } - } else { - sprintf(answer,"Could not receive the command\n"); - } - - /* send answer */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - n = sendDataOnly(file_des,answer,MAX_STR_LENGTH); - if (n < 0) { - sprintf(mess,"Error writing to socket"); - retval=FAIL; - } - - - /*return ok/fail*/ - return retval; - -} - - - -int get_detector_type(int file_des) { - int n=0; - enum detectorType ret; - int retval=OK; - - sprintf(mess,"Can't return detector type\n"); - - - /* receive arguments */ - /* execute action */ - ret=myDetectorType; - -#ifdef VERBOSE - printf("Returning detector type %d\n",ret); -#endif - - /* send answer */ - /* send OK/failed */ - if (differentClients==1) - retval=FORCE_UPDATE; - - n += sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - - -} - - -int set_number_of_modules(int file_des) { - int n; - int arg[2], ret=0; - int retval=OK; - int dim, nm; - - sprintf(mess,"Can't set number of modules\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket %d", n); - retval=GOODBYE; - } - if (retval==OK) { - dim=arg[0]; - nm=arg[1]; - - /* execute action */ -#ifdef VERBOSE - printf("Setting the number of modules in dimension %d to %d\n",dim,nm ); -#endif - - //if (nm!=GET_FLAG) { - if (dim!=X && nm!=GET_FLAG) { - retval=FAIL; - sprintf(mess,"Can't change module number in dimension %d\n",dim); - } else { - if (lockStatus==1 && differentClients==1 && nm!=GET_FLAG) { - sprintf(mess,"Detector locked by %s\n", lastClientIP); - retval=FAIL; - } else { - ret=setNMod(nm); - if (nModX==nm || nm==GET_FLAG) { - retval=OK; - if (differentClients==1) - retval=FORCE_UPDATE; - } else - retval=FAIL; - } - } - } - /*} else { - if (dim==Y) { - ret=nModY; - } else if (dim==X) { - ret=setNMod(-1); - } - } - */ - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - /*return ok/fail*/ - return retval; - -} - - -int get_max_number_of_modules(int file_des) { - int n; - int ret; - int retval=OK; - enum dimension arg; - - sprintf(mess,"Can't get max number of modules\n"); - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* execute action */ -#ifdef VERBOSE - printf("Getting the max number of modules in dimension %d \n",arg); -#endif - - - switch (arg) { - case X: - ret=getNModBoard(); - break; - case Y: - ret=NMAXMODY; - break; - default: - ret=FAIL; - retval=FAIL; - break; - } -#ifdef VERBOSE - printf("Max number of module in dimension %d is %d\n",arg,ret ); -#endif - - - - if (differentClients==1 && retval==OK) { - retval=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - - /*return ok/fail*/ - return retval; -} - - -//index 0 is in gate -//index 1 is in trigger -//index 2 is out gate -//index 3 is out trigger - -int set_external_signal_flag(int file_des) { - int n; - int arg[2]; - int ret=OK; - int signalindex; - enum externalSignalFlag flag, retval; - - sprintf(mess,"Can't set external signal flag\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - retval=SIGNAL_OFF; - if (ret==OK) { - signalindex=arg[0]; - flag=arg[1]; - /* execute action */ - switch (flag) { - case GET_EXTERNAL_SIGNAL_FLAG: - retval=getExtSignal(signalindex); - break; - - default: - if (differentClients==0 || lockStatus==0) { - retval=setExtSignal(signalindex,flag); - } else { - if (lockStatus!=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n", lastClientIP); - } - } - - } - -#ifdef VERBOSE - printf("Setting external signal %d to flag %d\n",signalindex,flag ); - printf("Set to flag %d\n",retval); -#endif - - } else { - ret=FAIL; - } - - if (ret==OK && differentClients!=0) - ret=FORCE_UPDATE; - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - -int set_external_communication_mode(int file_des) { - int n; - enum externalCommunicationMode arg, ret=GET_EXTERNAL_COMMUNICATION_MODE; - int retval=OK; - - sprintf(mess,"Can't set external communication mode\n"); - - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } - /* - enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE - }; - */ - if (retval==OK) { - /* execute action */ - - ret=setTiming(arg); - - /* switch(arg) { */ - /* default: */ - /* sprintf(mess,"The meaning of single signals should be set\n"); */ - /* retval=FAIL; */ - /* } */ - - -#ifdef VERBOSE - printf("Setting external communication mode to %d\n", arg); -#endif - } else - ret=FAIL; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&retval,sizeof(retval)); - if (retval!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&ret,sizeof(ret)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return retval; -} - - - -int get_id(int file_des) { - // sends back 64 bits! - int64_t retval=-1; - int ret=OK; - int n=0; - enum idMode arg; - - sprintf(mess,"Can't return id\n"); - - /* receive arguments */ - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Getting id %d\n", arg); -#endif - - switch (arg) { - case DETECTOR_SERIAL_NUMBER: - retval=getDetectorNumber(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval = (getFirmwareVersion() & 0xFFFFFF); - break; - case DETECTOR_SOFTWARE_VERSION: - retval = (GITDATE & 0xFFFFFF); - break; - default: - printf("Required unknown id %d \n", arg); - ret=FAIL; - retval=FAIL; - break; - } - -#ifdef VERBOSE - printf("Id is %llx\n", retval); -#endif - - if (differentClients==1) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int digital_test(int file_des) { - - int retval; - int ret=OK; - int imod=-1; - int n=0; - int ibit=0; - int ow; - int ival; - enum digitalTestMode arg; - - sprintf(mess,"Can't send digital test\n"); - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - -#ifdef VERBOSE - printf("Digital test mode %d\n",arg ); -#endif - - switch (arg) { - case CHIP_TEST: - n = receiveDataOnly(file_des,&imod,sizeof(imod)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - retval=FAIL; - } -#ifdef VERBOSE - printf("of module %d\n", imod); -#endif - retval=0; -#ifdef MCB_FUNCS - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - break; - } - if (imod >= nModX) { - ret=FAIL; - sprintf(mess,"Module %d disabled\n",imod); - break; - } - if (testShiftIn(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftOut(imod)) retval|=(1<<(ibit)); - ibit++; - if (testShiftStSel(imod)) retval|=(1<<(ibit)); - ibit++; - //if ( testDataInOut(0x123456, imod)) retval|=(1<<(ibit++)); - //if ( testExtPulse(imod)) retval|=(1<<(ibit++)); - // for (ow=0; ow<6; ow++) - // ow=1; - //#ifndef PICASSOD - for (ow=0; ow<5; ow++) { - //#endif - if (testDataInOutMux(imod, ow, 0x789abc)) retval|=(1<=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - -#ifdef MCB_FUNCS - switch (ind) { - case V_DAC0 : - idac=VDAC0; - break; - case V_DAC1: - idac=VDAC1; - break; - case V_DAC2: - idac=VDAC2; - break; - case V_DAC3: - idac=VDAC3; - break; - case V_DAC4: - idac=VDAC4; - break; - case V_DAC5: - idac=VDAC5; - break; - case V_DAC6: - idac=VDAC6; - break; - case V_DAC7: - idac=VDAC7; - break; - case HV_POT: - idac=HIGH_VOLTAGE; - break; - - default: - printf("Unknown DAC index %d for Moench\n",ind); - sprintf(mess,"Unknown DAC index %d for Moench\n",ind); - ret=FAIL; - break; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - if(idac==HIGH_VOLTAGE){ - retval[0]=initHighVoltageByModule(val,imod); - ret=FAIL; - if(retval[0]==-2) - strcpy(mess,"Invalid Voltage.Valid values are 0,90,110,120,150,180,200"); - else if(retval[0]==-3) - strcpy(mess,"Weird value read back or it has not been set yet\n"); - else - ret=OK; - }else{ - initDACbyIndexDACU(idac,val,imod,mV,retval); - ret=FAIL; - if(mV) - temp = retval[1]; - else - temp = retval[0]; - if ((abs(temp-val)<=3) || val==-1) { - ret=OK; -#ifdef VERBOSE - printf("DAC set to %d in dac units and %d mV\n", retval[0],retval[1]); -#endif - } - } - } - } - -#endif - - - if(ret==FAIL) - printf("Setting dac %d of module %d: wrote %d but read %d\n", ind, imod, val, temp); - else{ - if (differentClients) - ret=FORCE_UPDATE; - } - - - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - -int get_adc(int file_des) { - //default: mod 0 - int retval; - int ret=OK; - int arg[2]; - enum dacIndex ind; - int imod; - int n; - int idac=0; - - sprintf(mess,"Can't read ADC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ind=arg[0]; - imod=arg[1]; - -#ifdef VERBOSE - printf("Getting ADC %d of module %d\n", ind, imod); -#endif - - if (imod>=getNModBoard() || imod<0) - ret=FAIL; - -#ifdef MCB_FUNCS - switch (ind) { - case TEMPERATURE_FPGA: - idac=TEMP_FPGA; - break; - case TEMPERATURE_ADC: - idac=TEMP_ADC; - break; - default: - printf("Unknown DAC index %d\n",ind); - sprintf(mess,"Unknown DAC index %d\n",ind); - ret=FAIL; - break; - } - - if (ret==OK) - retval=getTemperatureByModule(idac,imod); -#endif - -#ifdef VERBOSE - printf("ADC is %d V\n", retval); -#endif - if (ret==FAIL) { - printf("Getting adc %d of module %d failed\n", ind, imod); - } - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; - -} - -int set_channel(int file_des) { - int ret=OK; - sls_detector_channel myChan; - int retval; - int n; - - - sprintf(mess,"Can't set channel\n"); - -#ifdef VERBOSE - printf("Setting channel\n"); -#endif - ret=receiveChannel(file_des, &myChan); - if (ret>=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("channel number is %d, chip number is %d, module number is %d, register is %lld\n", myChan.chan,myChan.chip, myChan.module, myChan.reg); -#endif - - if (ret==OK) { - if (myChan.module>=getNModBoard()) - ret=FAIL; - if (myChan.chip>=NCHIP) - ret=FAIL; - if (myChan.chan>=NCHAN) - ret=FAIL; - if (myChan.module<0) - myChan.module=ALLMOD; - } - - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChannelbyNumber(myChan); -#endif - } - } - /* Maybe this is done inside the initialization funcs */ - //copyChannel(detectorChans[myChan.module][myChan.chip]+(myChan.chan), &myChan); - - - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - /*return ok/fail*/ - return ret; - -} - - - - -int get_channel(int file_des) { - - int ret=OK; - sls_detector_channel retval; - - int arg[3]; - int ichan, ichip, imod; - int n; - - sprintf(mess,"Can't get channel\n"); - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichan=arg[0]; - ichip=arg[1]; - imod=arg[2]; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0 && ichan=0) - ret=OK; - else - ret=FAIL; -#ifdef VERBOSE - printf("chip number is %d, module number is %d, register is %d, nchan %d\n",myChip.chip, myChip.module, myChip.reg, myChip.nchan); -#endif - - if (ret==OK) { - if (myChip.module>=getNModBoard()) - ret=FAIL; - if (myChip.module<0) - myChip.module=ALLMOD; - if (myChip.chip>=NCHIP) - ret=FAIL; - } - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initChipbyNumber(myChip); -#endif - } - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - - return ret; -} - -int get_chip(int file_des) { - - - int ret=OK; - sls_detector_chip retval; - int arg[2]; - int ichip, imod; - int n; - - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - ichip=arg[0]; - imod=arg[1]; - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod=0 && ichip=0) - ret=OK; - else - ret=FAIL; - - -#ifdef VERBOSE - printf("module number is %d,register is %d, nchan %d, nchip %d, ndac %d, nadc %d, gain %f, offset %f\n",myModule.module, myModule.reg, myModule.nchan, myModule.nchip, myModule.ndac, myModule.nadc, myModule.gain,myModule.offset); -#endif - - if (ret==OK) { - if (myModule.module>=getNModBoard()) { - ret=FAIL; - printf("Module number is too large %d\n",myModule.module); - } - if (myModule.module<0) - myModule.module=ALLMOD; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { -#ifdef MCB_FUNCS - retval=initModulebyNumber(myModule); -#endif - } - } - - if (differentClients==1 && ret==OK) - ret=FORCE_UPDATE; - - /* Maybe this is done inside the initialization funcs */ - //copyChip(detectorChips[myChip.module]+(myChip.chip), &myChip); - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - free(myChip); - free(myChan); - free(myDac); - free(myAdc); - - // setDynamicRange(dr); always 16 commented out - - - return ret; -} - - - - -int get_module(int file_des) { - - - int ret=OK; - - - int arg; - int imod; - int n; - - - - sls_detector_module myModule; - int *myChip=malloc(NCHIP*sizeof(int)); - int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); - int *myDac=malloc(NDAC*sizeof(int));/**dhanya*/ - int *myAdc=malloc(NADC*sizeof(int));/**dhanya*/ - - - if (myDac) - myModule.dacs=myDac; - else { - sprintf(mess,"could not allocate dacs\n"); - ret=FAIL; - } - if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; - } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } - - myModule.ndac=NDAC; - myModule.nchip=NCHIP; - myModule.nchan=NCHAN*NCHIP; - myModule.nadc=NADC; - - - - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - imod=arg; - - if (ret==OK) { - ret=FAIL; - if (imod>=0 && imod-2) { - dataret=FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - printf("%s\n",mess); - } else { - dataret=FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s\n",mess); - } -#ifdef VERYVERBOSE - printf("%d %d %x %s\n",(int)(sizeof(mess)),(int)(strlen(mess)),(unsigned int)( mess),mess); -#endif - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); -#ifdef VERYVERBOSE - printf("message sent %s\n",mess); -#endif - printf("dataret %d\n",dataret); - return dataret; - } - } else { - nframes=0; - while(fifo_read_event()) { - nframes++; - } - dataretval=(char*)ram_values; - dataret=OK; -#ifdef VERBOSE - printf("sending data of %d frames\n",nframes); -#endif - for (iframes=0; iframes-2) { - dataret=FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames()+2)); - printf("%s\n",mess); - } else { - dataret=FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s\n",mess); - if (differentClients) - dataret=FORCE_UPDATE; - } -#ifdef VERBOSE - printf("Frames left %d\n",(int)(getFrames())); -#endif - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - printf("dataret %d\n",dataret); - return dataret; - } - printf("dataret %d\n",dataret); - return dataret; -} - - - - - - - - -int read_all(int file_des) { - -while(read_frame(file_des)==OK) { - -#ifdef VERBOSE - printf("frame read\n"); -#endif - ; - } -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - return OK; - - -} - -int start_and_read_all(int file_des) { - //int dataret=OK; -#ifdef VERBOSE - printf("Starting and reading all frames\n"); -#endif - - if (differentClients==1 && lockStatus==1) { - dataret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - return dataret; - - } - - startStateMachine(); - - /* ret=startStateMachine(); - if (ret!=OK) { - sprintf(mess,"could not start state machine\n"); - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - #ifdef VERBOSE - printf("could not start state machine\n"); -#endif -} else {*/ - read_all(file_des); -#ifdef VERBOSE - printf("Frames finished\n"); -#endif - //} - - - return OK; - - -} - -int set_timer(int file_des) { - enum timerIndex ind; - int64_t tns; - int n; - int64_t retval; - int ret=OK; - - - sprintf(mess,"can't set timer\n"); - - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&tns,sizeof(tns)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret!=OK) { - printf(mess); - } - -#ifdef VERBOSE - printf("setting timer %d to %lld ns\n",ind,tns); -#endif - if (ret==OK) { - - if (differentClients==1 && lockStatus==1 && tns!=-1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch(ind) { - case FRAME_NUMBER: - retval=setFrames(tns); - break; - case ACQUISITION_TIME: - retval=setExposureTime(tns); - break; - case FRAME_PERIOD: - retval=setPeriod(tns); - break; - case DELAY_AFTER_TRIGGER: - retval=setDelay(tns); - break; - case GATES_NUMBER: - retval=setGates(tns); - break; - case PROBES_NUMBER: - sprintf(mess,"can't set timer for moench\n"); - ret=FAIL; - break; - case CYCLES_NUMBER: - retval=setTrains(tns); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - } - if (ret!=OK) { - printf(mess); - if (differentClients) - ret=FORCE_UPDATE; - } - - if (ret!=OK) { - printf(mess); - printf("set timer failed\n"); - } else if (ind==FRAME_NUMBER) { - ret=allocateRAM(); - if (ret!=OK) - sprintf(mess, "could not allocate RAM for %lld frames\n", tns); - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { -#ifdef VERBOSE - printf("returning ok %d\n",(int)(sizeof(retval))); -#endif - - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - - return ret; - -} - - - - - - - - -int get_time_left(int file_des) { - - enum timerIndex ind; - int n; - int64_t retval; - int ret=OK; - - sprintf(mess,"can't get timer\n"); - n = receiveDataOnly(file_des,&ind,sizeof(ind)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - //#ifdef VERBOSE - - printf("getting time left on timer %d \n",ind); - //#endif - - if (ret==OK) { - switch(ind) { - case FRAME_NUMBER: - printf("getting frames \n"); - retval=getFrames(); - break; - case ACQUISITION_TIME: - retval=getExposureTime(); - break; - case FRAME_PERIOD: - retval=getPeriod(); - break; - case DELAY_AFTER_TRIGGER: - retval=getDelay(); - break; - case GATES_NUMBER: - retval=getGates(); - break; - case PROBES_NUMBER: - retval=getProbes(); - break; - case CYCLES_NUMBER: - retval=getTrains(); - break; - case PROGRESS: - retval=getProgress(); - break; - case ACTUAL_TIME: - retval=getActualTime(); - break; - case MEASUREMENT_TIME: - retval=getMeasurementTime(); - break; - default: - ret=FAIL; - sprintf(mess,"timer index unknown %d\n",ind); - break; - } - } - - - if (ret!=OK) { - printf("get time left failed\n"); - } else if (differentClients) - ret=FORCE_UPDATE; - - //#ifdef VERBOSE - - printf("time left on timer %d is %lld\n",ind, retval); - //#endif - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=OK) { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } -#ifdef VERBOSE - - printf("data sent\n"); -#endif - - return ret; - - -} - -int set_dynamic_range(int file_des) { - - - - int dr; - int n; - int retval; - int ret=OK; - - - sprintf(mess,"can't set dynamic range\n"); - - - n = receiveDataOnly(file_des,&dr,sizeof(dr)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - - if (differentClients==1 && lockStatus==1 && dr>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setDynamicRange(dr); - } - - //if (dr>=0 && retval!=dr) ret=FAIL; - if (ret!=OK) { - sprintf(mess,"set dynamic range failed\n"); - } else { - ret=allocateRAM(); - if (ret!=OK) - sprintf(mess,"Could not allocate RAM for the dynamic range selected\n"); - else if (differentClients) - ret=FORCE_UPDATE; - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - -int set_roi(int file_des) { - - int i; - int ret=OK; - int nroi=-1; - int n=0; - int retvalsize=0; - ROI arg[MAX_ROIS]; - ROI* retval=0; - - strcpy(mess,"Could not set/get roi\n"); - - - n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if(nroi!=-1){ - n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); - if (n != (nroi*sizeof(ROI))) { - sprintf(mess,"Received wrong number of bytes for ROI\n"); - ret=FAIL; - } -//#ifdef VERBOSE - /* - printf("Setting ROI to:"); - for( i=0;i=0) { - if (differentClients==1 && lockStatus==1 && val>=0) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - switch (arg) { - case CLOCK_DIVIDER: - retval=setClockDivider(val); - break; - - case PHASE_SHIFT: - retval=phaseStep(val); - break; - - case OVERSAMPLING: - retval=setOversampling(val); - break; - - default: - ret=FAIL; - sprintf(mess,"Unknown speed parameter %d",arg); - } - } - } - - - switch (arg) { - case CLOCK_DIVIDER: - retval=getClockDivider(); - break; - - case PHASE_SHIFT: - retval=phaseStep(-1); - break; - - case OVERSAMPLING: - retval=setOversampling(-1); - break; - - default: - ret=FAIL; - sprintf(mess,"Unknown speed parameter %d",arg); - } - } - - - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - -int set_readout_flags(int file_des) { - - enum readOutFlags arg; - int n; - int ret=FAIL; - - - receiveDataOnly(file_des,&arg,sizeof(arg)); - - sprintf(mess,"can't set readout flags for moench\n"); - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - return ret; -} - - - - - -int execute_trimming(int file_des) { - - int arg[3]; - int ret=FAIL; - enum trimMode mode; - - sprintf(mess,"can't set execute trimming for moench\n"); - - receiveDataOnly(file_des,&mode,sizeof(mode)); - receiveDataOnly(file_des,arg,sizeof(arg)); - - - sendDataOnly(file_des,&ret,sizeof(ret)); - sendDataOnly(file_des,mess,sizeof(mess)); - - return ret; -} - - -int lock_server(int file_des) { - - - int n; - int ret=OK; - - int lock; - n = receiveDataOnly(file_des,&lock,sizeof(lock)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (lock)\n"); - ret=FAIL; - } - if (lock>=0) { - if (lockStatus==0 || strcmp(lastClientIP,thisClientIP)==0 || strcmp(lastClientIP,"none")==0) - lockStatus=lock; - else { - ret=FAIL; - sprintf(mess,"Server already locked by %s\n", lastClientIP); - } - } - if (differentClients && ret==OK) - ret=FORCE_UPDATE; - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else - n = sendDataOnly(file_des,&lockStatus,sizeof(lockStatus)); - - return ret; - -} - -int set_port(int file_des) { - int n; - int ret=OK; - int sd=-1; - - enum portType p_type; /** data? control? stop? Unused! */ - int p_number; /** new port number */ - - n = receiveDataOnly(file_des,&p_type,sizeof(p_type)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (ptype)\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,&p_number,sizeof(p_number)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - printf("Error reading from socket (pnum)\n"); - ret=FAIL; - } - if (differentClients==1 && lockStatus==1 ) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - if (p_number<1024) { - sprintf(mess,"Too low port number %d\n", p_number); - printf("\n"); - ret=FAIL; - } - - printf("set port %d to %d\n",p_type, p_number); - - sd=bindSocket(p_number); - } - if (sd>=0) { - ret=OK; - if (differentClients ) - ret=FORCE_UPDATE; - } else { - ret=FAIL; - sprintf(mess,"Could not bind port %d\n", p_number); - printf("Could not bind port %d\n", p_number); - if (sd==-10) { - sprintf(mess,"Port %d already set\n", p_number); - printf("Port %d already set\n", p_number); - - } - } - - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&p_number,sizeof(p_number)); - closeConnection(file_des); - exitServer(sockfd); - sockfd=sd; - - } - - return ret; - -} - -int get_last_client_ip(int file_des) { - int ret=OK; - int n; - if (differentClients ) - ret=FORCE_UPDATE; - n = sendDataOnly(file_des,&ret,sizeof(ret)); - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - - return ret; - -} - - -int send_update(int file_des) { - - int ret=OK; - enum detectorSettings t; - int n;//int thr, n; - //int it; - int64_t retval, tns=-1; - n = sendDataOnly(file_des,lastClientIP,sizeof(lastClientIP)); - n = sendDataOnly(file_des,&nModX,sizeof(nModX)); - n = sendDataOnly(file_des,&nModY,sizeof(nModY)); - n = sendDataOnly(file_des,&dynamicRange,sizeof(dynamicRange)); - n = sendDataOnly(file_des,&dataBytes,sizeof(dataBytes)); - t=setSettings(GET_SETTINGS,-1); - n = sendDataOnly(file_des,&t,sizeof(t)); -/* thr=getThresholdEnergy(); - n = sendDataOnly(file_des,&thr,sizeof(thr));*/ - retval=setFrames(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setExposureTime(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setPeriod(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setDelay(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - retval=setGates(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); -/* retval=setProbes(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t));*/ - retval=setTrains(tns); - n = sendDataOnly(file_des,&retval,sizeof(int64_t)); - - if (lockStatus==0) { - strcpy(lastClientIP,thisClientIP); - } - - return ret; - - -} -int update_client(int file_des) { - - int ret=OK; - - sendDataOnly(file_des,&ret,sizeof(ret)); - return send_update(file_des); - - - -} - - -int configure_mac(int file_des) { - - int ret=OK; - char arg[6][50]; - int n; - - int imod=0;//should be in future sent from client as -1, arg[2] - int ipad; - long long int imacadd; - long long int idetectormacadd; - int udpport; - int detipad; - int retval=-100; - - sprintf(mess,"Can't configure MAC\n"); - - - n = receiveDataOnly(file_des,arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - sscanf(arg[0], "%x", &ipad); - sscanf(arg[1], "%llx", &imacadd); - sscanf(arg[2], "%x", &udpport); - sscanf(arg[3], "%llx", &idetectormacadd); - sscanf(arg[4], "%x", &detipad); -//arg[5] is for eiger -#ifdef VERBOSE - int i; - printf("\ndigital_test_bit in server %d\t",digitalTestBit); - printf("\nipadd %x\t",ipad); - printf("destination ip is %d.%d.%d.%d = 0x%x \n",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff,ipad); - printf("macad:%llx\n",imacadd); - for (i=0;i<6;i++) - printf("mac adress %d is 0x%x \n",6-i,(unsigned int)(((imacadd>>(8*i))&0xFF))); - printf("udp port:0x%x\n",udpport); - printf("detector macad:%llx\n",idetectormacadd); - for (i=0;i<6;i++) - printf("detector mac adress %d is 0x%x \n",6-i,(unsigned int)(((idetectormacadd>>(8*i))&0xFF))); - printf("detipad %x\n",detipad); - printf("\n"); -#endif - - - - if (imod>=getNModBoard()) - ret=FAIL; - if (imod<0) - imod=ALLMOD; - - //#ifdef VERBOSE - printf("Configuring MAC of module %d at port %x\n", imod, udpport); - //#endif -#ifdef MCB_FUNCS - if (ret==OK){ - if(runBusy()){ - ret=stopStateMachine(); - if(ret==FAIL) - strcpy(mess,"could not stop detector acquisition to configure mac"); - } - - if(ret==OK) - configureMAC(ipad,imacadd,idetectormacadd,detipad,digitalTestBit,udpport); - retval=getAdcConfigured(); - } -#endif - if (ret==FAIL) - printf("configuring MAC of mod %d failed\n", imod); - else - printf("Configuremac successful of mod %d and adc %d\n",imod,retval); - - if (differentClients) - ret=FORCE_UPDATE; - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - /*return ok/fail*/ - return ret; - -} - - - -int load_image(int file_des) { - int retval; - int ret=OK; - int n; - enum imageType index; - short int ImageVals[NCHAN*NCHIP]; - - sprintf(mess,"Loading image failed\n"); - - n = receiveDataOnly(file_des,&index,sizeof(index)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - n = receiveDataOnly(file_des,ImageVals,dataBytes); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - switch (index) { - case DARK_IMAGE : -#ifdef VERBOSE - printf("Loading Dark image\n"); -#endif - break; - case GAIN_IMAGE : -#ifdef VERBOSE - printf("Loading Gain image\n"); -#endif - break; - default: - printf("Unknown index %d\n",index); - sprintf(mess,"Unknown index %d\n",index); - ret=FAIL; - break; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - retval=loadImage(index,ImageVals); - if (retval==-1) - ret = FAIL; - } - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,&retval,sizeof(retval)); - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - -int set_master(int file_des) { - - enum masterFlags retval=GET_MASTER; - enum masterFlags arg; - int n; - int ret=OK; - // int regret=OK; - - - sprintf(mess,"can't set master flags\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - retval=setMaster(arg); - - } - if (retval==GET_MASTER) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int set_synchronization(int file_des) { - - enum synchronizationMode retval=GET_MASTER; - enum synchronizationMode arg; - int n; - int ret=OK; - //int regret=OK; - - - sprintf(mess,"can't set synchronization mode\n"); - - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } -#ifdef VERBOSE - printf("setting master flags to %d\n",arg); -#endif - - if (differentClients==1 && lockStatus==1 && arg!=GET_READOUT_FLAGS) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else { - //ret=setStoreInRAM(0); - // initChipWithProbes(0,0,0, ALLMOD); - retval=setSynchronization(arg); - } - if (retval==GET_SYNCHRONIZATION_MODE) { - ret=FAIL; - } - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) { - n = sendDataOnly(file_des,mess,sizeof(mess)); - } else { - n = sendDataOnly(file_des,&retval,sizeof(retval)); - } - return ret; -} - - - - - - -int read_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - //char *retval=NULL; - short int CounterVals[NCHAN*NCHIP]; - - sprintf(mess,"Read counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else{ - ret=readCounterBlock(startACQ,CounterVals); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,CounterVals[i]); -#endif - } - } - - if(ret!=FAIL){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret!=FAIL) { - /* send return argument */ - n += sendDataOnly(file_des,CounterVals,dataBytes);//1280*2 - } else { - n += sendDataOnly(file_des,mess,sizeof(mess)); - } - - /*return ok/fail*/ - return ret; -} - - - - - -int reset_counter_block(int file_des) { - - int ret=OK; - int n; - int startACQ; - - sprintf(mess,"Reset counter block failed\n"); - - n = receiveDataOnly(file_des,&startACQ,sizeof(startACQ)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=resetCounterBlock(startACQ); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - - /*return ok/fail*/ - return ret; -} - - - - - - -int start_receiver(int file_des) { - int ret=OK; - int n=0; - strcpy(mess,"Could not start receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret = startReceiver(1); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - - -int stop_receiver(int file_des) { - int ret=OK; - int n=0; - - strcpy(mess,"Could not stop receiver\n"); - - /* execute action if the arguments correctly arrived*/ -#ifdef MCB_FUNCS - if (lockStatus==1 && differentClients==1){//necessary??? - sprintf(mess,"Detector locked by %s\n", lastClientIP); - ret=FAIL; - } - else - ret=startReceiver(0); - -#endif - - - if(ret==OK && differentClients){ - printf("Force update\n"); - ret=FORCE_UPDATE; - } - - /* send answer */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if(ret==FAIL) - n = sendDataOnly(file_des,mess,sizeof(mess)); - /*return ok/fail*/ - return ret; -} - - - - - -int calibrate_pedestal(int file_des){ - - int ret=OK; - int retval=-1; - int n; - int frames; - - sprintf(mess,"Could not calibrate pedestal\n"); - - n = receiveDataOnly(file_des,&frames,sizeof(frames)); - if (n < 0) { - sprintf(mess,"Error reading from socket\n"); - ret=FAIL; - } - - if (ret==OK) { - if (differentClients==1 && lockStatus==1) { - ret=FAIL; - sprintf(mess,"Detector locked by %s\n",lastClientIP); - } else - ret=calibratePedestal(frames); - } - - if(ret==OK){ - if (differentClients) - ret=FORCE_UPDATE; - } - - /* send answer */ - /* send OK/failed */ - n = sendDataOnly(file_des,&ret,sizeof(ret)); - if (ret==FAIL) - n += sendDataOnly(file_des,mess,sizeof(mess)); - else - n += sendDataOnly(file_des,&retval,sizeof(retval)); - - /*return ok/fail*/ - return ret; -} - - diff --git a/slsDetectorSoftware/moenchDetectorServer/server_funcs.h b/slsDetectorSoftware/moenchDetectorServer/server_funcs.h deleted file mode 100755 index 890c7452d..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/server_funcs.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef SERVER_FUNCS_H -#define SERVER_FUNCS_H - - -#include "sls_detector_defs.h" - - -#include -/* -#include -#include -#include -*/ -#include "communication_funcs.h" - - - - -#define GOODBYE -200 - -int sockfd; - -int function_table(); - -int decode_function(int); -int init_detector(int); - -int M_nofunc(int); -int exit_server(int); - - - - -// General purpose functions -int get_detector_type(int); -int set_number_of_modules(int); -int get_max_number_of_modules(int); - - -int exec_command(int); -int set_external_signal_flag(int); -int set_external_communication_mode(int); -int get_id(int); -int digital_test(int); -int write_register(int); -int read_register(int); -int set_dac(int); -int get_adc(int); -int set_channel(int); -int set_chip(int); -int set_module(int); -int get_channel(int); -int get_chip(int); -int get_module(int); - -int get_threshold_energy(int); -int set_threshold_energy(int); -int set_settings(int); -int start_acquisition(int); -int stop_acquisition(int); -int start_readout(int); -int get_run_status(int); -int read_frame(int); -int read_all(int); -int start_and_read_all(int); -int set_timer(int); -int get_time_left(int); -int set_dynamic_range(int); -int set_roi(int); -int get_roi(int); -int set_speed(int); -void prepareADC(void); -int set_readout_flags(int); -int execute_trimming(int); -int lock_server(int); -int set_port(int); -int get_last_client_ip(int); -int set_master(int); -int set_synchronization(int); - -int update_client(int); -int send_update(int); -int configure_mac(int); - -int load_image(int); -int read_counter_block(int); -int reset_counter_block(int); - -int start_receiver(int); -int stop_receiver(int); - - -int calibrate_pedestal(int); - -int set_roi(int); - -#endif diff --git a/slsDetectorSoftware/moenchDetectorServer/sharedmemory.c b/slsDetectorSoftware/moenchDetectorServer/sharedmemory.c deleted file mode 100755 index 4504cfe05..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/sharedmemory.c +++ /dev/null @@ -1,39 +0,0 @@ -#include "sharedmemory.h" - -struct statusdata *stdata; - -int inism(int clsv) { - -static int scansmid; - - if (clsv==SMSV) { - if ( (scansmid=shmget(SMKEY,1024,IPC_CREAT | 0666 ))==-1 ) { - return -1; - } - if ( (stdata=shmat(scansmid,NULL,0))==(void*)-1) { - return -2; - } - } - - if (clsv==SMCL) { - if ( (scansmid=shmget(SMKEY,0,0) )==-1 ) { - return -3; - } - if ( (stdata=shmat(scansmid,NULL,0))==(void*)-1) { - return -4; - } - } - return 1; -} - -void write_status_sm(char *status) { - strcpy(stdata->status,status); -} - -void write_stop_sm(int v) { - stdata->stop=v; -} - -void write_runnumber_sm(int v) { - stdata->runnumber=v; -} diff --git a/slsDetectorSoftware/moenchDetectorServer/sharedmemory.h b/slsDetectorSoftware/moenchDetectorServer/sharedmemory.h deleted file mode 100755 index bdbddf719..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/sharedmemory.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef SM -#define SM - -#include "sls_detector_defs.h" - -#include -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -#include - -#include -#include - -/* key for shared memory */ -#define SMKEY 10001 - -#define SMSV 1 -#define SMCL 2 - - -struct statusdata { - int runnumber; - int stop; - char status[20]; -} ; - - -/* for shared memory */ - -int inism(int clsv); -void write_status_sm(char *status); -void write_stop_sm(int v); -void write_runnumber_sm(int v); - -#endif diff --git a/slsDetectorSoftware/moenchDetectorServer/sls_detector_defs.h b/slsDetectorSoftware/moenchDetectorServer/sls_detector_defs.h deleted file mode 120000 index c5062e03f..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/sls_detector_defs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/sls_detector_funcs.h b/slsDetectorSoftware/moenchDetectorServer/sls_detector_funcs.h deleted file mode 120000 index 844b67129..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/sls_detector_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/sls_receiver_defs.h b/slsDetectorSoftware/moenchDetectorServer/sls_receiver_defs.h deleted file mode 120000 index 1de31caf5..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/sls_receiver_defs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/sls_receiver_funcs.h b/slsDetectorSoftware/moenchDetectorServer/sls_receiver_funcs.h deleted file mode 120000 index c2ea4ded9..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/sls_receiver_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/moenchDetectorServer/stop_server.c b/slsDetectorSoftware/moenchDetectorServer/stop_server.c deleted file mode 100755 index e3c8ff7e1..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/stop_server.c +++ /dev/null @@ -1,46 +0,0 @@ -/* A simple server in the internet domain using TCP - The port number is passed as an argument */ - - -#include "sls_detector_defs.h" - - -#include "communication_funcs.h" -#include "firmware_funcs.h" - - -int sockfd; - -int main(int argc, char *argv[]) -{ - int portno; - int retval=0; - - portno = DEFAULT_PORTNO; - - - bindSocket(portno); - if (getServerError()) - return -1; - - - - /* waits for connection */ - while(retval!=GOODBYE) { -#ifdef VERBOSE - printf("\n"); -#endif -#ifdef VERY_VERBOSE - printf("Stop server: waiting for client call\n"); -#endif - acceptConnection(); - retval=stopStateMachine(); - closeConnection(); - } - - exitServer(); - printf("Goodbye!\n"); - - return 0; -} - diff --git a/slsDetectorSoftware/moenchDetectorServer/trimming_funcs.c b/slsDetectorSoftware/moenchDetectorServer/trimming_funcs.c deleted file mode 100755 index 9a28b9b4a..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/trimming_funcs.c +++ /dev/null @@ -1,749 +0,0 @@ -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "trimming_funcs.h" -#include "mcb_funcs.h" -#include "firmware_funcs.h" -#include - - - -extern int nModX; -//extern int *values; - -extern const int nChans; -extern const int nChips; -extern const int nDacs; -extern const int nAdcs; - - -int trim_fixed_settings(int countlim, int par2, int im) -{ - - int retval=OK; -#ifdef VERBOSE - printf("Trimming with fixed settings\n"); -#endif -#ifdef VIRTUAL - return OK; -#endif - - if (par2<=0) - retval=trim_with_level(countlim, im); - else - retval=trim_with_median(countlim,im); - - - return retval; -} - - -int trim_with_noise(int countlim, int nsigma, int im) -{ - - - int retval=OK, retval1=OK, retval2=OK; -#ifdef VERBOSE - printf("Trimming using noise\n"); -#endif -#ifdef VIRTUAL - return OK; -#endif - - /* threshold scan */ - -#ifdef VERBOSE - printf("chosing vthresh and vtrim....."); -#endif - retval1=choose_vthresh_and_vtrim(countlim,nsigma, im); - -#ifdef VERBOSE - printf("trimming with noise.....\n"); -#endif - retval2=trim_with_level(countlim, im); - -#ifdef DEBUGOUT - printf("done\n"); -#endif - if (retval1==OK && retval2==OK) - retval=OK; - else - retval=FAIL; - - return retval; - -} - -int trim_with_beam(int countlim, int nsigma, int im) //rpc -{ - - - int retval=OK, retval1=OK, retval2=OK; - - printf("Trimming using beam\n"); - //return OK; -#ifdef VIRTUAL - printf("Trimming using beam\n"); - return OK; -#endif - /* threshold scan */ -#ifdef DEBUGOUT - printf("chosing vthresh and vtrim....."); -#endif - - retval1=choose_vthresh_and_vtrim(countlim,nsigma,im); - retval2=trim_with_median(TRIM_DR, im); - -#ifdef DEBUGOUT - printf("done\n"); -#endif - - if (retval1==OK && retval2==OK) - retval=OK; - else - retval=FAIL; - - return retval; - -} - - -int trim_improve(int maxit, int par2, int im) //rpc -{ - - int retval=OK, retval1=OK, retval2=OK; - - -#ifdef VERBOSE - printf("Improve the trimming\n"); -#endif -#ifdef VIRTUAL - return OK; -#endif - - - if (par2!=0 && im==ALLMOD) - retval1=choose_vthresh(); - - retval2=trim_with_median(2*maxit+1, im); -#ifdef DEBUGOUT - printf("done\n"); -#endif - if (retval1==OK && retval2==OK) - retval=OK; - else - retval=FAIL; - - return retval; - -} - -int calcthr_from_vcal(int vcal) { - int thrmin; - //thrmin=140+3*vcal/5; - thrmin=180+3*vcal/5; - return thrmin; -} - -int calccal_from_vthr(int vthr) { - int vcal; - vcal=5*(vthr-140)/3; - return vcal; -} - -int choose_vthresh_and_vtrim(int countlim, int nsigma, int im) { - int retval=OK; -#ifdef MCB_FUNCS - int modma, modmi, nm; - int thr, thrstep=5, nthr=31; - - int *fifodata; - - double vthreshmean, vthreshSTDev; - int *thrmi, *thrma; - double c; - double b=BVTRIM; - double a=AVTRIM; - int *trim; - int ich, imod, ichan; - int nvalid=0; - u_int32_t *scan; - int ithr; - sls_detector_channel myChan; - - - - setFrames(1); - // setNMod(getNModBoard()); - - if (im==ALLMOD){ - modmi=0; - modma=nModX; - } else { - modmi=im; - modma=im+1; - } - nm=modma-modmi; - - trim=malloc(sizeof(int)*nChans*nChips*nModX); - thrmi=malloc(sizeof(int)*nModX); - thrma=malloc(sizeof(int)*nModX); - - - for (ich=0; ichcountlim && trim[ich]==-1) { -//commented out by dhanya trim[ich]=getDACbyIndexDACU(VTHRESH,imod); -#ifdef VERBOSE - // printf("yes: %d %d %d\n",ich,ithr,scan[ich]); -#endif - } -#ifdef VERBOSE - /* else { - printf("no: %d %d %d\n",ich,ithr,scan[ich]); - }*/ -#endif - } - } - free(scan); - } - - for (imod=modmi; imodthrmi[imod] && trim[ich]0) { - vthreshmean=vthreshmean/nvalid; - //commented out by dhanya vthreshSTDev=sqrt((vthreshSTDev/nvalid)-vthreshmean*vthreshmean); - } else { - vthreshmean=thrmi[imod]; - vthreshSTDev=nthr*thrstep; - printf("No valid channel for module %d\n",imod); - retval=FAIL; - } - -#ifdef DEBUGOUT - printf("module= %d nvalid = %d mean=%f RMS=%f\n",imod, nvalid, vthreshmean,vthreshSTDev); -#endif - // *vthresh=round(vthreshmean-nsigma*vthreshSTDev); - thr=(int)(vthreshmean-nsigma*vthreshSTDev); - if (thr<0 || thr>(DAC_DR-1)) { - thr=thrmi[imod]/2; - printf("Can't find correct threshold for module %d\n",imod); - retval=FAIL; - } -//commented out by dhanya initDACbyIndexDACU(VTHRESH,thr,imod); -#ifdef VERBOSE - printf("vthresh=%d \n",thr); -#endif - c=CVTRIM-2.*nsigma*vthreshSTDev/63.; - //commented out by dhanya thr=(int)((-b-sqrt(b*b-4*a*c))/(2*a)); - if (thr<500 || thr>(DAC_DR-1)) { - thr=750; - printf("Can't find correct trimbit size for module %d\n",imod); - retval=FAIL; - } - - //commented out by dhanya initDACbyIndexDACU(VTRIM,thr,imod); - -#ifdef VERBOSE - printf("vtrim=%d \n",thr); -#endif - - } - free(trim); - free(thrmi); - free(thrma); - -#endif - return retval; -} - - - - - -int trim_with_level(int countlim, int im) { - int ich, itrim, ichan, ichip, imod; - u_int32_t *scan; - int *inttrim; - int modma, modmi, nm; - int retval=OK; - int *fifodata; - sls_detector_channel myChan; - printf("trimming module number %d", im); - - -#ifdef MCB_FUNCS - setFrames(1); - // setNMod(getNModBoard()); - - if (im==ALLMOD){ - modmi=0; - modma=nModX; - } else { - modmi=im; - modma=im+1; - } - nm=modma-modmi; - - inttrim=malloc(sizeof(int)*nChips*nChans*nModX); - printf("countlim=%d\n",countlim); - for (ich=0; ichcountlim){ - inttrim[ich]=itrim; - if (scan[ich]>2*countlim && itrim>0) { - //if (scan[ich]>2*countlim || itrim==0) { - inttrim[ich]=itrim-1; - } -#ifdef VERBOSE - printf("Channel %d trimbit %d counted %d (%08x) countlim %d\n",ich,itrim,scan[ich],fifodata[ich],countlim); -#endif - } - } -#ifdef VERBOSE - /* else - printf("Channel %d trimbit %d counted %d countlim %d\n",ich,itrim,scan[ich],countlim);*/ -#endif - } - } - free(scan); - } - - for (imod=modmi; imod0) - direction[ichan]=1; - else - direction[ichan]=-1; - } - //commented out by dhanya vthresh=getDACbyIndexDACU(VTHRESH,imod); - if ( direction[ichan]!=-3) { - if (abs(diff)>abs(olddiff[ichan])) { - vthresh=vthresh-direction[ichan]; - if (vthresh>(DAC_DR-1)) { - vthresh=(DAC_DR-1); - printf("can't equalize threshold for module %d\n", ichan); - retval=FAIL; - } - if (vthresh<0) { - vthresh=0; - printf("can't equalize threshold for module %d\n", ichan); - retval=FAIL; - } - direction[ichan]=-3; - } else { - vthresh=vthresh+direction[ichan]; - olddiff[ichan]=diff; - change_flag=1; - } -//commented out by dhanya initDACbyIndex(VTHRESH,vthresh, ichan); - } - } - iteration++; - free(scan); - free(scan1); - } -#endif - return retval; -} - - - - - -int trim_with_median(int stop, int im) { - - - int retval=OK; - -#ifdef MCB_FUNCS - int ichan, imod, ichip, ich; - u_int32_t *scan, *scan1; - int *olddiff, *direction; - int med, diff; - int change_flag=1; - int iteration=0; - int me[nModX], me1[nModX]; - int modma, modmi, nm; - int trim; - int *fifodata; - - setFrames(1); - // setNMod(getNModBoard()); - - if (im==ALLMOD){ - modmi=0; - modma=nModX; - } else { - modmi=im; - modma=im+1; - } - nm=modma-modmi; - - olddiff=malloc(4*nModX*nChips*nChans); - direction=malloc(4*nModX*nChips*nChans); - for (imod=modmi; imod0) { - direction[ichan]=1; - } else { - direction[ichan]=-1; - } - } - if ( direction[ichan]!=-3) { - if (abs(diff)>abs(olddiff[ichan])) { - trim=getTrimbit(imod,ichip,ich)+direction[ichan]; - printf("%d old diff %d < new diff %d %d - trimbit %d\n",ichan, olddiff[ichan], diff, direction[ichan], trim); - direction[ichan]=-3; - } else { - trim=getTrimbit(imod,ichip,ich)-direction[ichan]; - olddiff[ichan]=diff; - change_flag=1; - } - if (trim>TRIM_DR) { - trim=63; - printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim); - retval=FAIL; - } - if (trim<0) { - printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim); - trim=0; - retval=FAIL; - } - initChannel(trim,0,0,1,0,0,imod); - } - } - } - } - iteration++; - free(scan); - free(scan1); - } - free(olddiff); - free(direction); -#endif - return retval; -} diff --git a/slsDetectorSoftware/moenchDetectorServer/trimming_funcs.h b/slsDetectorSoftware/moenchDetectorServer/trimming_funcs.h deleted file mode 100755 index 42ecea24a..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/trimming_funcs.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef TRIMMING_FUNCS_H -#define TRIMMING_FUNCS_H - -#include "sls_detector_defs.h" - -int trim_fixed_settings(int countlim, int par2, int imod); -int trim_with_noise(int countlim, int nsigma, int imod); -int trim_with_beam(int countlim, int nsigma, int imod); -int trim_improve(int maxit, int par2, int imod); -int calcthr_from_vcal(int vcal); -int calccal_from_vthr(int vthr); -int choose_vthresh_and_vtrim(int countlim, int nsigma, int imod); - -int choose_vthresh(); -int trim_with_level(int countlim, int imod); -int trim_with_median(int stop, int imod); -int calcthr_from_vcal(int vcal); -int calccal_from_vthr(int vthr); - -#endif diff --git a/slsDetectorSoftware/moenchDetectorServer/updateGitVersion.sh b/slsDetectorSoftware/moenchDetectorServer/updateGitVersion.sh deleted file mode 100755 index cea04b2de..000000000 --- a/slsDetectorSoftware/moenchDetectorServer/updateGitVersion.sh +++ /dev/null @@ -1,31 +0,0 @@ -SERVER=moenchDetectorServer -MAINDIR=slsDetectorsPackage -SPECDIR=slsDetectorSoftware/$SERVER -TMPFILE=gitInfoMoenchTmp.h -INCLFILE=gitInfoMoench.h - - -#evaluate the variables -EVALFILE=../../evalVersionVariables.sh -source $EVALFILE - - -#get modified date -#RDATE1='git log --pretty=format:"%ci" -1' -RDATE1="find . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|.git|updateGitVersion|.o' | head -n 1" -RDATE=`eval $RDATE1` -NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') -NEWDATE=${NEWDATE/#/0x} - - -#get old date from INCLFILE -OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') - - -#update INCLFILE if changes -if [ "$OLDDATE" != "$NEWDATE" ]; then - echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt - cd ../../ - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -fi \ No newline at end of file diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp deleted file mode 100644 index 172eb8c4e..000000000 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ /dev/null @@ -1,5428 +0,0 @@ -/******************************************************************* - -Date: $Date$ -Revision: $Rev$ -Author: $Author$ -URL: $URL$ -ID: $Id$ - - ********************************************************************/ - -#include "multiSlsDetector.h" -#include "SharedMemory.h" -#include "slsDetector.h" -#include "sls_receiver_exceptions.h" -#include "ThreadPool.h" -#include "ZmqSocket.h" -#include "multiSlsDetectorClient.h" -#include "multiSlsDetectorCommand.h" -#include "postProcessingFuncs.h" -#include "usersFunctions.h" - -#include -#include -#include -#include -#include //json header in zmq stream -#include -#include - - - -multiSlsDetector::multiSlsDetector(int id, bool verify, bool update) -: slsDetectorUtils(), - detId(id), - sharedMemory(0), - thisMultiDetector(0), - client_downstream(false), - threadpool(0) { - setupMultiDetector(verify, update); -} - - - -multiSlsDetector::~multiSlsDetector() { - // delete zmq sockets first - for (std::vector::const_iterator it = zmqSocket.begin(); it != zmqSocket.end(); ++it) { - delete(*it); - } - zmqSocket.clear(); - - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - delete(*it); - } - detectors.clear(); - - if (sharedMemory) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); - delete sharedMemory; - } - - destroyThreadPool(); -} - - -bool multiSlsDetector::isMultiSlsDetectorClass() { - return true; -} - -void multiSlsDetector::setupMultiDetector(bool verify, bool update) { - if (initSharedMemory(verify)) - // shared memory just created, so initialize the structure - initializeDetectorStructure(); - initializeMembers(verify); - if (update) - updateUserdetails(); -} - -std::string multiSlsDetector::concatResultOrPos(std::string (slsDetector::*somefunc)(int), int pos) { - if (pos >= 0 && pos < (int)detectors.size()) { - return (detectors[pos]->*somefunc)(pos); - } else { - std::string s; - for (unsigned int i = 0; i < detectors.size(); ++i) { - s += (detectors[i]->*somefunc)(pos) + "+"; - } - return s; - } -} - -template -T multiSlsDetector::callDetectorMember(T (slsDetector::*somefunc)()) -{ - //(Erik) to handle enums, probably a bad idea but follow previous code - T defaultValue = static_cast(-1); - std::vector values(detectors.size(), defaultValue); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - values[idet] = (detectors[idet]->*somefunc)(); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return minusOneIfDifferent(values); -} - -std::string multiSlsDetector::callDetectorMember(std::string (slsDetector::*somefunc)()) { - std::string concatenatedValue, firstValue; - bool valueNotSame = false; - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - std::string thisValue = (detectors[idet]->*somefunc)(); - ; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - if (firstValue.empty()) { - concatenatedValue = thisValue; - firstValue = thisValue; - } else { - concatenatedValue += "+" + thisValue; - } - if (firstValue != thisValue) - valueNotSame = true; - } - if (valueNotSame) - return concatenatedValue; - else - return firstValue; -} - -template -T multiSlsDetector::callDetectorMember(T (slsDetector::*somefunc)(V), V value) { - //(Erik) to handle enums, probably a bad idea but follow previous code - T defaultValue = static_cast(-1); - std::vector values(detectors.size(), defaultValue); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - values[idet] = (detectors[idet]->*somefunc)(value); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return minusOneIfDifferent(values); -} - -template -T multiSlsDetector::callDetectorMember(T (slsDetector::*somefunc)(P1, P2), - P1 par1, P2 par2) { - //(Erik) to handle enums, probably a bad idea but follow previous code - T defaultValue = static_cast(-1); - std::vector values(detectors.size(), defaultValue); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - values[idet] = (detectors[idet]->*somefunc)(par1, par2); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return minusOneIfDifferent(values); -} - -template -T multiSlsDetector::parallelCallDetectorMember(T (slsDetector::*somefunc)()) { - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - std::vector return_values(detectors.size(), -1); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - Task* task = new Task(new func0_t(somefunc, - detectors[idet], &return_values[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); - } -} - -template -T multiSlsDetector::parallelCallDetectorMember(T (slsDetector::*somefunc)(P1), - P1 value) { - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - std::vector return_values(detectors.size(), -1); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - Task* task = new Task(new func1_t(somefunc, - detectors[idet], value, &return_values[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); - } -} - -template -T multiSlsDetector::parallelCallDetectorMember(T (slsDetector::*somefunc)(P1, P2), - P1 par1, P2 par2) { - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - std::vector return_values(detectors.size(), -1); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - Task* task = new Task(new func2_t(somefunc, - detectors[idet], par1, par2, &return_values[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); - } -} - -int multiSlsDetector::parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), - int v0, int v1, int v2) { - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - std::vector return_values(detectors.size(), -1); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - Task* task = new Task(new func3_t(somefunc, - detectors[idet], v0, v1, v2, &return_values[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - return minusOneIfDifferent(return_values); - } -} - -template -T multiSlsDetector::minusOneIfDifferent(const std::vector& return_values) { - T ret = static_cast(-100); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (ret == static_cast(-100)) - ret = return_values[idet]; - else if (ret != return_values[idet]) - ret = static_cast(-1); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return ret; -} - - -int multiSlsDetector::decodeNMod(int i, int& id, int& im) { -#ifdef VERBOSE - cout << " Module " << i << " belongs to detector " << id << endl; - ; - cout << getMaxMods(); -#endif - - if (i < 0 || i >= getMaxMods()) { - id = -1; - im = -1; -#ifdef VERBOSE - cout << " A---------" << id << " position " << im << endl; -#endif - - return -1; - } - int nm; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - nm = detectors[idet]->getNMods(); - if (nm > i) { - id = idet; - im = i; -#ifdef VERBOSE - cout << " B---------" << id << " position " << im << endl; -#endif - return im; - } else { - i -= nm; - } - } - id = -1; - im = -1; -#ifdef VERBOSE - cout << " C---------" << id << " position " << im << endl; -#endif - return -1; -} - - -int multiSlsDetector::decodeNChannel(int offsetX, int offsetY, int& channelX, int& channelY) { - channelX = -1; - channelY = -1; - //loop over - for (unsigned int i = 0; i < detectors.size(); ++i) { - int x = detectors[i]->getDetectorOffset(X); - int y = detectors[i]->getDetectorOffset(Y); - //check x offset range - if ((offsetX >= x) && - (offsetX < (x + detectors[i]->getMaxNumberOfChannelsInclGapPixels(X)))) { - if (offsetY == -1) { - channelX = offsetX - x; - return i; - } else { - //check y offset range - if ((offsetY >= y) && - (offsetY < (y + detectors[i]->getMaxNumberOfChannelsInclGapPixels(Y)))) { - channelX = offsetX - x; - channelY = offsetY - y; - return i; - } - } - } - } - return -1; -} - - -double* multiSlsDetector::decodeData(int* datain, int& nn, double* fdata) { - double* dataout; - - if (fdata) - dataout = fdata; - else { - if (detectors[0]->getDetectorsType() == JUNGFRAUCTB) { - nn = thisMultiDetector->dataBytes / 2; - dataout = new double[nn]; - } else { - nn = thisMultiDetector->numberOfChannels; - dataout = new double[nn]; - } - } - - int n; - double* detp = dataout; - int* datap = datain; - - for (unsigned int i = 0; i < detectors.size(); ++i) { - detectors[i]->decodeData(datap, n, detp); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); -#ifdef VERBOSE - cout << "increment pointers " << endl; -#endif - datap += detectors[i]->getDataBytes() / sizeof(int); - detp += n; -#ifdef VERBOSE - cout << "done " << endl; -#endif - } - - return dataout; -} - - - -int multiSlsDetector::writeDataFile(std::string fname, double* data, double* err, - double* ang, char dataformat, int nch) { -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to write formatted data file " - << getTotalNumberOfChannels() << endl; -#endif - - std::ofstream outfile; - int choff = 0, off = 0; //idata, - double *pe = err, *pa = ang; - int nch_left = nch, n; //, nd; - - if (nch_left <= 0) - nch_left = getTotalNumberOfChannels(); - - if (data == NULL) - return FAIL; - - outfile.open(fname.c_str(), std::ios_base::out); - if (outfile.is_open()) { - - for (unsigned int i = 0; i < detectors.size(); ++i) { - n = detectors[i]->getTotalNumberOfChannels(); - if (nch_left < n) - n = nch_left; -#ifdef VERBOSE - cout << " write " << i << " position " << off << " offset " << choff << endl; -#endif - fileIOStatic::writeDataFile(outfile, n, data + off, pe, pa, dataformat, choff); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - - nch_left -= n; - - choff += detectors[i]->getMaxNumberOfChannels(); - - off += n; - - if (pe) - pe = err + off; - - if (pa) - pa = ang + off; - } - outfile.close(); - return OK; - } else { - std::cout << "Could not open file " << fname << "for writing" << std::endl; - return FAIL; - } -} - -int multiSlsDetector::writeDataFile(std::string fname, int* data) { - std::ofstream outfile; - int choff = 0, off = 0; -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to write raw data file " << endl; -#endif - - if (data == NULL) - return FAIL; - - outfile.open(fname.c_str(), std::ios_base::out); - if (outfile.is_open()) { - for (unsigned int i = 0; i < detectors.size(); ++i) { -#ifdef VERBOSE - cout << " write " << i << " position " << off << " offset " << choff << endl; -#endif - detectors[i]->writeDataFile(outfile, - detectors[i]->getTotalNumberOfChannels(), data + off, choff); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - choff += detectors[i]->getMaxNumberOfChannels(); - off += detectors[i]->getTotalNumberOfChannels(); - } - outfile.close(); - return OK; - } else { - std::cout << "Could not open file " << fname << "for writing" << std::endl; - return FAIL; - } -} - -int multiSlsDetector::readDataFile(std::string fname, double* data, double* err, - double* ang, char dataformat) { -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to read formatted data file " << endl; -#endif - - std::ifstream infile; - int iline = 0; - std::string str; - int choff = 0, off = 0; - double *pe = err, *pa = ang; - -#ifdef VERBOSE - std::cout << "Opening file " << fname << std::endl; -#endif - infile.open(fname.c_str(), std::ios_base::in); - if (infile.is_open()) { - - for (unsigned int i = 0; i < detectors.size(); ++i) { - iline += detectors[i]->readDataFile(detectors[i]->getTotalNumberOfChannels(), - infile, data + off, pe, pa, dataformat, choff); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - choff += detectors[i]->getMaxNumberOfChannels(); - off += detectors[i]->getTotalNumberOfChannels(); - if (pe) - pe = pe + off; - if (pa) - pa = pa + off; - } - - infile.close(); - } else { - std::cout << "Could not read file " << fname << std::endl; - return -1; - } - return iline; -} - -int multiSlsDetector::readDataFile(std::string fname, int* data) { -#ifdef VERBOSE - cout << "using overloaded multiSlsDetector function to read raw data file " << endl; -#endif - std::ifstream infile; - int iline = 0; - std::string str; - int choff = 0, off = 0; - -#ifdef VERBOSE - std::cout << "Opening file " << fname << std::endl; -#endif - infile.open(fname.c_str(), std::ios_base::in); - if (infile.is_open()) { - - for (unsigned int i = 0; i < detectors.size(); ++i) { - iline += detectors[i]->readDataFile(infile, data + off, - detectors[i]->getTotalNumberOfChannels(), choff); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - choff += detectors[i]->getMaxNumberOfChannels(); - off += detectors[i]->getTotalNumberOfChannels(); - } - infile.close(); - } else { - std::cout << "Could not read file " << fname << std::endl; - return -1; - } - return iline; -} - - -std::string multiSlsDetector::getErrorMessage(int& critical) { - int64_t multiMask, slsMask = 0; - std::string retval = ""; - char sNumber[100]; - critical = 0; - - multiMask = getErrorMask(); - if (multiMask) { - if (multiMask & MULTI_DETECTORS_NOT_ADDED) { - retval.append("Detectors not added:\n" + std::string(getNotAddedList()) + - std::string("\n")); - critical = 1; - } - if (multiMask & MULTI_HAVE_DIFFERENT_VALUES) { - retval.append("A previous multi detector command gave different values\n" - "Please check the console\n"); - critical = 0; - } - if (multiMask & MULTI_CONFIG_FILE_ERROR) { - retval.append("Could not load Config File\n"); - critical = 0; - } - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - //if the detector has error - if (multiMask & (1 << idet)) { - //append detector id - sprintf(sNumber, "%d", idet); - retval.append("Detector " + std::string(sNumber) + std::string(":\n")); - //get sls det error mask - slsMask = detectors[idet]->getErrorMask(); -#ifdef VERYVERBOSE - //append sls det error mask - sprintf(sNumber, "0x%lx", slsMask); - retval.append("Error Mask " + std::string(sNumber) + std::string("\n")); -#endif - //get the error critical level - if ((slsMask > 0xFFFFFFFF) | critical) - critical = 1; - //append error message - retval.append(errorDefs::getErrorMessage(slsMask)); - } - } - } - return retval; -} - -int64_t multiSlsDetector::clearAllErrorMask() { - clearErrorMask(); - clearNotAddedList(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) - detectors[idet]->clearErrorMask(); - - return getErrorMask(); -} - -void multiSlsDetector::setErrorMaskFromAllDetectors() { - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } -} - -void multiSlsDetector::setAcquiringFlag(bool b) { - thisMultiDetector->acquiringFlag = b; -} - -bool multiSlsDetector::getAcquiringFlag() { - return thisMultiDetector->acquiringFlag; -} - -bool multiSlsDetector::isAcquireReady() { - if (thisMultiDetector->acquiringFlag) { - std::cout << "Acquire has already started. " - "If previous acquisition terminated unexpectedly, " - "reset busy flag to restart.(sls_detector_put busy 0)" << std::endl; - return FAIL; - } - thisMultiDetector->acquiringFlag = true; - return OK; -} - -int multiSlsDetector::checkVersionCompatibility(portType t) { - return parallelCallDetectorMember(&slsDetector::checkVersionCompatibility, t); -} - -int64_t multiSlsDetector::getId(idMode mode, int imod) { - int id, im; - int64_t ret; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->getId(mode, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - - return callDetectorMember(&slsDetector::getId, mode, imod); -} - - -slsDetector* multiSlsDetector::getSlsDetector(unsigned int pos) { - if (pos < detectors.size()) { - return detectors[pos]; - } - return 0; -} - -slsDetector *multiSlsDetector::operator()(int pos) const { - if (pos >= 0 && pos < (int)detectors.size()) - return detectors[pos]; - return NULL; -} - - -void multiSlsDetector::freeSharedMemory(int multiId) { - // get number of detectors - int numDetectors = 0; - SharedMemory* shm = new SharedMemory(multiId, -1); - - // get number of detectors from multi shm - if (shm->IsExisting()) { - sharedMultiSlsDetector* mdet = (sharedMultiSlsDetector*)shm->OpenSharedMemory( - sizeof(sharedMultiSlsDetector)); - numDetectors = mdet->numberOfDetectors; - shm->UnmapSharedMemory(mdet); - shm->RemoveSharedMemory(); - } - delete shm; - - for (int i = 0; i < numDetectors; ++i) { - SharedMemory* shm = new SharedMemory(multiId, i); - shm->RemoveSharedMemory(); - delete shm; - } -} - - - -void multiSlsDetector::freeSharedMemory() { - // clear zmq vector - for (std::vector::const_iterator it = zmqSocket.begin(); it != zmqSocket.end(); ++it) { - delete(*it); - } - zmqSocket.clear(); - - // should be done before the detector list is deleted - clearAllErrorMask(); - - // clear sls detector vector shm - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - (*it)->freeSharedMemory(); - delete (*it); - } - detectors.clear(); - - // clear multi detector shm - if (sharedMemory) { - if (thisMultiDetector) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); - thisMultiDetector = 0; - } - sharedMemory->RemoveSharedMemory(); - delete sharedMemory; - sharedMemory = 0; - } - - // zmq - destroyThreadPool(); - client_downstream = false; -} - - -std::string multiSlsDetector::getUserDetails() { - std::ostringstream sstream; - - if (!detectors.size()) { - return std::string("none"); - } - - //hostname - sstream << "\nHostname: " << getHostname(); - //type - sstream<< "\nType: "; - - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) - sstream<< (*it)->sgetDetectorsType() << "+"; - //PID - sstream << "\nPID: " << thisMultiDetector->lastPID - //user - << "\nUser: " << thisMultiDetector->lastUser - << "\nDate: " << thisMultiDetector->lastDate << endl; - - std::string s = sstream.str(); - return s; -} - -/* - * pre: sharedMemory=0, thisMultiDetector = 0, detectors.size() = 0 - * exceptions are caught in calling function, shm unmapped and deleted - */ -bool multiSlsDetector::initSharedMemory(bool verify) { - - size_t sz = sizeof(sharedMultiSlsDetector); - bool created = false; - - try { - // shared memory object with name - sharedMemory = new SharedMemory(detId, -1); - - //create - if (!sharedMemory->IsExisting()) { - thisMultiDetector = (sharedMultiSlsDetector*)sharedMemory->CreateSharedMemory(sz); - created = true; - } - // open and verify version - else { - thisMultiDetector = (sharedMultiSlsDetector*)sharedMemory->OpenSharedMemory(sz); - if (verify && thisMultiDetector->shmversion != MULTI_SHMVERSION) { - cprintf(RED, "Multi shared memory (%d) version mismatch " - "(expected 0x%x but got 0x%x)\n", detId, - MULTI_SHMVERSION, thisMultiDetector->shmversion); - throw SharedMemoryException(); - } - } - } catch (...) { - if (sharedMemory) { - // unmap - if (thisMultiDetector) { - sharedMemory->UnmapSharedMemory(thisMultiDetector); - thisMultiDetector = 0; - } - // delete - delete sharedMemory; - sharedMemory = 0; - } - throw; - } - - return created; -} - - -void multiSlsDetector::initializeDetectorStructure() { - thisMultiDetector->shmversion = MULTI_SHMVERSION; - thisMultiDetector->numberOfDetectors = 0; - thisMultiDetector->numberOfDetector[X] = 0; - thisMultiDetector->numberOfDetector[Y] = 0; - thisMultiDetector->onlineFlag = 1; - thisMultiDetector->stoppedFlag = 0; - thisMultiDetector->masterPosition = -1; - thisMultiDetector->syncMode = GET_SYNCHRONIZATION_MODE; - thisMultiDetector->dataBytes = 0; - thisMultiDetector->dataBytesInclGapPixels = 0; - thisMultiDetector->numberOfChannels = 0; - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->numberOfChannel[Y] = 0; - thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; - thisMultiDetector->maxNumberOfChannels = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[Y] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; - thisMultiDetector->maxNumberOfChannelsPerDetector[X] = 0; - thisMultiDetector->maxNumberOfChannelsPerDetector[Y] = 0; - for (int i = 0; i < MAX_TIMERS; ++i) { - thisMultiDetector->timerValue[i] = 0; - } - thisMultiDetector->currentSettings = GET_SETTINGS; - thisMultiDetector->currentThresholdEV = -1; - thisMultiDetector->progressIndex = 0; - thisMultiDetector->totalProgress = 1; - thisMultiDetector->fileIndex = 0; - strcpy(thisMultiDetector->fileName, "run"); - strcpy(thisMultiDetector->filePath, "/"); - thisMultiDetector->framesPerFile = 1; - thisMultiDetector->fileFormatType = ASCII; - thisMultiDetector->correctionMask = (1 << WRITE_FILE) | (1 << OVERWRITE_FILE); - thisMultiDetector->threadedProcessing = 1; - thisMultiDetector->tDead = 0; - strncpy(thisMultiDetector->flatFieldDir, getenv("HOME"), MAX_STR_LENGTH-1); - thisMultiDetector->flatFieldDir[MAX_STR_LENGTH-1] = 0; - strcpy(thisMultiDetector->flatFieldFile, "none"); - strcpy(thisMultiDetector->badChanFile, "none"); - strcpy(thisMultiDetector->angConvFile, "none"); - thisMultiDetector->angDirection = 1; - thisMultiDetector->fineOffset = 0; - thisMultiDetector->globalOffset = 0; - thisMultiDetector->binSize = 0.001; - for (int i = 0; i < 2; ++i) { - thisMultiDetector->sampleDisplacement[i] = 0.0; - } - thisMultiDetector->numberOfPositions = 0; - for (int i = 0; i < MAXPOS; ++i) { - thisMultiDetector->detPositions[i] = 0.0; - } - thisMultiDetector->actionMask = 0; - for (int i = 0; i < MAX_ACTIONS; ++i) { - strcpy(thisMultiDetector->actionScript[i], "none"); - strcpy(thisMultiDetector->actionParameter[i], "none"); - } - for (int i = 0; i < MAX_SCAN_LEVELS; ++i) { - thisMultiDetector->scanMode[i] = 0; - strcpy(thisMultiDetector->scanScript[i], "none"); - strcpy(thisMultiDetector-> scanParameter[i], "none"); - thisMultiDetector->nScanSteps[i] = 0; - { - double initValue = 0; - std::fill_n(thisMultiDetector->scanSteps[i], MAX_SCAN_STEPS, initValue); - } - thisMultiDetector->scanPrecision[i] = 0; - - } - thisMultiDetector->acquiringFlag = false; - thisMultiDetector->externalgui = false; - thisMultiDetector->receiverOnlineFlag = OFFLINE_FLAG; - thisMultiDetector->receiver_upstream = false; -} - -void multiSlsDetector::initializeMembers(bool verify) { - //slsDetectorUtils - stoppedFlag = &thisMultiDetector->stoppedFlag; - timerValue = thisMultiDetector->timerValue; - currentSettings = &thisMultiDetector->currentSettings; - currentThresholdEV = &thisMultiDetector->currentThresholdEV; - - //fileIO.h - filePath = thisMultiDetector->filePath; - fileName = thisMultiDetector->fileName; - fileIndex = &thisMultiDetector->fileIndex; - framesPerFile = &thisMultiDetector->framesPerFile; - fileFormatType = &thisMultiDetector->fileFormatType; - - //postprocessing - threadedProcessing = &thisMultiDetector->threadedProcessing; - correctionMask = &thisMultiDetector->correctionMask; - flatFieldDir = thisMultiDetector->flatFieldDir; - flatFieldFile = thisMultiDetector->flatFieldFile; - expTime = &timerValue[ACQUISITION_TIME]; - badChannelMask = NULL; - fdata = NULL; - thisData = NULL; - - //slsDetectorActions - actionMask = &thisMultiDetector->actionMask; - actionScript = thisMultiDetector->actionScript; - actionParameter = thisMultiDetector->actionParameter; - nScanSteps = thisMultiDetector->nScanSteps; - scanSteps = thisMultiDetector->scanSteps; - scanMode = thisMultiDetector->scanMode; - scanPrecision = thisMultiDetector->scanPrecision; - scanScript = thisMultiDetector->scanScript; - scanParameter = thisMultiDetector->scanParameter; - - //angularConversion.h - numberOfPositions = &thisMultiDetector->numberOfPositions; - detPositions = thisMultiDetector->detPositions; - angConvFile = thisMultiDetector->angConvFile; - binSize = &thisMultiDetector->binSize; - fineOffset = &thisMultiDetector->fineOffset; - globalOffset = &thisMultiDetector->globalOffset; - angDirection = &thisMultiDetector->angDirection; - moveFlag = NULL; - sampleDisplacement = thisMultiDetector->sampleDisplacement; - - //badChannelCorrections.h or postProcessing_Standalone.h - badChanFile = thisMultiDetector->badChanFile; - nBadChans = NULL; - badChansList = NULL; - nBadFF = NULL; - badFFList = NULL; - - //multiSlsDetector - for (std::vector::const_iterator it = zmqSocket.begin(); it != zmqSocket.end(); ++it) { - delete(*it); - } - zmqSocket.clear(); - - // get objects from single det shared memory (open) - for (int i = 0; i < thisMultiDetector->numberOfDetectors; i++) { - try { - slsDetector* sdet = new slsDetector(detId, i, verify, this); - detectors.push_back(sdet); - } catch (...) { - // clear detectors list - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - delete(*it); - } - detectors.clear(); - throw; - } - } - - // depend on number of detectors - updateOffsets(); - createThreadPool(); -} - - -void multiSlsDetector::updateUserdetails() { - thisMultiDetector->lastPID = getpid(); - memset(thisMultiDetector->lastUser, 0, SHORT_STRING_LENGTH); - memset(thisMultiDetector->lastDate, 0, SHORT_STRING_LENGTH); - try { - strncpy(thisMultiDetector->lastUser, exec("whoami").c_str(), SHORT_STRING_LENGTH-1); - thisMultiDetector->lastUser[SHORT_STRING_LENGTH-1] = 0; - strncpy(thisMultiDetector->lastDate, exec("date").c_str(), DATE_LENGTH-1); - thisMultiDetector->lastDate[DATE_LENGTH-1] = 0; - } catch(...) { - strcpy(thisMultiDetector->lastUser, "errorreading"); - strcpy(thisMultiDetector->lastDate, "errorreading"); - } -} - - -std::string multiSlsDetector::exec(const char* cmd) { - int bufsize = 128; - char buffer[bufsize]; - std::string result = ""; - FILE* pipe = popen(cmd, "r"); - if (!pipe) throw std::exception(); - try { - while (!feof(pipe)) { - if (fgets(buffer, bufsize, pipe) != NULL) - result += buffer; - } - } catch (...) { - pclose(pipe); - throw; - } - pclose(pipe); - result.erase(result.find_last_not_of(" \t\n\r")+1); - return result; -} - - -void multiSlsDetector::setHostname(const char* name) { - // this check is there only to allow the previous detsizechan command - if (thisMultiDetector->numberOfDetectors) { - cprintf(RED, "Warning: There are already detector(s) in shared memory." - "Freeing Shared memory now.\n"); - freeSharedMemory(); - setupMultiDetector(); - } - addMultipleDetectors(name); -} - - -std::string multiSlsDetector::getHostname(int pos) { - return concatResultOrPos(&slsDetector::getHostname, pos); -} - -void multiSlsDetector::addMultipleDetectors(const char* name) { - size_t p1 = 0; - std::string temp = std::string(name); - size_t p2 = temp.find('+', p1); - //single - if (p2 == std::string::npos) { - addSlsDetector(temp); - } - // multi - else { - while(p2 != std::string::npos) { - addSlsDetector(temp.substr(p1, p2-p1)); - temp = temp.substr(p2 + 1); - p2 = temp.find('+'); - } - } - - // a get to update shared memory online flag - setOnline(); - updateOffsets(); - createThreadPool(); -} - -void multiSlsDetector::addSlsDetector (std::string s) { -#ifdef VERBOSE - cout << "Adding detector " << s << endl; -#endif - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - if ((*it)->getHostname((it-detectors.begin())) == s) { - cout << "Detector " << s << "already part of the multiDetector!" << endl - << "Remove it before adding it back in a new position!" << endl; - return; - } - } - - //check entire shared memory if it doesnt exist?? needed? - //could be that detectors not loaded completely cuz of crash in new slsdetector in initsharedmemory - - // get type by connecting - detectorType type = slsDetector::getDetectorType(s.c_str(), DEFAULT_PORTNO); - if (type == GENERIC) { - cout << "Could not connect to Detector " << s << " to determine the type!" << endl; - setErrorMask(getErrorMask() | MULTI_DETECTORS_NOT_ADDED); - appendNotAddedList(s.c_str()); - return; - } - - - - int pos = (int)detectors.size(); - slsDetector* sdet = new slsDetector(type, detId, pos, false, this); - detectors.push_back(sdet); - thisMultiDetector->numberOfDetectors = detectors.size(); - - detectors[pos]->setHostname(s.c_str()); // also updates client - - thisMultiDetector->dataBytes += detectors[pos]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels += detectors[pos]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels += detectors[pos]->getTotalNumberOfChannels(); - thisMultiDetector->maxNumberOfChannels += detectors[pos]->getMaxNumberOfChannels(); -} - - -slsDetectorDefs::detectorType multiSlsDetector::getDetectorsType(int pos) { - detectorType dt = GENERIC; - if (pos >= 0 && pos < (int)detectors.size()) { - return detectors[pos]->getDetectorsType(); - } else - return detectors[0]->getDetectorsType();// needed?? - return dt; -} - - -std::string multiSlsDetector::sgetDetectorsType(int pos) { - return concatResultOrPos(&slsDetector::sgetDetectorsType, pos); -} - - -std::string multiSlsDetector::getDetectorType() { - return sgetDetectorsType(); -} - - -void multiSlsDetector::createThreadPool() { - if (threadpool) - destroyThreadPool(); - int numthreads = (int)detectors.size(); - if (numthreads < 1) { - numthreads = 1; //create threadpool anyway, threads initialized only when >1 detector added - } - threadpool = new ThreadPool(numthreads); - switch (threadpool->initialize_threadpool()) { - case 0: - std::cerr << "Failed to initialize thread pool!" << endl; - throw ThreadpoolException(); - case 1: -#ifdef VERBOSE - cout << "Not initializing threads, not multi detector" << endl; -#endif - break; - default: -#ifdef VERBOSE - cout << "Initialized Threadpool " << threadpool << endl; -#endif - break; - } -} - - -void multiSlsDetector::destroyThreadPool() { - if (threadpool) { - delete threadpool; - threadpool = 0; -#ifdef VERBOSE - cout << "Destroyed Threadpool " << threadpool << endl; -#endif - } -} - - -int multiSlsDetector::getNumberOfDetectors() { - return (int)detectors.size(); -} - -int multiSlsDetector::getNumberOfDetectors(dimension d) { - return thisMultiDetector->numberOfDetector[d]; -} - -void multiSlsDetector::getNumberOfDetectors(int& nx, int& ny) { - nx=thisMultiDetector->numberOfDetector[X];ny=thisMultiDetector->numberOfDetector[Y]; -} - -int multiSlsDetector::getNMods() { - int nm = 0; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - nm += (*it)->getNMods(); - } - return nm; -} - -int multiSlsDetector::getNMod(dimension d) { - int nm = 0; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - nm += (*it)->getNMod(d); - } - return nm; -} - -int multiSlsDetector::getMaxMods() { - int ret = 0; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - ret += (*it)->getMaxMods(); - } - return ret; -} - -int multiSlsDetector::getMaxMod(dimension d) { - int ret = 0, ret1; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - ret1 = (*it)->getNMaxMod(d); -#ifdef VERBOSE - cout << "detector " << (it-detectors.begin()) << " maxmods " << - ret1 << " in direction " << d << endl; -#endif - ret += ret1; - } -#ifdef VERBOSE - cout << "max mods in direction " << d << " is " << ret << endl; -#endif - - return ret; -} - -int multiSlsDetector::getMaxNumberOfModules(dimension d) { - int ret = 0; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - ret += (*it)->getMaxNumberOfModules(d); - } - return ret; -} - -int multiSlsDetector::setNumberOfModules(int p, dimension d) { - int ret = 0; - int nm = 0, mm = 0, nt = p; - - thisMultiDetector->dataBytes = 0; - thisMultiDetector->dataBytesInclGapPixels = 0; - thisMultiDetector->numberOfChannels = 0; - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (p < 0) - nm = p; - else { - mm = detectors[idet]->getMaxNumberOfModules(); - if (nt > mm) { - nm = mm; - nt -= nm; - } else { - nm = nt; - nt -= nm; - } - } - ret += detectors[idet]->setNumberOfModules(nm); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - thisMultiDetector->dataBytes += detectors[idet]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels += detectors[idet]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels += detectors[idet]->getTotalNumberOfChannels(); - } - - if (p != -1) - updateOffsets(); - return ret; -} - -int multiSlsDetector::getChansPerMod(int imod) { - int id = -1, im = -1; - decodeNMod(imod, id, im); - if (id >= 0 && id < (int)detectors.size()) { - return detectors[id]->getChansPerMod(im); - } - return -1; -} - -int multiSlsDetector::getTotalNumberOfChannels() { - thisMultiDetector->numberOfChannels = 0; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - thisMultiDetector->numberOfChannels += (*it)->getTotalNumberOfChannels(); - } - return thisMultiDetector->numberOfChannels; -} - -int multiSlsDetector::getTotalNumberOfChannels(dimension d) { - return thisMultiDetector->numberOfChannel[d]; -} - -int multiSlsDetector::getTotalNumberOfChannelsInclGapPixels(dimension d) { - return thisMultiDetector->numberOfChannelInclGapPixels[d]; -} - -int multiSlsDetector::getMaxNumberOfChannels() { - thisMultiDetector->maxNumberOfChannels = 0; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - thisMultiDetector->maxNumberOfChannels += (*it)->getMaxNumberOfChannels(); - } - return thisMultiDetector->maxNumberOfChannels; -} - -int multiSlsDetector::getMaxNumberOfChannels(dimension d) { - return thisMultiDetector->maxNumberOfChannel[d]; -} - -int multiSlsDetector::getMaxNumberOfChannelsInclGapPixels(dimension d) { - return thisMultiDetector->maxNumberOfChannelInclGapPixels[d]; -} - -int multiSlsDetector::getMaxNumberOfChannelsPerDetector(dimension d) { - return thisMultiDetector->maxNumberOfChannelsPerDetector[d]; -} - -int multiSlsDetector::setMaxNumberOfChannelsPerDetector(dimension d,int i) { - thisMultiDetector->maxNumberOfChannelsPerDetector[d] = i; - return thisMultiDetector->maxNumberOfChannelsPerDetector[d]; -} - -int multiSlsDetector::getDetectorOffset(dimension d, int pos) { - if (pos < 0 || pos >= (int)detectors.size()) - return -1; - return detectors[pos]->getDetectorOffset(d); -} - - -void multiSlsDetector::setDetectorOffset(dimension d, int off, int pos) { - if (pos < 0 || pos >= (int)detectors.size()) - detectors[pos]->setDetectorOffset(d, off); -} - - -void multiSlsDetector::updateOffsets() { - //cannot paralllize due to slsdetector calling this via parentdet-> -#ifdef VERBOSE - cout << endl - << "Updating Multi-Detector Offsets" << endl; -#endif - int offsetX = 0, offsetY = 0, numX = 0, numY = 0, maxX = 0, maxY = 0; - int maxChanX = thisMultiDetector->maxNumberOfChannelsPerDetector[X]; - int maxChanY = thisMultiDetector->maxNumberOfChannelsPerDetector[Y]; - int prevChanX = 0; - int prevChanY = 0; - bool firstTime = true; - - thisMultiDetector->numberOfChannel[X] = 0; - thisMultiDetector->numberOfChannel[Y] = 0; - thisMultiDetector->maxNumberOfChannel[X] = 0; - thisMultiDetector->maxNumberOfChannel[Y] = 0; - thisMultiDetector->numberOfDetector[X] = 0; - thisMultiDetector->numberOfDetector[Y] = 0; - - // gap pixels - int offsetX_gp = 0, offsetY_gp = 0, numX_gp = 0, numY_gp = 0, maxX_gp = 0, maxY_gp = 0; - int prevChanX_gp = 0, prevChanY_gp = 0; - thisMultiDetector->numberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->numberOfChannelInclGapPixels[Y] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = 0; - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = 0; - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { -#ifdef VERBOSE - cout << "offsetX:" << offsetX << " prevChanX:" << prevChanX << " " - "offsetY:" << offsetY << " prevChanY:" << prevChanY << endl; - cout << "offsetX_gp:" << offsetX_gp << " " - "prevChanX_gp:" << prevChanX_gp << " " - "offsetY_gp:" << offsetY_gp << " " - "prevChanY_gp:" << prevChanY_gp << endl; -#endif - //cout<<" totalchan:"<< detectors[idet]->getTotalNumberOfChannels(Y) - //<<" maxChanY:"< 0) && ((offsetX + detectors[idet]->getTotalNumberOfChannels(X)) - > maxChanX)) - cout << "\nDetector[" << idet << "] exceeds maximum channels " - "allowed for complete detector set in X dimension!" << endl; - if ((maxChanY > 0) && ((offsetY + detectors[idet]->getTotalNumberOfChannels(Y)) - > maxChanY)) - cout << "\nDetector[" << idet << "] exceeds maximum channels " - "allowed for complete detector set in Y dimension!" << endl; - prevChanX = detectors[idet]->getTotalNumberOfChannels(X); - prevChanY = detectors[idet]->getTotalNumberOfChannels(Y); - prevChanX_gp = detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X); - prevChanY_gp = detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); - numX += detectors[idet]->getTotalNumberOfChannels(X); - numY += detectors[idet]->getTotalNumberOfChannels(Y); - numX_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X); - numY_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); - maxX += detectors[idet]->getMaxNumberOfChannels(X); - maxY += detectors[idet]->getMaxNumberOfChannels(Y); - maxX_gp += detectors[idet]->getMaxNumberOfChannelsInclGapPixels(X); - maxY_gp += detectors[idet]->getMaxNumberOfChannelsInclGapPixels(Y); - ++thisMultiDetector->numberOfDetector[X]; - ++thisMultiDetector->numberOfDetector[Y]; -#ifdef VERBOSE - cout << "incrementing in both direction" << endl; -#endif - } - - //incrementing in y direction - else if ((maxChanY == -1) || ((maxChanY > 0) && - ((offsetY + prevChanY + detectors[idet]->getTotalNumberOfChannels(Y)) - <= maxChanY))) { - offsetY += prevChanY; - offsetY_gp += prevChanY_gp; - prevChanY = detectors[idet]->getTotalNumberOfChannels(Y); - prevChanY_gp = detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); - numY += detectors[idet]->getTotalNumberOfChannels(Y); - numY_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); - maxY += detectors[idet]->getMaxNumberOfChannels(Y); - maxY_gp += detectors[idet]->getMaxNumberOfChannelsInclGapPixels(Y); - // increment in y again only in the first column (else you double increment) - if (thisMultiDetector->numberOfDetector[X] == 1) - ++thisMultiDetector->numberOfDetector[Y]; -#ifdef VERBOSE - cout << "incrementing in y direction" << endl; -#endif - } - - //incrementing in x direction - else { - if ((maxChanX > 0) && - ((offsetX + prevChanX + detectors[idet]->getTotalNumberOfChannels(X)) - > maxChanX)) - cout << "\nDetector[" << idet << "] exceeds maximum channels " - "allowed for complete detector set in X dimension!" << endl; - offsetY = 0; - offsetY_gp = 0; - prevChanY = detectors[idet]->getTotalNumberOfChannels(Y); - prevChanY_gp = detectors[idet]->getTotalNumberOfChannelsInclGapPixels(Y); - numY = 0; //assuming symmetry with this statement. - //whats on 1st column should be on 2nd column - numY_gp = 0; - maxY = 0; - maxY_gp = 0; - offsetX += prevChanX; - offsetX_gp += prevChanX_gp; - prevChanX = detectors[idet]->getTotalNumberOfChannels(X); - prevChanX_gp = detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X); - numX += detectors[idet]->getTotalNumberOfChannels(X); - numX_gp += detectors[idet]->getTotalNumberOfChannelsInclGapPixels(X); - maxX += detectors[idet]->getMaxNumberOfChannels(X); - maxX_gp += detectors[idet]->getMaxNumberOfChannelsInclGapPixels(X); - ++thisMultiDetector->numberOfDetector[X]; -#ifdef VERBOSE - cout << "incrementing in x direction" << endl; -#endif - } - - double bytesperchannel = (double)detectors[idet]->getDataBytes() / - (double)(detectors[idet]->getMaxNumberOfChannels(X) - * detectors[idet]->getMaxNumberOfChannels(Y)); - detectors[idet]->setDetectorOffset(X, (bytesperchannel >= 1.0) ? offsetX_gp : offsetX); - detectors[idet]->setDetectorOffset(Y, (bytesperchannel >= 1.0) ? offsetY_gp : offsetY); - -#ifdef VERBOSE - cout << "Detector[" << idet << "] has offsets (" << - detectors[idet]->getDetectorOffset(X) << ", " << - detectors[idet]->getDetectorOffset(Y) << ")" << endl; -#endif - //offsetY has been reset sometimes and offsetX the first time, - //but remember the highest values - if (numX > thisMultiDetector->numberOfChannel[X]) - thisMultiDetector->numberOfChannel[X] = numX; - if (numY > thisMultiDetector->numberOfChannel[Y]) - thisMultiDetector->numberOfChannel[Y] = numY; - if (numX_gp > thisMultiDetector->numberOfChannelInclGapPixels[X]) - thisMultiDetector->numberOfChannelInclGapPixels[X] = numX_gp; - if (numY_gp > thisMultiDetector->numberOfChannelInclGapPixels[Y]) - thisMultiDetector->numberOfChannelInclGapPixels[Y] = numY_gp; - if (maxX > thisMultiDetector->maxNumberOfChannel[X]) - thisMultiDetector->maxNumberOfChannel[X] = maxX; - if (maxY > thisMultiDetector->maxNumberOfChannel[Y]) - thisMultiDetector->maxNumberOfChannel[Y] = maxY; - if (maxX_gp > thisMultiDetector->maxNumberOfChannelInclGapPixels[X]) - thisMultiDetector->maxNumberOfChannelInclGapPixels[X] = maxX_gp; - if (maxY_gp > thisMultiDetector->maxNumberOfChannelInclGapPixels[Y]) - thisMultiDetector->maxNumberOfChannelInclGapPixels[Y] = maxY_gp; - } -#ifdef VERBOSE - cout << "Number of Channels in X direction:" << thisMultiDetector->numberOfChannel[X] << endl; - cout << "Number of Channels in Y direction:" << thisMultiDetector->numberOfChannel[Y] << endl - << endl; - cout << "Number of Channels in X direction with Gap Pixels:" << - thisMultiDetector->numberOfChannelInclGapPixels[X] << endl; - cout << "Number of Channels in Y direction with Gap Pixels:" << - thisMultiDetector->numberOfChannelInclGapPixels[Y] << endl - << endl; -#endif -} - - -int multiSlsDetector::setOnline(int off) { - if (off != GET_ONLINE_FLAG) - thisMultiDetector->onlineFlag = parallelCallDetectorMember(&slsDetector::setOnline, off); - return thisMultiDetector->onlineFlag; -} - - -std::string multiSlsDetector::checkOnline() { - std::string offlineDetectors = ""; - for (std::vector::const_iterator it = detectors.begin(); it != detectors.end(); ++it) { - std::string tmp = (*it)->checkOnline(); - if (!tmp.empty()) - offlineDetectors += tmp + "+"; - } - return offlineDetectors; -} - - -int multiSlsDetector::setPort(portType t, int p) { - return callDetectorMember(&slsDetector::setPort, t, p); -} - -int multiSlsDetector::lockServer(int p) { - return callDetectorMember(&slsDetector::lockServer, p); -} - -std::string multiSlsDetector::getLastClientIP() { - return callDetectorMember(&slsDetector::getLastClientIP); -} - -int multiSlsDetector::exitServer() { - int ival = FAIL, iv; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iv = detectors[idet]->exitServer(); - if (iv == OK) - ival = iv; - } - return ival; -} - -int multiSlsDetector::readConfigurationFile(std::string const fname) { - - freeSharedMemory(); - setupMultiDetector(); - - - multiSlsDetectorClient* cmd; - std::string ans; - std::string str; - std::ifstream infile; - int iargval; - int interrupt = 0; - char* args[1000]; - - char myargs[1000][1000]; - - std::string sargname, sargval; - int iline = 0; - std::cout << "config file name " << fname << std::endl; - infile.open(fname.c_str(), std::ios_base::in); - if (infile.is_open()) { - - while (infile.good() and interrupt == 0) { - sargname = "none"; - sargval = "0"; - getline(infile, str); - ++iline; - - // remove comments that come after - if (str.find('#') != std::string::npos) - str.erase(str.find('#')); -#ifdef VERBOSE - std::cout << "string:" << str << std::endl; -#endif - if (str.length() < 2) { -#ifdef VERBOSE - std::cout << "Empty line or Comment " << std::endl; -#endif - continue; - } else { - std::istringstream ssstr(str); - iargval = 0; - while (ssstr.good()) { - ssstr >> sargname; -#ifdef VERBOSE - std::cout << iargval << " " << sargname << std::endl; -#endif - strcpy(myargs[iargval], sargname.c_str()); - args[iargval] = myargs[iargval]; -#ifdef VERBOSE - std::cout << "--" << iargval << " " << args[iargval] << std::endl; -#endif - ++iargval; - } -#ifdef VERBOSE - cout << endl; - for (int ia = 0; ia < iargval; ia++) - cout << args[ia] << " ??????? "; - cout << endl; -#endif - cmd = new multiSlsDetectorClient(iargval, args, PUT_ACTION, this); - delete cmd; - } - ++iline; - } - - infile.close(); - } else { - std::cout << "Error opening configuration file " << fname << " for reading" << std::endl; - setErrorMask(getErrorMask() | MULTI_CONFIG_FILE_ERROR); - return FAIL; - } -#ifdef VERBOSE - std::cout << "Read configuration file of " << iline << " lines" << std::endl; -#endif - - setNumberOfModules(-1); - getMaxNumberOfModules(); - - if (getErrorMask()) { - int c; - cprintf(RED, "\n----------------\n Error Messages\n----------------\n%s\n", - getErrorMessage(c).c_str()); - return FAIL; - } - - return OK; -} - - -int multiSlsDetector::writeConfigurationFile(std::string const fname) { - - std::string names[] = { - "detsizechan", - "hostname", - "master", - "sync", - "outdir", - "ffdir", - "headerbefore", - "headerafter", - "headerbeforepar", - "headerafterpar", - "badchannels", - "angconv", - "globaloff", - "binsize", - "threaded" - }; - - int nvar = 15; - char* args[100]; - for (int ia = 0; ia < 100; ++ia) { - args[ia] = new char[1000]; - } - int ret = OK, ret1 = OK; - - std::ofstream outfile; - int iline = 0; - - outfile.open(fname.c_str(), std::ios_base::out); - if (outfile.is_open()) { - - slsDetectorCommand* cmd = new slsDetectorCommand(this); - - // complete size of detector - cout << iline << " " << names[iline] << endl; - strcpy(args[0], names[iline].c_str()); - outfile << names[iline] << " " << cmd->executeLine(1, args, GET_ACTION) << std::endl; - ++iline; - - // hostname of the detectors - cout << iline << " " << names[iline] << endl; - strcpy(args[0], names[iline].c_str()); - outfile << names[iline] << " " << cmd->executeLine(1, args, GET_ACTION) << std::endl; - ++iline; - - // single detector configuration - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - outfile << endl; - ret1 = detectors[idet]->writeConfigurationFile(outfile, idet); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret1 == FAIL) - ret = FAIL; - } - - outfile << endl; - //other configurations - while (iline < nvar) { - cout << iline << " " << names[iline] << endl; - strcpy(args[0], names[iline].c_str()); - outfile << names[iline] << " " << cmd->executeLine(1, args, GET_ACTION) << std::endl; - ++iline; - } - - delete cmd; - outfile.close(); -#ifdef VERBOSE - std::cout << "wrote " << iline << " lines to configuration file " << std::endl; -#endif - } else { - std::cout << "Error opening configuration file " << fname << " for writing" << std::endl; - setErrorMask(getErrorMask() | MULTI_CONFIG_FILE_ERROR); - ret = FAIL; - } - - for (int ia = 0; ia < 100; ++ia) { - delete[] args[ia]; - } - - return ret; -} - - - -std::string multiSlsDetector::getSettingsFile() { - return callDetectorMember(&slsDetector::getSettingsFile); -} - - -slsDetectorDefs::detectorSettings multiSlsDetector::getSettings(int pos) { - int ret = -100; - int posmin = 0, posmax = (int)detectors.size(); - if (pos >= 0) { - posmin = pos; - posmax = pos + 1; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return GET_SETTINGS; - } else { - //return storage values - detectorSettings* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new detectorSettings(GET_SETTINGS); - Task* task = new Task(new func1_t(&slsDetector::getSettings, - detectors[idet], -1, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = GET_SETTINGS; - delete iret[idet]; - } else - ret = GET_SETTINGS; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - thisMultiDetector->currentSettings = (detectorSettings)ret; - return (detectorSettings)ret; -} - - - -int multiSlsDetector::getThresholdEnergy(int pos) { - int i, posmin, posmax; - int ret1 = -100, ret; - - if (pos < 0) { - posmin = 0; - posmax = (int)detectors.size(); - } else { - posmin = pos; - posmax = pos + 1; - } - - for (i = posmin; i < posmax; ++i) { - ret = detectors[i]->getThresholdEnergy(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 == -100) - ret1 = ret; - else if (ret < (ret1 - 200) || ret > (ret1 + 200)) - ret1 = -1; - } - thisMultiDetector->currentThresholdEV = ret1; - return ret1; -} - - -int multiSlsDetector::setThresholdEnergy(int e_eV, int pos, detectorSettings isettings, int tb) { - int posmin, posmax; - int ret = -100; - if (pos < 0) { - posmin = 0; - posmax = (int)detectors.size(); - } else { - posmin = pos; - posmax = pos + 1; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - //return storage values - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new int(-1); - Task* task = new Task(new func4_t(&slsDetector::setThresholdEnergy, - detectors[idet], e_eV, -1, isettings, tb, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (*iret[idet] < (ret - 200) || *iret[idet] > (ret + 200)) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - thisMultiDetector->currentThresholdEV = ret; - return ret; -} - - -slsDetectorDefs::detectorSettings multiSlsDetector::setSettings(detectorSettings isettings, - int pos) { - int ret = -100; - int posmin = 0, posmax = (int)detectors.size(); - if (pos >= 0) { - posmin = pos; - posmax = pos + 1; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return GET_SETTINGS; - } else { - //return storage values - detectorSettings* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (detectors[idet]) { - iret[idet] = new detectorSettings(GET_SETTINGS); - Task* task = new Task(new func2_t - (&slsDetector::setSettings, detectors[idet], isettings, -1, iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (detectors[idet]) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = GET_SETTINGS; - delete iret[idet]; - } else - ret = GET_SETTINGS; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - thisMultiDetector->currentSettings = (detectorSettings)ret; - return (detectorSettings)ret; -} - - -std::string multiSlsDetector::getSettingsDir() { - return callDetectorMember(&slsDetector::getSettingsDir); -} - - -std::string multiSlsDetector::setSettingsDir(std::string s) { - - if (s.find('+') == std::string::npos) { - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - detectors[idet]->setSettingsDir(s); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } else { - size_t p1 = 0; - size_t p2 = s.find('+', p1); - int id = 0; - while (p2 != std::string::npos) { - detectors[id]->setSettingsDir(s.substr(p1, p2 - p1)); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - ++id; - s = s.substr(p2 + 1); - p2 = s.find('+'); - if (id >= (int)detectors.size()) - break; - } - } - return getSettingsDir(); -} - -std::string multiSlsDetector::getCalDir() { - return callDetectorMember(&slsDetector::getCalDir); -} - -std::string multiSlsDetector::setCalDir(std::string s) { - - if (s.find('+') == std::string::npos) { - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - detectors[idet]->setCalDir(s); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } else { - size_t p1 = 0; - size_t p2 = s.find('+', p1); - int id = 0; - while (p2 != std::string::npos) { - - if (detectors[id]) { - detectors[id]->setCalDir(s.substr(p1, p2 - p1)); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - } - ++id; - s = s.substr(p2 + 1); - p2 = s.find('+'); - if (id >= (int)detectors.size()) - break; - } - } - return getCalDir(); -} - - -int multiSlsDetector::loadSettingsFile(std::string fname, int imod) { - int ret = OK; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->loadSettingsFile(fname, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int* iret[detectors.size()]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iret[idet] = new int(OK); - Task* task = new Task(new func2_t(&slsDetector::loadSettingsFile, - detectors[idet], fname, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - - return ret; -} - -int multiSlsDetector::saveSettingsFile(std::string fname, int imod) { - int id = -1, im = -1, ret; - - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->saveSettingsFile(fname, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - - } - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret = detectors[idet]->saveSettingsFile(fname, imod); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return ret; -} - - -int multiSlsDetector::loadCalibrationFile(std::string fname, int imod) { - int ret = OK; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->loadCalibrationFile(fname, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int* iret[detectors.size()]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (detectors[idet]) { - iret[idet] = new int(OK); - Task* task = new Task(new func2_t(&slsDetector::loadCalibrationFile, - detectors[idet], fname, imod, iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (detectors[idet]) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - return ret; -} - -int multiSlsDetector::saveCalibrationFile(std::string fname, int imod) { - int id = -1, im = -1, ret; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->saveCalibrationFile(fname, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret = detectors[idet]->saveCalibrationFile(fname, imod); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return ret; -} - - - -int multiSlsDetector::setMaster(int i) { - int ret = -1, slave = 0; - masterFlags f; -#ifdef VERBOSE - cout << "settin master in position " << i << endl; -#endif - if (i >= 0 && i < (int)detectors.size()) { -#ifdef VERBOSE - cout << "detector position " << i << " "; -#endif - thisMultiDetector->masterPosition = i; - detectors[i]->setMaster(IS_MASTER); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (i != (int)idet) { -#ifdef VERBOSE - cout << "detector position " << idet << " "; -#endif - detectors[idet]->setMaster(IS_SLAVE); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - } else if (i == -2) { - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { -#ifdef VERBOSE - cout << "detector position " << idet << " "; -#endif - detectors[idet]->setMaster(NO_MASTER); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - // check return value - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { -#ifdef VERBOSE - cout << "detector position " << idet << " "; -#endif - f = detectors[idet]->setMaster(GET_MASTER); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - switch (f) { - case NO_MASTER: - if (ret != -1) - ret = -2; - break; - case IS_MASTER: - if (ret == -1) - ret = idet; - else - ret = -2; - break; - case IS_SLAVE: - slave = 1; - break; - default: - ret = -2; - } - - } - if (slave > 0 && ret < 0) - ret = -2; - - if (ret < 0) - ret = -1; - - thisMultiDetector->masterPosition = ret; - - return thisMultiDetector->masterPosition; -} - - -slsDetectorDefs::synchronizationMode multiSlsDetector::setSynchronization(synchronizationMode sync) { - synchronizationMode ret = GET_SYNCHRONIZATION_MODE, ret1 = GET_SYNCHRONIZATION_MODE; - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setSynchronization(sync); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (idet == 0) - ret = ret1; - else if (ret != ret1) - ret = GET_SYNCHRONIZATION_MODE; - } - - thisMultiDetector->syncMode = ret; - - return thisMultiDetector->syncMode; -} - -slsDetectorDefs::runStatus multiSlsDetector::getRunStatus() { - runStatus s = IDLE, s1 = IDLE; - if (thisMultiDetector->masterPosition >= 0) { - s = detectors[thisMultiDetector->masterPosition]->getRunStatus(); - if (detectors[thisMultiDetector->masterPosition]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << thisMultiDetector->masterPosition)); - return s; - } - - for (unsigned int i = 0; i < detectors.size(); ++i) { - s1 = detectors[i]->getRunStatus(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (s1 == ERROR) { - return ERROR; - } - if (s1 != IDLE) - s = s1; - } - return s; -} - -int multiSlsDetector::prepareAcquisition() { - - int i = 0; - int ret = OK; - int posmin = 0, posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::prepareAcquisition, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - //master - int ret1 = OK; - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->prepareAcquisition(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - - return ret; -} - -int multiSlsDetector::cleanupAcquisition() { - int i = 0; - int ret = OK, ret1 = OK; - int posmin = 0, posmax = detectors.size(); - - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->cleanupAcquisition(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::cleanupAcquisition, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - return ret; -} - - -int multiSlsDetector::startAcquisition() { - if (getDetectorsType() == EIGER) { - if (prepareAcquisition() == FAIL) - return FAIL; - } - - int i = 0; - int ret = OK; - int posmin = 0, posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::startAcquisition, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - //master - int ret1 = OK; - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->startAcquisition(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - return ret; -} - - -int multiSlsDetector::stopAcquisition() { - pthread_mutex_lock(&mg); // locks due to processing thread using threadpool when in use - int i = 0; - int ret = OK, ret1 = OK; - int posmin = 0, posmax = detectors.size(); - - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->stopAcquisition(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::stopAcquisition, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - *stoppedFlag = 1; - pthread_mutex_unlock(&mg); - return ret; -} - - - -int multiSlsDetector::sendSoftwareTrigger() { - int i = 0; - int ret = OK; - int posmin = 0, posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::sendSoftwareTrigger, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - //master - int ret1 = OK; - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->sendSoftwareTrigger(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - return ret; -} - - - -int multiSlsDetector::startReadOut() { - int i = 0; - int ret = OK, ret1 = OK; - i = thisMultiDetector->masterPosition; - if (i >= 0) { - ret = detectors[i]->startReadOut(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret != OK) - ret1 = FAIL; - } - for (i = 0; i < (int)detectors.size(); ++i) { - ret = detectors[i]->startReadOut(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret != OK) - ret1 = FAIL; - } - - return ret1; -} - - -int* multiSlsDetector::startAndReadAll() { -#ifdef VERBOSE - cout << "Start and read all " << endl; -#endif - int* retval = NULL; - int i = 0; - if (thisMultiDetector->onlineFlag == ONLINE_FLAG) { - - if (getDetectorsType() == EIGER) { - if (prepareAcquisition() == FAIL) - return NULL; - } - startAndReadAllNoWait(); - - while ((retval = getDataFromDetector())) { - ++i; -#ifdef VERBOSE - std::cout << i << std::endl; -#endif - dataQueue.push(retval); - } - - for (unsigned int id = 0; id < detectors.size(); ++id) { - if (detectors[id]) { - detectors[id]->disconnectControl(); - } - } - } -#ifdef VERBOSE - std::cout << "Recieved " << i << " frames" << std::endl; -#endif - return dataQueueFront(); -} - - -int multiSlsDetector::startAndReadAllNoWait() { - pthread_mutex_lock(&mg); // locks due to processing thread using threadpool when in use - int i = 0; - int ret = OK; - int posmin = 0, posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition){ - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::startAndReadAllNoWait, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - //master - int ret1 = OK; - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->startAndReadAllNoWait(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - pthread_mutex_unlock(&mg); - return ret; -} - - - -int* multiSlsDetector::getDataFromDetector() { - - int nel = thisMultiDetector->dataBytes / sizeof(int); - int n = 0; - int* retval = NULL; - int *retdet, *p = retval; - int nodatadet = -1; - int nodatadetectortype = false; - detectorType types = getDetectorsType(); - if (types == EIGER || types == JUNGFRAU || GOTTHARD || PROPIX) { - nodatadetectortype = true; - } - - if (!nodatadetectortype) - retval = new int[nel]; - p = retval; - - for (unsigned int id = 0; id < detectors.size(); ++id) { - retdet = detectors[id]->getDataFromDetector(p); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - if (!nodatadetectortype) { - n = detectors[id]->getDataBytes(); - if (retdet) { - ; -#ifdef VERBOSE - cout << "Detector " << id << " returned " << n << " bytes " << endl; -#endif - } else { - nodatadet = id; -#ifdef VERBOSE - cout << "Detector " << id << " does not have data left " << endl; -#endif - } - p += n / sizeof(int); - } - } - - //eiger returns only null - if (nodatadetectortype) { - return NULL; - } - - if (nodatadet >= 0) { - for (unsigned int id = 0; id < detectors.size(); ++id) { - if ((int)id != nodatadet) { - if (detectors[id]) { - //#ifdef VERBOSE - cout << "Stopping detector " << id << endl; - //#endif - detectors[id]->stopAcquisition(); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - - while ((retdet = detectors[id]->getDataFromDetector())) { - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); -#ifdef VERBOSE - cout << "Detector " << id << " still sent data " << endl; -#endif - delete[] retdet; - } - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - } - } - } - delete[] retval; - return NULL; - } - - return retval; -} - - -int* multiSlsDetector::readFrame() { - int nel = thisMultiDetector->dataBytes / sizeof(int); - int n; - int* retval = new int[nel]; - int *retdet, *p = retval; - - for (unsigned int id = 0; id < detectors.size(); ++id) { - if (detectors[id]) { - retdet = detectors[id]->readFrame(); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - if (retdet) { - n = detectors[id]->getDataBytes(); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - memcpy(p, retdet, n); - delete[] retdet; - p += n / sizeof(int); - } else { -#ifdef VERBOSE - cout << "Detector " << id << " does not have data left " << endl; -#endif - delete[] retval; - return NULL; - } - } - } - dataQueue.push(retval); - return retval; -} - - -int* multiSlsDetector::readAll() { - int* retval = NULL; - int i = 0; -#ifdef VERBOSE - std::cout << "Reading all frames " << std::endl; -#endif - if (thisMultiDetector->onlineFlag == ONLINE_FLAG) { - - for (unsigned int id = 0; id < detectors.size(); ++id) { - detectors[id]->readAllNoWait(); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - } - while ((retval = getDataFromDetector())) { - ++i; -#ifdef VERBOSE - std::cout << i << std::endl; -#endif - dataQueue.push(retval); - } - for (unsigned int id = 0; id < detectors.size(); ++id) { - detectors[id]->disconnectControl(); - } - } - -#ifdef VERBOSE - std::cout << "received " << i << " frames" << std::endl; -#endif - return dataQueueFront(); -} - - -int* multiSlsDetector::popDataQueue() { - int* retval = NULL; - if (!dataQueue.empty()) { - retval = dataQueue.front(); - dataQueue.pop(); - } - return retval; -} - -detectorData* multiSlsDetector::popFinalDataQueue() { - detectorData* retval = NULL; - if (!finalDataQueue.empty()) { - retval = finalDataQueue.front(); - finalDataQueue.pop(); - } - return retval; -} - -void multiSlsDetector::resetDataQueue() { - int* retval = NULL; - while (!dataQueue.empty()) { - retval = dataQueue.front(); - dataQueue.pop(); - delete[] retval; - } -} - -void multiSlsDetector::resetFinalDataQueue() { - detectorData* retval = NULL; - while (!finalDataQueue.empty()) { - retval = finalDataQueue.front(); - finalDataQueue.pop(); - delete retval; - } -} - -int multiSlsDetector::configureMAC() { - return callDetectorMember(&slsDetector::configureMAC); -} - -int64_t multiSlsDetector::setTimer(timerIndex index, int64_t t, int imod) { - int64_t ret=-100; - - // single (for gotthard 25 um) - if (imod != -1) { - if (imod >= 0 && imod < (int)detectors.size()) { - ret = detectors[imod]->setTimer(index,t,imod); - if(detectors[imod]->getErrorMask()) - setErrorMask(getErrorMask()|(1<numberOfDetectors]; - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - iret[idet]= new int64_t(-1); - Task* task = new Task(new func3_t(&slsDetector::setTimer, - detectors[idet],index,t,imod,iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for(int idet=0; idetnumberOfDetectors; ++idet){ - if(detectors[idet]){ - if(iret[idet] != NULL){ - if (ret==-100) - ret=*iret[idet]; - else if (ret!=*iret[idet]) - ret=-1; - delete iret[idet]; - }else ret=-1; - if(detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask()|(1<timerValue[index] = ret; - return ret; -} - -int64_t multiSlsDetector::getTimeLeft(timerIndex index, int imod) { - int64_t ret = -100; - - { // single - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->getTimeLeft(index, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - if (thisMultiDetector->masterPosition >= 0) - if (detectors[thisMultiDetector->masterPosition]) { - ret = detectors[thisMultiDetector->masterPosition]->getTimeLeft(index, imod); - if (detectors[thisMultiDetector->masterPosition]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << thisMultiDetector->masterPosition)); - return ret; - } - return callDetectorMember(&slsDetector::getTimeLeft, index, imod); -} - -int multiSlsDetector::setSpeed(speedVariable index, int value) { - int ret1 = -100, ret; - - for (unsigned i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->setSpeed(index, value); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 == -100) - ret1 = ret; - else if (ret != ret1) - ret1 = FAIL; - } - - return ret1; -} - -int multiSlsDetector::setDynamicRange(int p) { - int ret = -100; - thisMultiDetector->dataBytes = 0; - thisMultiDetector->dataBytesInclGapPixels = 0; - thisMultiDetector->numberOfChannels = 0; - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - //return storage values - int* iret[detectors.size()]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iret[idet] = new int(-1); - Task* task = new Task(new func1_t(&slsDetector::setDynamicRange, - detectors[idet], p, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (iret[idet] != NULL) { - thisMultiDetector->dataBytes += detectors[idet]->getDataBytes(); - thisMultiDetector->dataBytesInclGapPixels += - detectors[idet]->getDataBytesInclGapPixels(); - thisMultiDetector->numberOfChannels += - detectors[idet]->getTotalNumberOfChannels(); - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - //for usability for the user - if (getDetectorsType() == EIGER) { - if (p == 32) { - std::cout << "Setting Clock to Quarter Speed to cope with Dynamic Range of 32" << std::endl; - setSpeed(CLOCK_DIVIDER, 2); - } else if (p == 16) { - std::cout << "Setting Clock to Half Speed for Dynamic Range of 16" << std::endl; - setSpeed(CLOCK_DIVIDER, 1); - } - if (p != -1) - updateOffsets(); - } - return ret; -} - -int multiSlsDetector::getDataBytes() { - int n_bytes = 0; - for (unsigned int ip = 0; ip < detectors.size(); ++ip) { - n_bytes += detectors[ip]->getDataBytes(); - } - return n_bytes; -} - - -dacs_t multiSlsDetector::setDAC(dacs_t val, dacIndex idac, int mV, int imod) { - dacs_t ret = -100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 && id >= (int)detectors.size()) - return -1; - ret = detectors[id]->setDAC(val, idac, mV, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int posmin = 0, posmax = detectors.size(); - dacs_t* iret[posmax - posmin]; - - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new dacs_t(-1); - Task* task = new Task(new func4_t - (&slsDetector::setDAC, detectors[idet], val, idac, mV, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - - // highvoltage of slave, ignore value - if ((idac == HV_NEW) && (*iret[idet] == -999)) - ; - else { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - } - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - if (ret == -100) - ret = -1; - - return ret; -} - -dacs_t multiSlsDetector::getADC(dacIndex idac, int imod) { - dacs_t ret = -100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 && id >= (int)detectors.size()) - return -1; - ret = detectors[id]->getADC(idac, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int posmin = 0, posmax = detectors.size(); - dacs_t* iret[posmax - posmin]; - - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new dacs_t(-1); - Task* task = new Task(new func2_t(&slsDetector::getADC, - detectors[idet], idac, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (detectors[idet]) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - return ret; -} - - -slsDetectorDefs::externalCommunicationMode multiSlsDetector::setExternalCommunicationMode( - externalCommunicationMode pol) { - externalCommunicationMode ret, ret1; - //(Dhanya) FIXME: why first detector or is it the master one? - if (detectors.size()) - ret = detectors[0]->setExternalCommunicationMode(pol); - if (detectors[0]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << 0)); - - for (unsigned int idet = 1; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setExternalCommunicationMode(pol); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret != ret1) - ret = GET_EXTERNAL_COMMUNICATION_MODE; - } - setMaster(); - setSynchronization(); - return ret; -} - -slsDetectorDefs::externalSignalFlag multiSlsDetector::setExternalSignalFlags( - externalSignalFlag pol, int signalindex) { - externalSignalFlag ret, ret1; - //(Dhanya) FIXME: why first detector or is it the master one? - if (detectors.size()) - ret = detectors[0]->setExternalSignalFlags(pol, signalindex); - if (detectors[0]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << 0)); - - for (unsigned int idet = 1; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setExternalSignalFlags(pol, signalindex); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret != ret1) - ret = GET_EXTERNAL_SIGNAL_FLAG; - } - setMaster(); - setSynchronization(); - return ret; -} - -int multiSlsDetector::setReadOutFlags(readOutFlags flag) { - int ret = -100, ret1; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setReadOutFlags(flag); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - - return ret; -} - - -uint32_t multiSlsDetector::writeRegister(uint32_t addr, uint32_t val) { - uint32_t ret, ret1; - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->writeRegister(addr, val); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (i == 0) - ret1 = ret; - else if (ret != ret1) { - // not setting it to -1 as it is a possible value - std::cout << "Error: Different Values for function writeRegister [" - << ret << "," << ret1 << "]" << endl; - setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); - } - } - - return ret1; -} - - -uint32_t multiSlsDetector::readRegister(uint32_t addr) { - uint32_t ret, ret1; - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->readRegister(addr); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (i == 0) - ret1 = ret; - else if (ret != ret1) { - // not setting it to -1 as it is a possible value - std::cout << "Error: Different Values for function readRegister [" - << ret << "," << ret1 << "]" << endl; - setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); - } - } - - return ret1; -} - - - - -uint32_t multiSlsDetector::setBit(uint32_t addr, int n) { - uint32_t ret, ret1; - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret1 = detectors[i]->setBit(addr, n); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (i == 0) - ret = ret1; - else if (ret != ret1) { - // not setting it to -1 as it is a possible value - std::cout << "Error: Different Values for function setBit [" - << ret << "," << ret1 << "]" << endl; - setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); - } - } - - return ret; -} - -uint32_t multiSlsDetector::clearBit(uint32_t addr, int n) { - uint32_t ret, ret1; - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret1 = detectors[i]->clearBit(addr, n); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (i == 0) - ret = ret1; - else if (ret != ret1) { - // not setting it to -1 as it is a possible value - std::cout << "Error: Different Values for function clearBit [" - << ret << "," << ret1 << "]" << endl; - setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); - } - } - - return ret; -} - -std::string multiSlsDetector::setNetworkParameter(networkParameter p, std::string s) { - - if (s.find('+') == std::string::npos) { - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return getNetworkParameter(p); - } else { - std::string* sret[detectors.size()]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (p == RECEIVER_STREAMING_PORT || p == CLIENT_STREAMING_PORT) - s.append("multi\0"); - sret[idet] = new std::string("error"); - Task* task = new Task(new func2_t(&slsDetector::setNetworkParameter, - detectors[idet], p, s, sret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (sret[idet] != NULL) - delete sret[idet]; - //doing nothing with the return values - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - } else { - size_t p1 = 0; - size_t p2 = s.find('+', p1); - int id = 0; - while (p2 != std::string::npos) { - detectors[id]->setNetworkParameter(p, s.substr(p1, p2 - p1)); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - ++id; - s = s.substr(p2 + 1); - p2 = s.find('+'); - if (id >= (int)detectors.size()) - break; - } - } - - return getNetworkParameter(p); -} - -std::string multiSlsDetector::getNetworkParameter(networkParameter p) { - std::string s0 = "", s1 = "", s; - std::string ans = ""; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - s = detectors[idet]->getNetworkParameter(p); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - if (s0 == "") - s0 = s + std::string("+"); - else - s0 += s + std::string("+"); - - if (s1 == "") - s1 = s; - else if (s1 != s) - s1 = "bad"; - } - if (s1 == "bad") - ans = s0; - else - ans = s1; - return ans; -} - -int multiSlsDetector::digitalTest(digitalTestMode mode, int imod) { - - int id, im, ret; - - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->digitalTest(mode, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - - return -1; -} - -int multiSlsDetector::executeTrimming(trimMode mode, int par1, int par2, int imod) { - int ret = 100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->executeTrimming(mode, par1, par2, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int* iret[detectors.size()]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iret[idet] = new int(-1); - Task* task = new Task(new func4_t(&slsDetector::executeTrimming, - detectors[idet], mode, par1, par2, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - - return ret; -} - - -int multiSlsDetector::loadImageToDetector(imageType index, std::string const fname) { - - int ret = -100, ret1; - short int imageVals[thisMultiDetector->numberOfChannels]; - - std::ifstream infile; - infile.open(fname.c_str(), std::ios_base::in); - if (infile.is_open()) { -#ifdef VERBOSE - std::cout << std::endl - << "Loading "; - if (!index) - std::cout << "Dark"; - else - std::cout << "Gain"; - std::cout << " image from file " << fname << std::endl; -#endif - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (detectors[idet]->readDataFile(infile, imageVals) >= 0) { - ret1 = detectors[idet]->sendImageToDetector(index, imageVals); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - infile.close(); - } else { - std::cout << "Could not open file " << fname << std::endl; - return -1; - } - return ret; -} - -int multiSlsDetector::writeCounterBlockFile(std::string const fname, int startACQ) { - int ret = OK, ret1 = OK; - short int arg[thisMultiDetector->numberOfChannels]; - std::ofstream outfile; - outfile.open(fname.c_str(), std::ios_base::out); - if (outfile.is_open()) { -#ifdef VERBOSE - std::cout << std::endl - << "Reading Counter to \"" << fname; - if (startACQ == 1) - std::cout << "\" and Restarting Acquisition"; - std::cout << std::endl; -#endif - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->getCounterBlock(arg, startACQ); - if (ret1 != OK) - ret = FAIL; - else { - ret1 = detectors[idet]->writeDataFile(outfile, arg); - if (ret1 != OK) - ret = FAIL; - } - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - outfile.close(); - } else { - std::cout << "Could not open file " << fname << std::endl; - return -1; - } - return ret; -} - -int multiSlsDetector::resetCounterBlock(int startACQ) { - return callDetectorMember(&slsDetector::resetCounterBlock, startACQ); -} - -int multiSlsDetector::setCounterBit(int i) { - return callDetectorMember(&slsDetector::setCounterBit, i); -} - -void multiSlsDetector::verifyMinMaxROI(int n, ROI r[]) { - int temp; - for (int i = 0; i < n; ++i) { - if ((r[i].xmax) < (r[i].xmin)) { - temp = r[i].xmax; - r[i].xmax = r[i].xmin; - r[i].xmin = temp; - } - if ((r[i].ymax) < (r[i].ymin)) { - temp = r[i].ymax; - r[i].ymax = r[i].ymin; - r[i].ymin = temp; - } - } -} - -int multiSlsDetector::setROI(int n, ROI roiLimits[], int imod) { - if (imod > 0 && imod < (int)detectors.size()) { - return detectors[imod]->setROI(n, roiLimits, imod); - } - int ret1 = -100, ret; - int i, xmin, xmax, ymin, ymax, channelX, channelY, idet, lastChannelX, - lastChannelY, index, offsetX, offsetY; - bool invalidroi = false; - int ndet = detectors.size(); - ROI allroi[ndet][n]; - int nroi[ndet]; - for (i = 0; i < ndet; ++i) - nroi[i] = 0; - - if ((n < 0) || (roiLimits == NULL)) - return FAIL; - - //ensures min < max - verifyMinMaxROI(n, roiLimits); -#ifdef VERBOSE - cout << "Setting ROI for " << n << "rois:" << endl; - for (i = 0; i < n; ++i) - cout << i << ":" << roiLimits[i].xmin << "\t" << roiLimits[i].xmax - << "\t" << roiLimits[i].ymin << "\t" << roiLimits[i].ymax << endl; -#endif - //for each roi - for (i = 0; i < n; ++i) { - xmin = roiLimits[i].xmin; - xmax = roiLimits[i].xmax; - ymin = roiLimits[i].ymin; - ymax = roiLimits[i].ymax; - - //check roi max values - idet = decodeNChannel(xmax, ymax, channelX, channelY); -#ifdef VERBOSE - cout << "Decoded Channel max vals: " << endl; - cout << "det:" << idet << "\t" << xmax << "\t" << ymax << "\t" - << channelX << "\t" << channelY << endl; -#endif - if (idet == -1) { - cout << "invalid roi" << endl; - continue; - } - - //split in x dir - while (xmin <= xmax) { - invalidroi = false; - ymin = roiLimits[i].ymin; - //split in y dir - while (ymin <= ymax) { - //get offset for each detector - idet = decodeNChannel(xmin, ymin, channelX, channelY); -#ifdef VERBOSE - cout << "Decoded Channel min vals: " << endl; - cout << "det:" << idet << "\t" << xmin << "\t" << ymin - << "\t" << channelX << "\t" << channelY << endl; -#endif - if (idet < 0 || idet >= (int)detectors.size()) { - cout << "invalid roi" << endl; - invalidroi = true; - break; - } - //get last channel for each det in x and y dir - lastChannelX = (detectors[idet]->getMaxNumberOfChannelsInclGapPixels(X)) - 1; - lastChannelY = (detectors[idet]->getMaxNumberOfChannelsInclGapPixels(Y)) - 1; - - offsetX = detectors[idet]->getDetectorOffset(X); - offsetY = detectors[idet]->getDetectorOffset(Y); - //at the end in x dir - if ((offsetX + lastChannelX) >= xmax) - lastChannelX = xmax - offsetX; - //at the end in y dir - if ((offsetY + lastChannelY) >= ymax) - lastChannelY = ymax - offsetY; - -#ifdef VERBOSE - cout << "lastChannelX:" << lastChannelX << "\t" - << "lastChannelY:" << lastChannelY << endl; -#endif - - //creating the list of roi for corresponding detector - index = nroi[idet]; - allroi[idet][index].xmin = channelX; - allroi[idet][index].xmax = lastChannelX; - allroi[idet][index].ymin = channelY; - allroi[idet][index].ymax = lastChannelY; - nroi[idet] = nroi[idet] + 1; - - ymin = lastChannelY + offsetY + 1; - if ((lastChannelY + offsetY) == ymax) - ymin = ymax + 1; - -#ifdef VERBOSE - cout << "nroi[idet]:" << nroi[idet] << "\tymin:" << ymin << endl; -#endif - - } - if (invalidroi) - break; - - xmin = lastChannelX + offsetX + 1; - if ((lastChannelX + offsetX) == xmax) - xmin = xmax + 1; - } - } - -#ifdef VERBOSE - cout << "Setting ROI :" << endl; - for (i = 0; i < detectors.size(); ++i) { - cout << "detector " << i << endl; - for (int j = 0; j < nroi[i]; ++j) { - cout << allroi[i][j].xmin << "\t" << allroi[i][j].xmax << "\t" - << allroi[i][j].ymin << "\t" << allroi[i][j].ymax << endl; - } - } -#endif - - //settings the rois for each detector - for (unsigned i = 0; i < detectors.size(); ++i) { -#ifdef VERBOSE - cout << "detector " << i << ":" << endl; -#endif - ret = detectors[i]->setROI(nroi[i], allroi[i]); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 == -100) - ret1 = ret; - else - ret1 = FAIL; - } - - return ret1; -} - - -slsDetectorDefs::ROI* multiSlsDetector::getROI(int& n, int imod) { - if (imod > 0 && imod < (int)detectors.size()) { - return detectors[imod]->getROI(n, imod); - } - n = 0; - int num = 0, i, j; - int ndet = detectors.size(); - int maxroi = ndet * MAX_ROIS; - ROI temproi; - ROI roiLimits[maxroi]; - ROI* retval = new ROI[maxroi]; - ROI* temp = 0; - int index = 0; - - //get each detector's roi array - for (unsigned i = 0; i < detectors.size(); ++i) { - temp = detectors[i]->getROI(index); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - - if (temp) { - //#ifdef VERBOSE - if (index) - cout << "detector " << i << ":" << endl; - //#endif - for (j = 0; j < index; ++j) { - //#ifdef VERBOSE - cout << temp[j].xmin << "\t" << temp[j].xmax << "\t" - << temp[j].ymin << "\t" << temp[j].ymax << endl; - //#endif - int x = detectors[i]->getDetectorOffset(X); - int y = detectors[i]->getDetectorOffset(Y); - roiLimits[n].xmin = temp[j].xmin + x; - roiLimits[n].xmax = temp[j].xmax + x; - roiLimits[n].ymin = temp[j].ymin + y; - roiLimits[n].ymax = temp[j].ymin + y; - ++n; - } - } - } - - //empty roi - if (!n) - return NULL; - -#ifdef VERBOSE - cout << "ROI :" << endl; - for (int j = 0; j < n; ++j) { - cout << roiLimits[j].xmin << "\t" << roiLimits[j].xmax << "\t" - << roiLimits[j].ymin << "\t" << roiLimits[j].ymax << endl; - } -#endif - - //combine all the adjacent rois in x direction - for (i = 0; i < n; ++i) { - //since the ones combined are replaced by -1 - if ((roiLimits[i].xmin) == -1) - continue; - for (j = i + 1; j < n; ++j) { - //since the ones combined are replaced by -1 - if ((roiLimits[j].xmin) == -1) - continue; - //if y values are same - if (((roiLimits[i].ymin) == (roiLimits[j].ymin)) && - ((roiLimits[i].ymax) == (roiLimits[j].ymax))) { - //if adjacent, increase [i] range and replace all [j] with -1 - if ((roiLimits[i].xmax) + 1 == roiLimits[j].xmin) { - roiLimits[i].xmax = roiLimits[j].xmax; - roiLimits[j].xmin = -1; - roiLimits[j].xmax = -1; - roiLimits[j].ymin = -1; - roiLimits[j].ymax = -1; - } - //if adjacent, increase [i] range and replace all [j] with -1 - else if ((roiLimits[i].xmin) - 1 == roiLimits[j].xmax) { - roiLimits[i].xmin = roiLimits[j].xmin; - roiLimits[j].xmin = -1; - roiLimits[j].xmax = -1; - roiLimits[j].ymin = -1; - roiLimits[j].ymax = -1; - } - } - } - } - -#ifdef VERBOSE - cout << "Combined along x axis Getting ROI :" << endl; - cout << "detector " << i << endl; - for (int j = 0; j < n; ++j) { - cout << roiLimits[j].xmin << "\t" << roiLimits[j].xmax << "\t" - << roiLimits[j].ymin << "\t" << roiLimits[j].ymax << endl; - } -#endif - - //combine all the adjacent rois in y direction - for (i = 0; i < n; ++i) { - //since the ones combined are replaced by -1 - if ((roiLimits[i].ymin) == -1) - continue; - for (j = i + 1; j < n; ++j) { - //since the ones combined are replaced by -1 - if ((roiLimits[j].ymin) == -1) - continue; - //if x values are same - if (((roiLimits[i].xmin) == (roiLimits[j].xmin)) && - ((roiLimits[i].xmax) == (roiLimits[j].xmax))) { - //if adjacent, increase [i] range and replace all [j] with -1 - if ((roiLimits[i].ymax) + 1 == roiLimits[j].ymin) { - roiLimits[i].ymax = roiLimits[j].ymax; - roiLimits[j].xmin = -1; - roiLimits[j].xmax = -1; - roiLimits[j].ymin = -1; - roiLimits[j].ymax = -1; - } - //if adjacent, increase [i] range and replace all [j] with -1 - else if ((roiLimits[i].ymin) - 1 == roiLimits[j].ymax) { - roiLimits[i].ymin = roiLimits[j].ymin; - roiLimits[j].xmin = -1; - roiLimits[j].xmax = -1; - roiLimits[j].ymin = -1; - roiLimits[j].ymax = -1; - } - } - } - } - - // get rid of -1s - for (i = 0; i < n; ++i) { - if ((roiLimits[i].xmin) != -1) { - retval[num] = roiLimits[i]; - ++num; - } - } - //sort final roi - for (i = 0; i < num; ++i) { - for (j = i + 1; j < num; ++j) { - if (retval[j].xmin < retval[i].xmin) { - temproi = retval[i]; - retval[i] = retval[j]; - retval[j] = temproi; - } - } - } - n = num; - - cout << "\nxmin\txmax\tymin\tymax" << endl; - for (i = 0; i < n; ++i) - cout << retval[i].xmin << "\t" << retval[i].xmax << "\t" - << retval[i].ymin << "\t" << retval[i].ymax << endl; - return retval; -} - -int multiSlsDetector::writeAdcRegister(int addr, int val) { - - int ret, ret1 = -100; - - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->writeAdcRegister(addr, val); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 == -100) - ret1 = ret; - else if (ret != ret1) { - // not setting it to -1 as it is a possible value - std::cout << "Error: Different Values for function " - "writeAdcRegister [" << ret << "," << ret1 << "]" << endl; - setErrorMask(getErrorMask() | MULTI_HAVE_DIFFERENT_VALUES); - } - } - - return ret1; -} - -int multiSlsDetector::activate(int const enable) { - return callDetectorMember(&slsDetector::activate, enable); -} - -int multiSlsDetector::setDeactivatedRxrPaddingMode(int padding) { - return callDetectorMember(&slsDetector::setDeactivatedRxrPaddingMode, padding); -} - -int multiSlsDetector::getFlippedData(dimension d) { - return callDetectorMember(&slsDetector::getFlippedData, d); -} - -int multiSlsDetector::setFlippedData(dimension d, int value) { - return callDetectorMember(&slsDetector::setFlippedData, d, value); -} - -int multiSlsDetector::setAllTrimbits(int val, int imod) { - int ret = -100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->setAllTrimbits(val, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - int* iret[detectors.size()]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iret[idet] = new int(-1); - Task* task = new Task(new func2_t(&slsDetector::setAllTrimbits, - detectors[idet], val, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return ret; -} - - -int multiSlsDetector::enableGapPixels(int val) { - if (val > 0 && getDetectorsType() != EIGER) { - std::cout << "Not implemented for this detector" << std::endl; - val = -1; - } - int ret = callDetectorMember(&slsDetector::enableGapPixels, val); - - if (val != -1) { - // update data bytes incl gap pixels - thisMultiDetector->dataBytesInclGapPixels = 0; - for (unsigned int i = 0; i < detectors.size(); ++i) { - thisMultiDetector->dataBytesInclGapPixels += - detectors[i]->getDataBytesInclGapPixels(); - } - // update offsets and number of channels incl gap pixels in multi level - updateOffsets(); - } - return ret; -} - -int multiSlsDetector::setTrimEn(int ne, int* ene) { - int ret = -100, ret1; - int* ene1 = 0; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setTrimEn(ne, ene); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - - if (ene != NULL) { - if (ene1 == 0) { - ene1 = new int[ret1]; - for (int i = 0; i < ret1; ++i){ - ene1[i] = ene[i]; - } - }else if (ret != -1) { - // only check if it is not already a fail - for (int i = 0; i < ret; ++i){ - if (ene1[i] != ene[i]) - ret = -1; - } - } - } - } - return ret; -} - -int multiSlsDetector::getTrimEn(int* ene) { - int ret = -100, ret1; - int* ene1 = 0; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->getTrimEn(ene); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - - if (ene != NULL) { - if (ene1 == 0) { - ene1 = new int[ret1]; - for (int i = 0; i < ret1; ++i){ - ene1[i] = ene[i]; - } - }else if (ret != -1) { - // only check if it is not already a fail - for (int i = 0; i < ret; ++i){ - if (ene1[i] != ene[i]) - ret = -1; - } - } - } - } - - if (ene1) - delete [] ene1; - return ret; -} - -int multiSlsDetector::pulsePixel(int n, int x, int y) { - return parallelCallDetectorMember(&slsDetector::pulsePixel, n, x, y); -} - -int multiSlsDetector::pulsePixelNMove(int n, int x, int y) { - return parallelCallDetectorMember(&slsDetector::pulsePixelNMove, n, x, y); -} - -int multiSlsDetector::pulseChip(int n) { - return parallelCallDetectorMember(&slsDetector::pulseChip, n); -} - -int multiSlsDetector::setThresholdTemperature(int val, int imod) { - int ret = -100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->setThresholdTemperature(val, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int posmin = 0, posmax = detectors.size(); - int* iret[posmax - posmin]; - - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new dacs_t(-1); - Task* task = new Task(new func2_t(&slsDetector::setThresholdTemperature, - detectors[idet], val, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - - return ret; -} - -int multiSlsDetector::setTemperatureControl(int val, int imod) { - int ret = -100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->setTemperatureControl(val, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int posmin = 0, posmax = detectors.size(); - int* iret[posmax - posmin]; - - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new dacs_t(-1); - Task* task = new Task(new func2_t(&slsDetector::setTemperatureControl, - detectors[idet], val, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - - return ret; -} - -int multiSlsDetector::setTemperatureEvent(int val, int imod) { - int ret = -100; - - // single - { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - ret = detectors[id]->setTemperatureEvent(val, im); - if (detectors[id]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << id)); - return ret; - } - } - - // multi - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } - - int posmin = 0, posmax = detectors.size(); - int* iret[posmax - posmin]; - - for (int idet = posmin; idet < posmax; ++idet) { - iret[idet] = new dacs_t(-1); - Task* task = new Task(new func2_t(&slsDetector::setTemperatureEvent, - detectors[idet], val, imod, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (ret == -100) - ret = *iret[idet]; - else if (ret != *iret[idet]) - ret = -1; - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - - return ret; -} - -int multiSlsDetector::setStoragecellStart(int pos) { - return parallelCallDetectorMember(&slsDetector::setStoragecellStart, pos); -} - -int multiSlsDetector::programFPGA(std::string fname) { - int ret = OK, ret1 = OK; - - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->programFPGA(fname); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret == FAIL) - ret1 = FAIL; - } - return ret1; -} - -int multiSlsDetector::resetFPGA() { - int ret = OK, ret1 = OK; - - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->resetFPGA(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret == FAIL) - ret1 = FAIL; - } - return ret1; -} - -int multiSlsDetector::powerChip(int ival) { - int ret = OK, ret1 = OK; - - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->powerChip(ival); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret == FAIL) - ret1 = FAIL; - } - return ret1; -} - -int multiSlsDetector::setAutoComparatorDisableMode(int ival) { - int ret = OK, ret1 = OK; - - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret = detectors[i]->setAutoComparatorDisableMode(ival); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret == FAIL) - ret1 = FAIL; - } - return ret1; -} - -double multiSlsDetector::getScanStep(int index, int istep) { - return thisMultiDetector->scanSteps[index][istep]; -} - -int multiSlsDetector::getChanRegs(double* retval, bool fromDetector) { - //nChansDet and currentNumChans is because of varying channel size per detector - int n = thisMultiDetector->numberOfChannels, nChansDet, currentNumChans = 0; - double retval1[n]; - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - nChansDet = detectors[idet]->getChanRegs(retval1, fromDetector); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - memcpy(retval + (currentNumChans), retval1, nChansDet * sizeof(double)); - currentNumChans += nChansDet; - } - return n; -} - - - -int multiSlsDetector::setChannel(int64_t reg, int ichan, int ichip, int imod) { - int ret, ret1 = -100; - int id = -1, im = -1; - int dmi = 0, dma = detectors.size(); - - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - dmi = id; - dma = id + 1; - } - for (int idet = dmi; idet < dma; ++idet) { - ret = detectors[idet]->setChannel(reg, ichan, ichip, im); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret1 == -100) - ret1 = ret; - else if (ret != ret1) - ret1 = -1; - } - return ret1; -} - -int multiSlsDetector::getMoveFlag(int imod) { - int id = -1, im = -1; - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return -1; - return detectors[id]->getMoveFlag(im); - } - - //default!!! - return 1; -} - -int multiSlsDetector::fillModuleMask(int* mM) { - int imod = 0, off = 0; - if (mM) { - for (unsigned int i = 0; i < detectors.size(); ++i) { - for (int im = 0; im < detectors[i]->getNMods(); ++im) { - mM[imod] = im + off; - ++imod; - } - off += detectors[i]->getMaxMods(); - } - } - return getNMods(); -} - - -int multiSlsDetector::calibratePedestal(int frames) { - return callDetectorMember(&slsDetector::calibratePedestal, frames); -} - - -int multiSlsDetector::setRateCorrection(double t) { - -#ifdef VERBOSE - std::cout << "Setting rate correction with dead time " << - thisMultiDetector->tDead << std::endl; -#endif - int ret = OK; - int posmax = detectors.size(); - - // eiger return value is ok/fail - if (getDetectorsType() == EIGER) { - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax]; - for (int idet = 0; idet < posmax; ++idet) { - iret[idet] = new int(OK); - Task* task = new Task(new func1_t - (&slsDetector::setRateCorrection, - detectors[idet], t, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = 0; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - return ret; - } - - // mythen, others - if (t == 0) { - thisMultiDetector->correctionMask &= ~(1 << RATE_CORRECTION); - return thisMultiDetector->correctionMask & (1 << RATE_CORRECTION); - } else - thisMultiDetector->correctionMask |= (1 << RATE_CORRECTION); - - ret = -100; - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - int* iret[posmax]; - for (int idet = 0; idet < posmax; ++idet) { - iret[idet] = new int(-1); - Task* task = new Task(new func1_t - (&slsDetector::setRateCorrection, - detectors[idet], t, iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = 0; idet < posmax; ++idet) { - if (iret[idet] != NULL) - delete iret[idet]; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - return thisMultiDetector->correctionMask & (1 << RATE_CORRECTION); -} - -int multiSlsDetector::getRateCorrection(double& t) { - if (getDetectorsType() == EIGER) { - t = getRateCorrectionTau(); - return t; - } - - if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { -#ifdef VERBOSE - std::cout << "Rate correction is enabled with dead time " << - thisMultiDetector->tDead << std::endl; -#endif - return 1; - } else - t = 0; -#ifdef VERBOSE - std::cout << "Rate correction is disabled " << std::endl; -#endif - return 0; -} - -double multiSlsDetector::getRateCorrectionTau() { - - double ret = -100.0; - int posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - double* iret[posmax]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iret[idet] = new double(-1); - Task* task = new Task(new func0_t - (&slsDetector::getRateCorrectionTau, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - - for (int idet = 0; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (ret == -100.0) - ret = *iret[idet]; - else if ((ret - *iret[idet]) > 0.000000001) { - std::cout << "Rate correction is different for " - "different readouts " << std::endl; - ret = -1; - } - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - if (getDetectorsType() == EIGER) - return ret; - - //only mythen - if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { -#ifdef VERBOSE - std::cout << "Rate correction is enabled with dead time " << - thisMultiDetector->tDead << std::endl; -#endif - } else { -#ifdef VERBOSE - std::cout << "Rate correction is disabled " << std::endl; -#endif - ret = 0; - } - return ret; -} - -int multiSlsDetector::getRateCorrection() { - if (getDetectorsType() == EIGER) { - return getRateCorrectionTau(); - } - if (thisMultiDetector->correctionMask & (1 << RATE_CORRECTION)) { - return 1; - } else - return 0; -}; - -int multiSlsDetector::rateCorrect(double* datain, double* errin, double* dataout, double* errout) { - int ichdet = 0; - double* perr = errin; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (errin) - perr += ichdet; - detectors[idet]->rateCorrect(datain + ichdet, perr, dataout + ichdet, - errout + ichdet); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - ichdet += detectors[idet]->getTotalNumberOfChannels(); - } - return 0; -} - - -int multiSlsDetector::setFlatFieldCorrection(std::string fname) { - double* data = new double[thisMultiDetector->numberOfChannels]; - double* ffcoefficients = new double[thisMultiDetector->numberOfChannels]; - double* fferrors = new double[thisMultiDetector->numberOfChannels]; - char ffffname[MAX_STR_LENGTH * 2]; - int nch; - if (fname == "default") { - fname = std::string(thisMultiDetector->flatFieldFile); - } - - thisMultiDetector->correctionMask &= ~(1 << FLAT_FIELD_CORRECTION); - - if (fname == "") { -#ifdef VERBOSE - std::cout << "disabling flat field correction" << std::endl; -#endif - thisMultiDetector->correctionMask &= ~(1 << FLAT_FIELD_CORRECTION); - for (unsigned int i = 0; i < detectors.size(); ++i) { - detectors[i]->setFlatFieldCorrection(NULL, NULL); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - } - } else { -#ifdef VERBOSE - std::cout << "Setting flat field correction from file " << fname << std::endl; -#endif - sprintf(ffffname, "%s/%s", thisMultiDetector->flatFieldDir, fname.c_str()); - nch = readDataFile(std::string(ffffname), data); - - if (nch > thisMultiDetector->numberOfChannels) - nch = thisMultiDetector->numberOfChannels; - - if (nch > 0) { - - int nm = getNMods(); - int chpm[nm]; - int mMask[nm]; - for (int i = 0; i < nm; ++i) { - chpm[i] = getChansPerMod(i); - mMask[i] = i; - } - fillModuleMask(mMask); - fillBadChannelMask(); - if ((postProcessingFuncs::calculateFlatField(&nm, chpm, mMask, - badChannelMask, data, ffcoefficients, fferrors)) >= 0) { - strcpy(thisMultiDetector->flatFieldFile, fname.c_str()); - - thisMultiDetector->correctionMask |= (1 << FLAT_FIELD_CORRECTION); - - setFlatFieldCorrection(ffcoefficients, fferrors); - - } else - std::cout << "Calculated flat field from file " << fname << - " is not valid " << nch << std::endl; - } else { - std::cout << "Flat field from file " << fname << " is not valid " - << nch << std::endl; - } - } - return thisMultiDetector->correctionMask & (1 << FLAT_FIELD_CORRECTION); -} - - -int multiSlsDetector::setFlatFieldCorrection(double* corr, double* ecorr) { - int ichdet = 0; - double *p, *ep; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (corr != NULL) - p = corr + ichdet; - else - p = NULL; - if (ecorr != NULL) - ep = ecorr + ichdet; - else - ep = NULL; - detectors[idet]->setFlatFieldCorrection(p, ep); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - ichdet += detectors[idet]->getTotalNumberOfChannels(); - } - return 0; -} - -int multiSlsDetector::getFlatFieldCorrection(double* corr, double* ecorr) { - int ichdet = 0; - double *p, *ep; - int ff = 1, dff; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - if (corr != NULL) - p = corr + ichdet; - else - p = NULL; - if (ecorr != NULL) - ep = ecorr + ichdet; - else - ep = NULL; - dff = detectors[idet]->getFlatFieldCorrection(p, ep); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (dff == 0) - ff = 0; - ichdet += detectors[idet]->getTotalNumberOfChannels(); - } - return ff; -} - -int multiSlsDetector::flatFieldCorrect(double* datain, double* errin, double* dataout, - double* errout) { - int ichdet = 0; - double* perr = errin; //*pdata, - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { -#ifdef VERBOSE - cout << " detector " << idet << " offset " << ichdet << endl; -#endif - if (errin) - perr += ichdet; - detectors[idet]->flatFieldCorrect(datain + ichdet, perr, - dataout + ichdet, errout + ichdet); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - ichdet += detectors[idet]->getTotalNumberOfChannels(); - } - return 0; -} - -int multiSlsDetector::setBadChannelCorrection(std::string fname) { - int badlist[MAX_BADCHANS]; - int nbad = 0; - int ret = 0; - - cout << thisMultiDetector->badChanFile << endl; - - if (fname == "default") - fname = std::string(thisMultiDetector->badChanFile); - - ret = setBadChannelCorrection(fname, nbad, badlist); - //#ifdef VERBOSE - cout << "multi: file contained " << ret << " badchans" << endl; - //#endif - if (ret == 0) { - thisMultiDetector->correctionMask &= ~(1 << DISCARD_BAD_CHANNELS); - nbad = 0; - } else { - thisMultiDetector->correctionMask |= (1 << DISCARD_BAD_CHANNELS); - strcpy(thisMultiDetector->badChanFile, fname.c_str()); - } - - return setBadChannelCorrection(nbad, badlist, 0); -} - -int multiSlsDetector::setBadChannelCorrection(int nbad, int* badlist, int ff) { - int badlistdet[MAX_BADCHANS]; - int nbaddet = 0, choff = 0, idet = 0; - if (nbad < 1) - badlistdet[0] = 0; - else - badlistdet[0] = badlist[0]; - - if (nbad > 0) { - thisMultiDetector->correctionMask |= (1 << DISCARD_BAD_CHANNELS); - - for (int ich = 0; ich < nbad; ++ich) { - if ((badlist[ich] - choff) >= detectors[idet]->getMaxNumberOfChannels()) { - //#ifdef VERBOSE - cout << "setting " << nbaddet << " badchans to detector " - << idet << endl; - //#endif - detectors[idet]->setBadChannelCorrection(nbaddet, badlistdet, 0); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - choff += detectors[idet]->getMaxNumberOfChannels(); - nbaddet = 0; - ++idet; - if (detectors[idet] == NULL) - break; - } - badlistdet[nbaddet] = (badlist[ich] - choff); - ++nbaddet; -#ifdef VERBOSE - cout << nbaddet << " " << badlist[ich] << " " - << badlistdet[nbaddet - 1] << endl; -#endif - } - if (nbaddet > 0) { -#ifdef VERBOSE - cout << "setting " << nbaddet << " badchans to detector " - << idet << endl; -#endif - detectors[idet]->setBadChannelCorrection(nbaddet, badlistdet, 0); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - choff += detectors[idet]->getMaxNumberOfChannels(); - nbaddet = 0; - ++idet; - } - nbaddet = 0; - for (unsigned int i = idet; i < detectors.size(); ++i) { -#ifdef VERBOSE - cout << "setting " << 0 << " badchans to detector " << i << endl; -#endif - detectors[i]->setBadChannelCorrection(nbaddet, badlistdet, 0); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - } - - } else { - nbaddet = 0; - for (unsigned int i = 0; i < detectors.size(); ++i) { -#ifdef VERBOSE - cout << "setting " << 0 << " badchans to detector " << idet << endl; -#endif - detectors[idet]->setBadChannelCorrection(nbaddet, badlistdet, 0); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - thisMultiDetector->correctionMask &= ~(1 << DISCARD_BAD_CHANNELS); - } -#ifdef VERBOSE - cout << (thisMultiDetector->correctionMask & (1 << DISCARD_BAD_CHANNELS)) << endl; -#endif - return thisMultiDetector->correctionMask & (1 << DISCARD_BAD_CHANNELS); -} - - -int multiSlsDetector::getBadChannelCorrection(int* bad) { - //int ichan; - int *bd, nd, ntot = 0, choff = 0; - ; - - if (((thisMultiDetector->correctionMask) & (1 << DISCARD_BAD_CHANNELS)) == 0) - return 0; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - nd = detectors[idet]->getBadChannelCorrection(); - if (nd > 0) { - bd = new int[nd]; - nd = detectors[idet]->getBadChannelCorrection(bd); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - - for (int id = 0; id < nd; ++id) { - if (bd[id] < detectors[idet]->getTotalNumberOfChannels()) { - if (bad) - bad[ntot] = choff + bd[id]; - ++ntot; - } - } - choff += detectors[idet]->getTotalNumberOfChannels(); - delete[] bd; - } else - ntot += nd; - } - return ntot; -} - - -int multiSlsDetector::readAngularConversionFile(std::string fname) { - - std::ifstream infile; - //int nm=0; - infile.open(fname.c_str(), std::ios_base::in); - if (infile.is_open()) { - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { -#ifdef VERBOSE - cout << " detector " << idet << endl; -#endif - detectors[idet]->readAngularConversion(infile); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - infile.close(); - } else { - std::cout << "Could not open calibration file " << fname << std::endl; - return -1; - } - return 0; -} - -int multiSlsDetector::writeAngularConversion(std::string fname) { - - std::ofstream outfile; - // int nm=0; - outfile.open(fname.c_str(), std::ios_base::out); - if (outfile.is_open()) { - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - detectors[idet]->writeAngularConversion(outfile); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - outfile.close(); - } else { - std::cout << "Could not open calibration file " << fname << std::endl; - return -1; - } - return 0; -} - -int multiSlsDetector::getAngularConversion(int& direction, angleConversionConstant* angconv) { - - int dir = -100, dir1; - angleConversionConstant* a1 = angconv; - - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - detectors[idet]->getAngularConversion(dir1, a1); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (dir == -100) - dir = dir1; - if (dir != dir1) - dir = 0; - if (angconv) { - a1 += detectors[idet]->getNMods(); - } - } - direction = dir; - - if (thisMultiDetector->correctionMask & (1 << ANGULAR_CONVERSION)) { - return 1; - } - return 0; -} - -double multiSlsDetector::setAngularConversionParameter(angleConversionParameter c, double v) { - double ret = slsDetectorUtils::setAngularConversionParameter(c, v); - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - detectors[idet]->setAngularConversionParameter(c, v); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - return ret; -} - -angleConversionConstant* multiSlsDetector::getAngularConversionPointer(int imod) { - int id = -1, im = -1; -#ifdef VERBOSE - cout << "get angular conversion pointer " << endl; -#endif - if (decodeNMod(imod, id, im) >= 0) { - if (id < 0 || id >= (int)detectors.size()) - return NULL; - return detectors[id]->getAngularConversionPointer(im); - } - return NULL; -} - - -int multiSlsDetector::printReceiverConfiguration() { - int ret, ret1 = -100; - std::cout << "Printing Receiver configurations for all detectors..." << std::endl; - for (unsigned int i = 0; i < detectors.size(); ++i) { - std::cout << std::endl - << "#Detector " << i << ":" << std::endl; - - ret = detectors[i]->printReceiverConfiguration(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 == -100) - ret1 = ret; - else if (ret != ret1) - ret1 = -1; - } - - return ret1; -} - - -int multiSlsDetector::setReceiverOnline(int off) { - if (off != GET_ONLINE_FLAG) { - thisMultiDetector->receiverOnlineFlag = parallelCallDetectorMember( - &slsDetector::setReceiverOnline, off); - } - return thisMultiDetector->receiverOnlineFlag; -} - -std::string multiSlsDetector::checkReceiverOnline() { - std::string retval1 = "", retval; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - retval = detectors[idet]->checkReceiverOnline(); - if (!retval.empty()) { - retval1.append(retval); - retval1.append("+"); - } - } - return retval1; -} - -int multiSlsDetector::lockReceiver(int lock) { - return callDetectorMember(&slsDetector::lockReceiver, lock); -} - -std::string multiSlsDetector::getReceiverLastClientIP() { - return callDetectorMember(&slsDetector::getReceiverLastClientIP); -} - -int multiSlsDetector::exitReceiver() { - //(Erik) logic is flawed should return fail if any fails? - int ival = FAIL, iv; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iv = detectors[idet]->exitReceiver(); - if (iv == OK) - ival = iv; - } - return ival; -} - -std::string multiSlsDetector::getFilePath() { - return setFilePath(); -} - -std::string multiSlsDetector::setFilePath(std::string s) { - - std::string ret = "errorerror", ret1; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setFilePath(s); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == "errorerror") - ret = ret1; - else if (ret != ret1) - ret = ""; - } - fileIO::setFilePath(ret); - return fileIO::getFilePath(); -} - -std::string multiSlsDetector::getFileName() { - return setFileName(); -} - -std::string multiSlsDetector::setFileName(std::string s) { - - std::string ret = "error"; - int posmax = detectors.size(); - - if (!s.empty()) { - fileIO::setFileName(s); - if (thisMultiDetector->receiverOnlineFlag == ONLINE_FLAG) - s = createReceiverFilePrefix(); - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return std::string(""); - } else { - std::string* sret[detectors.size()]; - for (int idet = 0; idet < posmax; ++idet) { - sret[idet] = new std::string("error"); - Task* task = new Task(new func1_t(&slsDetector::setFileName, - detectors[idet], s, sret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = 0; idet < posmax; ++idet) { - if (sret[idet] != NULL) { - if (ret == "error") - ret = *sret[idet]; - else if (ret != *sret[idet]) - ret = ""; - delete sret[idet]; - } else - ret = ""; - //doing nothing with the return values - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - - if ((thisMultiDetector->receiverOnlineFlag == ONLINE_FLAG) && - ((ret != "error") || (ret != ""))) { -#ifdef VERBOSE - std::cout << "Complete file prefix from receiver: " << ret << std::endl; -#endif - fileIO::setFileName(getNameFromReceiverFilePrefix(ret)); - } - - return ret; -} - -int multiSlsDetector::setReceiverFramesPerFile(int f) { - return parallelCallDetectorMember(&slsDetector::setReceiverFramesPerFile, f); -} - -slsReceiverDefs::frameDiscardPolicy multiSlsDetector::setReceiverFramesDiscardPolicy(frameDiscardPolicy f) { - return callDetectorMember(&slsDetector::setReceiverFramesDiscardPolicy, f); -} - -int multiSlsDetector::setReceiverPartialFramesPadding(int f) { - return callDetectorMember(&slsDetector::setReceiverPartialFramesPadding, f); -} - -slsReceiverDefs::fileFormat multiSlsDetector::getFileFormat() { - return setFileFormat(); -} - -slsReceiverDefs::fileFormat multiSlsDetector::setFileFormat(fileFormat f) { - return callDetectorMember(&slsDetector::setFileFormat, f); -} - -int multiSlsDetector::getFileIndex() { - return setFileIndex(); -} - -int multiSlsDetector::setFileIndex(int i) { - return parallelCallDetectorMember(&slsDetector::setFileIndex, i); -} - - -int multiSlsDetector::startReceiver() { - int i = 0; - int ret = OK; - int posmin = 0, posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition){ - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::startReceiver, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - //master - int ret1 = OK; - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->startReceiver(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - return ret; -} - -int multiSlsDetector::stopReceiver() { - int i = 0; - int ret = OK, ret1 = OK; - int posmin = 0, posmax = detectors.size(); - - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret1 = detectors[i]->stopReceiver(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (ret1 != OK) - ret = FAIL; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return FAIL; - } else { - int* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new int(OK); - Task* task = new Task(new func0_t(&slsDetector::stopReceiver, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - if (iret[idet] != NULL) { - if (*iret[idet] != OK) - ret = FAIL; - delete iret[idet]; - } else - ret = FAIL; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - return ret; -} - -slsDetectorDefs::runStatus multiSlsDetector::startReceiverReadout() { - unsigned int i = 0; - runStatus s = IDLE, s1 = IDLE; - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - s1 = detectors[i]->startReceiverReadout(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - } - for (i = 0; i < detectors.size(); ++i) { - s = detectors[i]->startReceiverReadout(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - if (s == ERROR) - s1 = ERROR; - if (s != IDLE) - s1 = s; - } - - return s1; -} - -slsDetectorDefs::runStatus multiSlsDetector::getReceiverStatus() { - int i = 0; - runStatus ret = IDLE; - int posmin = 0, posmax = detectors.size(); - - i = thisMultiDetector->masterPosition; - if (thisMultiDetector->masterPosition >= 0) { - ret = detectors[i]->getReceiverStatus(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - return ret; - } - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return ERROR; - } else { - runStatus* iret[posmax - posmin]; - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition) { - iret[idet] = new runStatus(ERROR); - Task* task = new Task(new func0_t(&slsDetector::getReceiverStatus, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - for (int idet = posmin; idet < posmax; ++idet) { - if (idet != thisMultiDetector->masterPosition){ - if (iret[idet] != NULL) { - if (*iret[idet] == (int)ERROR) - ret = ERROR; - if (*iret[idet] != IDLE) - ret = *iret[idet]; - delete iret[idet]; - } else - ret = ERROR; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - } - - return ret; -} - -int multiSlsDetector::getFramesCaughtByAnyReceiver() { - int ret = 0; - int i = thisMultiDetector->masterPosition; - if (i >= 0) { - ret = detectors[i]->getFramesCaughtByReceiver(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - // return master receivers frames caught - return ret; - } - - // return the first one that works - if (detectors.size()) { - ret = detectors[0]->getFramesCaughtByReceiver(); - if (detectors[0]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - return ret; - } - - return -1; -} - -int multiSlsDetector::getFramesCaughtByReceiver() { - - int ret = 0, ret1 = 0; - int posmax = detectors.size(); - - if (!threadpool) { - cout << "Error in creating threadpool. Exiting" << endl; - return -1; - } else { - int* iret[posmax]; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - iret[idet] = new int(0); - Task* task = new Task(new func0_t(&slsDetector::getFramesCaughtByReceiver, - detectors[idet], iret[idet])); - threadpool->add_task(task); - } - threadpool->startExecuting(); - threadpool->wait_for_tasks_to_complete(); - - for (int idet = 0; idet < posmax; ++idet) { - if (iret[idet] != NULL) { - if (*iret[idet] == -1) // could not connect - ret = -1; - else - ret1 += (*iret[idet]); - delete iret[idet]; - } else - ret = -1; - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - } - } - if ((!detectors.size()) || (ret == -1)) - return ret; - - ret = (int)(ret1 / detectors.size()); - return ret; -} - - -int multiSlsDetector::getReceiverCurrentFrameIndex() { - int ret = 0, ret1 = 0; - for (unsigned int i = 0; i < detectors.size(); ++i) { - ret1 += detectors[i]->getReceiverCurrentFrameIndex(); - if (detectors[i]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << i)); - } - if (!detectors.size()) - return ret; - ret = (int)(ret1 / detectors.size()); - - return ret; -} - -int multiSlsDetector::resetFramesCaught() { - return parallelCallDetectorMember(&slsDetector::resetFramesCaught); -} - -int multiSlsDetector::createReceivingDataSockets(const bool destroy) { - if (destroy) { - cprintf(MAGENTA, "Going to destroy data sockets\n"); - //close socket - for (std::vector::const_iterator it = zmqSocket.begin(); it != zmqSocket.end(); ++it) { - (*it)->Close(); - delete(*it); - } - zmqSocket.clear(); - - client_downstream = false; - cout << "Destroyed Receiving Data Socket(s)" << endl; - return OK; - } - - cprintf(MAGENTA, "Going to create data sockets\n"); - - int numSockets = detectors.size(); - int numSocketsPerDetector = 1; - if (getDetectorsType() == EIGER) { - numSocketsPerDetector = 2; - } - numSockets *= numSocketsPerDetector; - - for (int i = 0; i < numSockets; ++i) { - uint32_t portnum = 0; - sscanf(detectors[i / numSocketsPerDetector]->getClientStreamingPort().c_str(), - "%d", &portnum); - portnum += (i % numSocketsPerDetector); - //cout<<"ip to be set to :"<getClientStreamingIP().c_str()<getClientStreamingIP().c_str(), - portnum); - zmqSocket.push_back(z); - printf("Zmq Client[%d] at %s\n", i, z->GetZmqServerAddress()); - } catch (...) { - cprintf(RED, "Error: Could not create Zmq socket on port %d\n", portnum); - createReceivingDataSockets(true); - return FAIL; - } - } - - client_downstream = true; - cout << "Receiving Data Socket(s) created" << endl; - return OK; -} - -void multiSlsDetector::readFrameFromReceiver() { - - int nX = thisMultiDetector->numberOfDetector[X]; // to copy data in multi module - int nY = thisMultiDetector->numberOfDetector[Y]; // for eiger, to reverse the data - bool gappixelsenable = false; - bool eiger = false; - if (getDetectorsType() == EIGER) { - eiger = true; - nX *= 2; - gappixelsenable = detectors[0]->enableGapPixels(-1) >= 1 ? true : false; - } - - bool runningList[zmqSocket.size()], connectList[zmqSocket.size()]; - int numRunning = 0; - for (unsigned int i = 0; i < zmqSocket.size(); ++i) { - if (!zmqSocket[i]->Connect()) { - connectList[i] = true; - runningList[i] = true; - ++numRunning; - } else { - // to remember the list it connected to, to disconnect later - connectList[i] = false; - cprintf(RED, "Error: Could not connect to socket %s\n", - zmqSocket[i]->GetZmqServerAddress()); - runningList[i] = false; - } - } - int numConnected = numRunning; - bool data = false; - char* image = NULL; - char* multiframe = NULL; - char* multigappixels = NULL; - int multisize = 0; - // only first message header - uint32_t size = 0, nPixelsX = 0, nPixelsY = 0, dynamicRange = 0; - float bytesPerPixel = 0; - // header info every header - std::string currentFileName = ""; - uint64_t currentAcquisitionIndex = -1, currentFrameIndex = -1, currentFileIndex = -1; - uint32_t currentSubFrameIndex = -1, coordX = -1, coordY = -1, flippedDataX = -1; - - //wait for real time acquisition to start - bool running = true; - sem_wait(&sem_newRTAcquisition); - if (checkJoinThread()) - running = false; - - //exit when checkJoinThread() (all sockets done) - while (running) { - - // reset data - data = false; - if (multiframe != NULL) - memset(multiframe, 0xFF, multisize); - - //get each frame - for (unsigned int isocket = 0; isocket < zmqSocket.size(); ++isocket) { - - //if running - if (runningList[isocket]) { - - // HEADER - { - rapidjson::Document doc; - if (!zmqSocket[isocket]->ReceiveHeader(isocket, doc, - SLS_DETECTOR_JSON_HEADER_VERSION)) { - // parse error, version error or end of acquisition for socket - runningList[isocket] = false; - --numRunning; - continue; - } - - // if first message, allocate (all one time stuff) - if (image == NULL) { - // allocate - size = doc["size"].GetUint(); - multisize = size * zmqSocket.size(); - image = new char[size]; - multiframe = new char[multisize]; - memset(multiframe, 0xFF, multisize); - // dynamic range - dynamicRange = doc["bitmode"].GetUint(); - bytesPerPixel = (float)dynamicRange / 8; - // shape - nPixelsX = doc["shape"][0].GetUint(); - nPixelsY = doc["shape"][1].GetUint(); - -#ifdef VERBOSE - cprintf(BLUE, "(Debug) One Time Header Info:\n" - "size: %u\n" - "multisize: %u\n" - "dynamicRange: %u\n" - "bytesPerPixel: %f\n" - "nPixelsX: %u\n" - "nPixelsY: %u\n", - size, multisize, dynamicRange, bytesPerPixel, - nPixelsX, nPixelsY); -#endif - } - // each time, parse rest of header - currentFileName = doc["fname"].GetString(); - currentAcquisitionIndex = doc["acqIndex"].GetUint64(); - currentFrameIndex = doc["fIndex"].GetUint64(); - currentFileIndex = doc["fileIndex"].GetUint64(); - currentSubFrameIndex = doc["expLength"].GetUint(); - coordY = doc["row"].GetUint(); - coordX = doc["column"].GetUint(); - if (eiger) - coordY = (nY - 1) - coordY; - //cout << "X:" << doc["row"].GetUint() <<" Y:"<ReceiveData(isocket, image, size); - - // creating multi image - { - uint32_t xoffset = coordX * nPixelsX * bytesPerPixel; - uint32_t yoffset = coordY * nPixelsY; - uint32_t singledetrowoffset = nPixelsX * bytesPerPixel; - uint32_t rowoffset = nX * singledetrowoffset; -#ifdef VERBOSE - cprintf(BLUE, "(Debug) Multi Image Info:\n" - "xoffset: %u\n" - "yoffset: %u\n" - "singledetrowoffset: %u\n" - "rowoffset: %u\n", - xoffset, yoffset, singledetrowoffset, rowoffset); -#endif - if (eiger && flippedDataX) { - for (uint32_t i = 0; i < nPixelsY; ++i) { - memcpy(((char*)multiframe) + - ((yoffset + (nPixelsY - 1 - i)) * rowoffset) + xoffset, - (char*)image + (i * singledetrowoffset), - singledetrowoffset); - } - } else { - for (uint32_t i = 0; i < nPixelsY; ++i) { - memcpy(((char*)multiframe) + - ((yoffset + i) * rowoffset) + xoffset, - (char*)image + (i * singledetrowoffset), - singledetrowoffset); - } - } - } - } - } - - //send data to callback - if (data) { - // 4bit gap pixels - if (dynamicRange == 4 && gappixelsenable) { - int n = processImageWithGapPixels(multiframe, multigappixels); - nPixelsX = thisMultiDetector->numberOfChannelInclGapPixels[X]; - nPixelsY = thisMultiDetector->numberOfChannelInclGapPixels[Y]; - thisData = new detectorData(NULL, NULL, NULL, getCurrentProgress(), - currentFileName.c_str(), nPixelsX, nPixelsY, - multigappixels, n, dynamicRange, currentFileIndex); - } - // normal pixels - else { - thisData = new detectorData(NULL, NULL, NULL, getCurrentProgress(), - currentFileName.c_str(), nPixelsX, nPixelsY, - multiframe, multisize, dynamicRange, currentFileIndex); - } - dataReady(thisData, currentFrameIndex, - ((dynamicRange == 32) ? currentSubFrameIndex : -1), - pCallbackArg); - delete thisData; - setCurrentProgress(currentAcquisitionIndex + 1); - } - - //all done - if (!numRunning) { - // let main thread know that all dummy packets have been received - //(also from external process), - // main thread can now proceed to measurement finished call back - sem_post(&sem_endRTAcquisition); - // wait for next scan/measurement, else join thread - sem_wait(&sem_newRTAcquisition); - //done with complete acquisition - if (checkJoinThread()) - running = false; - else { - //starting a new scan/measurement (got dummy data) - for (unsigned int i = 0; i < zmqSocket.size(); ++i) - runningList[i] = connectList[i]; - numRunning = numConnected; - } - } - } - - // Disconnect resources - for (unsigned int i = 0; i < zmqSocket.size(); ++i) - if (connectList[i]) - zmqSocket[i]->Disconnect(); - - //free resources - if (image != NULL) - delete[] image; - if (multiframe != NULL) - delete[] multiframe; - if (multigappixels != NULL) - delete[] multigappixels; -} - -int multiSlsDetector::processImageWithGapPixels(char* image, char*& gpImage) { - // eiger 4 bit mode - int nxb = thisMultiDetector->numberOfDetector[X] * (512 + 3); - int nyb = thisMultiDetector->numberOfDetector[Y] * (256 + 1); - int gapdatabytes = nxb * nyb; - - int nxchip = thisMultiDetector->numberOfDetector[X] * 4; - int nychip = thisMultiDetector->numberOfDetector[Y] * 1; - - // allocate - if (gpImage == NULL) - gpImage = new char[gapdatabytes]; - // fill value - memset(gpImage, 0xFF, gapdatabytes); - - const int b1chipx = 128; - const int b1chipy = 256; - char* src = 0; - char* dst = 0; - - // copying line by line - src = image; - dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row - for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { //for each row in a chip - for (int col = 0; col < nxchip; ++col) { - memcpy(dst, src, b1chipx); - src += b1chipx; - dst += b1chipx; - if ((col + 1) % 4) - ++dst; - } - } - - dst += (2 * nxb); - } - - // vertical filling of values - { - uint8_t temp, g1, g2; - int mod; - dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row - for (int ichipy = 0; ichipy < b1chipy; ++ichipy) { //for each row in a chip - for (int col = 0; col < nxchip; ++col) { - dst += b1chipx; - mod = (col + 1) % 4; - // copy gap pixel(chip 0, 1, 2) - if (mod) { - // neighbouring gap pixels to left - temp = (*((uint8_t*)(dst - 1))); - g1 = ((temp & 0xF) / 2); - (*((uint8_t*)(dst - 1))) = (temp & 0xF0) + g1; - - // neighbouring gap pixels to right - temp = (*((uint8_t*)(dst + 1))); - g2 = ((temp >> 4) / 2); - (*((uint8_t*)(dst + 1))) = (g2 << 4) + (temp & 0x0F); - - // gap pixels - (*((uint8_t*)dst)) = (g1 << 4) + g2; - - // increment to point to proper chip destination - ++dst; - } - } - } - - dst += (2 * nxb); - } - } - - //return gapdatabytes; - // horizontal filling - { - uint8_t temp, g1, g2; - char* dst_prevline = 0; - dst = gpImage; - for (int row = 0; row < nychip; ++row) { // for each chip in a row - dst += (b1chipy * nxb); - // horizontal copying of gap pixels from neighboring past line (bottom parts) - if (row < nychip - 1) { - dst_prevline = dst - nxb; - for (int gapline = 0; gapline < nxb; ++gapline) { - temp = (*((uint8_t*)dst_prevline)); - g1 = ((temp >> 4) / 2); - g2 = ((temp & 0xF) / 2); - (*((uint8_t*)dst_prevline)) = (g1 << 4) + g2; - (*((uint8_t*)dst)) = (*((uint8_t*)dst_prevline)); - ++dst; - ++dst_prevline; - } - } - - // horizontal copying of gap pixels from neihboring future line (top part) - if (row > 0) { - dst -= ((b1chipy + 1) * nxb); - dst_prevline = dst + nxb; - for (int gapline = 0; gapline < nxb; ++gapline) { - temp = (*((uint8_t*)dst_prevline)); - g1 = ((temp >> 4) / 2); - g2 = ((temp & 0xF) / 2); - temp = (g1 << 4) + g2; - (*((uint8_t*)dst_prevline)) = temp; - (*((uint8_t*)dst)) = temp; - ++dst; - ++dst_prevline; - } - dst += ((b1chipy + 1) * nxb); - } - - dst += nxb; - } - } - - return gapdatabytes; -} - - -int multiSlsDetector::enableWriteToFile(int enable) { - return callDetectorMember(&slsDetector::enableWriteToFile, enable); -} - -int multiSlsDetector::overwriteFile(int enable) { - return callDetectorMember(&slsDetector::overwriteFile, enable); -} - - -int multiSlsDetector::setReadReceiverFrequency(int freq) { - return callDetectorMember(&slsDetector::setReadReceiverFrequency, freq); -} - -int multiSlsDetector::setReceiverReadTimer(int time_in_ms) { - return callDetectorMember(&slsDetector::setReceiverReadTimer, time_in_ms); -} - -int multiSlsDetector::enableDataStreamingToClient(int enable) { - if (enable >= 0) { - //destroy data threads - if (!enable) - createReceivingDataSockets(true); - //create data threads - else { - if (createReceivingDataSockets() == FAIL) { - std::cout << "Could not create data threads in client." << std::endl; - //only for the first det as theres no general one - setErrorMask(getErrorMask() | (1 << 0)); - detectors[0]->setErrorMask((detectors[0]->getErrorMask()) | - (DATA_STREAMING)); - } - } - } - return client_downstream; -} - -int multiSlsDetector::enableDataStreamingFromReceiver(int enable) { - if (enable >= 0) { - thisMultiDetector->receiver_upstream = parallelCallDetectorMember( - &slsDetector::enableDataStreamingFromReceiver, enable); - } - return thisMultiDetector->receiver_upstream; -} - -int multiSlsDetector::enableReceiverCompression(int i) { - return callDetectorMember(&slsDetector::enableReceiverCompression, i); -} - -int multiSlsDetector::enableTenGigabitEthernet(int i) { - return callDetectorMember(&slsDetector::enableTenGigabitEthernet, i); -} - -int multiSlsDetector::setReceiverFifoDepth(int i) { - return callDetectorMember(&slsDetector::setReceiverFifoDepth, i); -} - -int multiSlsDetector::setReceiverSilentMode(int i) { - return callDetectorMember(&slsDetector::setReceiverSilentMode, i); -} - -int multiSlsDetector::setCTBPattern(std::string fname) { - uint64_t word; - int addr = 0; - FILE* fd = fopen(fname.c_str(), "r"); - if (fd) { - while (fread(&word, sizeof(word), 1, fd)) { - for (unsigned int idet = 0; idet < detectors.size(); ++idet) - detectors[idet]->setCTBWord(addr, word); - ++addr; - } - - fclose(fd); - } else - return -1; - - return addr; -} - - -uint64_t multiSlsDetector::setCTBWord(int addr, uint64_t word) { - return callDetectorMember(&slsDetector::setCTBWord, addr, word); -} - -int multiSlsDetector::setCTBPatLoops(int level, int& start, int& stop, int& n) { - int ret = -100, ret1; - for (unsigned int idet = 0; idet < detectors.size(); ++idet) { - ret1 = detectors[idet]->setCTBPatLoops(level, start, stop, n); - if (detectors[idet]->getErrorMask()) - setErrorMask(getErrorMask() | (1 << idet)); - if (ret == -100) - ret = ret1; - else if (ret != ret1) - ret = -1; - } - return ret; -} - -int multiSlsDetector::setCTBPatWaitAddr(int level, int addr) { - return callDetectorMember(&slsDetector::setCTBPatWaitAddr, level, addr); -} - -int multiSlsDetector::setCTBPatWaitTime(int level, uint64_t t) { - return callDetectorMember(&slsDetector::setCTBPatWaitTime, level, t); -} diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h deleted file mode 100644 index 6bc712ea9..000000000 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ /dev/null @@ -1,1944 +0,0 @@ -#ifndef MULTI_SLS_DETECTOR_H -#define MULTI_SLS_DETECTOR_H - -/** - @libdoc The multiSlsDetector class is used to operate several slsDetectors in parallel. - * @short This is the base class for multi detector system functionalities - * @author Anna Bergamaschi - */ - -#include "slsDetectorUtils.h" - -class slsDetector; -class SharedMemory; -class ThreadPool; -class ZmqSocket; - - -#include -#include - - -#define MULTI_SHMVERSION 0x180629 -#define SHORT_STRING_LENGTH 50 -#define DATE_LENGTH 30 - -class multiSlsDetector : public slsDetectorUtils { - -private: - - /** - * @short structure allocated in shared memory to store detector settings for IPC and cache - */ - typedef struct sharedMultiSlsDetector { - - - /* FIXED PATTERN FOR STATIC FUNCTIONS. DO NOT CHANGE, ONLY APPEND ------*/ - - /** shared memory version */ - int shmversion; - - /** last process id accessing the shared memory */ - pid_t lastPID; - - /** last user name accessing the shared memory */ - char lastUser[SHORT_STRING_LENGTH]; - - /** last time stamp when accessing the shared memory */ - char lastDate[SHORT_STRING_LENGTH]; - - /** number of sls detectors in shared memory */ - int numberOfDetectors; - - /** END OF FIXED PATTERN -----------------------------------------------*/ - - - - - /** Number of detectors operated at once */ - int numberOfDetector[2]; - - /** online flag - is set if the detector is connected, unset if socket - * connection is not possible */ - int onlineFlag; - - /** stopped flag - is set if an acquisition error occurs or the detector - * is stopped manually. Is reset to 0 at the start of the acquisition */ - int stoppedFlag; - - /** position of the master detector */ - int masterPosition; - - /** type of synchronization between detectors */ - synchronizationMode syncMode; - - /** size of the data that are transfered from all detectors */ - int dataBytes; - - /** data bytes including gap pixels transferred from all detectors */ - int dataBytesInclGapPixels; - - /** total number of channels for all detectors */ - int numberOfChannels; - - /** total number of channels for all detectors in one dimension*/ - int numberOfChannel[2]; - - /** total number of channels including gap pixels in one dimension */ - int numberOfChannelInclGapPixels[2]; - - /** total number of channels for all detectors */ - int maxNumberOfChannels; - - /** max number of channels for all detectors in one dimension*/ - int maxNumberOfChannel[2]; - - /** max number of channels including gap pixels for all detectors in - * one dimension*/ - int maxNumberOfChannelInclGapPixels[2]; - - /** max number of channels allowed for the complete set of detectors in - * one dimension */ - int maxNumberOfChannelsPerDetector[2]; - - /** timer values */ - int64_t timerValue[MAX_TIMERS]; - - /** detector settings (standard, fast, etc.) */ - detectorSettings currentSettings; - - /** detector threshold (eV) */ - int currentThresholdEV; - - /** indicator for the acquisition progress - set to 0 at the beginning - * of the acquisition and incremented every time that the data are written - * to file */ - int progressIndex; - - /** total number of frames to be acquired */ - int totalProgress; - - /** current index of the output file */ - int fileIndex; - - /** name root of the output files */ - char fileName[MAX_STR_LENGTH]; - - /** path of the output files */ - char filePath[MAX_STR_LENGTH]; - - /** max frames per file */ - int framesPerFile; - - /** file format*/ - fileFormat fileFormatType; - - /** corrections to be applied to the data \see ::correctionFlags */ - int correctionMask; - - /** threaded processing flag (i.e. if data are processed and written to - * file in a separate thread) */ - int threadedProcessing; - - /** dead time (in ns) for rate corrections */ - double tDead; - - /** directory where the flat field files are stored */ - char flatFieldDir[MAX_STR_LENGTH]; - - /** file used for flat field corrections */ - char flatFieldFile[MAX_STR_LENGTH]; - - /** file with the bad channels */ - char badChanFile[MAX_STR_LENGTH]; - - /** angular conversion file */ - char angConvFile[MAX_STR_LENGTH]; - - /** angular direction (1 if it corresponds to the encoder direction - * i.e. channel 0 is 0, maxchan is positive high angle, 0 otherwise */ - int angDirection; - - /** beamline fine offset (of the order of mdeg, might be adjusted for - * each measurements) */ - double fineOffset; - - /** beamline offset (might be a few degrees beacuse of encoder offset - - * normally it is kept fixed for a long period of time) */ - double globalOffset; - - /** bin size for data merging */ - double binSize; - - //X and Y displacement - double sampleDisplacement[2]; - - /** number of positions at which the detector should acquire */ - int numberOfPositions; - - /** list of encoder positions at which the detector should acquire */ - double detPositions[MAXPOS]; - - /** Scans and scripts */ - int actionMask; - - mystring actionScript[MAX_ACTIONS]; - mystring actionParameter[MAX_ACTIONS]; - int scanMode[MAX_SCAN_LEVELS]; - mystring scanScript[MAX_SCAN_LEVELS]; - mystring scanParameter[MAX_SCAN_LEVELS]; - int nScanSteps[MAX_SCAN_LEVELS]; - mysteps scanSteps[MAX_SCAN_LEVELS]; - int scanPrecision[MAX_SCAN_LEVELS]; - - /** flag for acquiring */ - bool acquiringFlag; - - /** external gui */ - bool externalgui; - - /** receiver online flag - is set if the receiver is connected, - * unset if socket connection is not possible */ - int receiverOnlineFlag; - - /** data streaming (up stream) enable in receiver */ - bool receiver_upstream; - - } sharedMultiSlsDetector; - - - - -public: - - - using slsDetectorUtils::flatFieldCorrect; - using slsDetectorUtils::rateCorrect; - using slsDetectorUtils::setBadChannelCorrection; - using slsDetectorUtils::readAngularConversion; - using slsDetectorUtils::writeAngularConversion; - - - /** - * Constructor - * @param id multi detector id - * @param verify true to verify if shared memory version matches existing one - * @param update true to update last user pid, date etc - */ - multiSlsDetector(int id = 0, bool verify = true, bool update = true); - - /** - * Destructor - */ - virtual ~multiSlsDetector(); - - /** - * returns true. Used when reference is slsDetectorUtils and to determine - * if command can be implemented as slsDetector/multiSlsDetector object/ - */ - bool isMultiSlsDetectorClass(); - - /** - * Creates/open shared memory, initializes detector structure and members - * Called by constructor/ set hostname / read config file - * @param verify true to verify if shared memory version matches existing one - * @param update true to update last user pid, date etc - */ - void setupMultiDetector(bool verify = true, bool update = true); - - /** - * If specific position, then provide result with that detector at position pos - * else concatenate the result of all detectors - * @param somefunc function pointer - * @param pos positin of detector in array (-1 is for all) - * @returns result for detector at that position or concatenated string of all detectors - */ - std::string concatResultOrPos(std::string (slsDetector::*somefunc)(int), int pos); - - /** - * Loop serially through all the detectors in calling a particular method - * @param somefunc function pointer - * @returns -1 if values are different, otherwise result in calling method - */ - template - T callDetectorMember(T (slsDetector::*somefunc)()); - - /** - * Loop serially through all the detectors in calling a particular method - * with string as return - * @param somefunc function pointer - * @returns concatenated string of results ifdifferent, otherwise result in - * calling method - */ - std::string callDetectorMember(std::string(slsDetector::*somefunc)()); - - /** - * Loop serially through all the detectors in calling a particular method - * with an extra argument - * @param somefunc function pointer - * @param value argument for calling method - * @returns -1 if values are different, otherwise result in calling method - */ - template - T callDetectorMember(T (slsDetector::*somefunc)(V), V value); - - /** - * Loop serially through all the detectors in calling a particular method - * with two extra arguments - * @param somefunc function pointer - * @param par1 argument for calling method - * @param par2 second argument for calling method - * @returns -1 if values are different, otherwise result in calling method - */ - template - T callDetectorMember(T (slsDetector::*somefunc)(P1, P2), P1 par1, P2 par2); - - - /** - * Parallel calls to all the detectors in calling a particular method - * @param somefunc function pointer - * @returns -1 if values are different, otherwise result in calling method - */ - template - T parallelCallDetectorMember(T (slsDetector::*somefunc)()); - - /** - * Loop serially through all the detectors in calling a particular method - * with an extra argument - * @param somefunc function pointer - * @param value argument for calling method - * @returns -1 if values are different, otherwise result in calling method - */ - template - T parallelCallDetectorMember(T (slsDetector::*somefunc)(P1), P1 value); - - /** - * Loop serially through all the detectors in calling a particular method - * with two extra arguments - * @param somefunc function pointer - * @param par1 argument for calling method - * @param par2 second argument for calling method - * @returns -1 if values are different, otherwise result in calling method - */ - template - T parallelCallDetectorMember(T (slsDetector::*somefunc)(P1, P2), P1 par1, P2 par2); - - /** - * Loop serially through all the detectors in calling a particular method - * with three int arguments - * @param somefunc function pointer - * @param v0 argument for calling method - * @param v1 second argument for calling method - * @param v2 third argument for calling method - * @returns -1 if values are different, otherwise result in calling method - */ - int parallelCallDetectorMember(int (slsDetector::*somefunc)(int, int, int), - int v0, int v1, int v2); - - /** - * Loop serially through all results and - * return a value if they are all same, else return -1 - * @param return_values vector of results - * @returns -1 if values are different, otherwise result - */ - template - T minusOneIfDifferent(const std::vector&); - - /** - * Calculate the detector position index in multi vector and the module index - * using an index for all entire modules in list (Mythen) - * @param i position index of all modules in list - * @param idet position index in multi vector list - * @param imod module index in the sls detector - */ - int decodeNMod(int i, int &idet, int &imod); - - /** - * Decodes which detector and the corresponding channel numbers for it - * Mainly useful in a multi detector setROI (Gotthard, Mythen?) - * @param offsetX channel number or total channel offset in x direction - * @param offsetY channel number or total channel offset in y direction - * @param channelX channel number from detector offset in x direction - * @param channelY channel number from detector offset in x direction - * @returns detector id or -1 if channel number out of range - */ - int decodeNChannel(int offsetX, int offsetY, int &channelX, int &channelY); - - /** - * Decode data from the detector converting them to an array of doubles, - * one for each channel (Mythen only) - * @param datain data from the detector - * @param nn size of datain array - * @param fdata double array of decoded data - * @returns pointer to a double array with a data per channel - */ - double* decodeData(int *datain, int &nn, double *fdata=NULL); - - /** - * Writes a data file - * @param name of the file to be written - * @param data array of data values - * @param err array of errors on the data. If NULL no errors will be written - * @param ang array of angular values. If NULL data will be in the form - * chan-val(-err) otherwise ang-val(-err) - * @param dataformat format of the data: can be 'i' integer or 'f' double (default) - * @param nch number of channels to be written to file. if -1 defaults to - * the number of installed channels of the detector - * @returns OK or FAIL if it could not write the file or data=NULL - * \sa mythenDetector::writeDataFile - */ - int writeDataFile(std::string fname, double *data, double *err=NULL, - double *ang=NULL, char dataformat='f', int nch=-1); - - /** - * Writes a data file with an integer pointer to an array - * @param name of the file to be written - * @param data array of data values - * @returns OK or FAIL if it could not write the file or data=NULL - * \sa mythenDetector::writeDataFile - */ - int writeDataFile(std::string fname, int *data); - - /** - * Reads a data file - * @param name of the file to be read - * @param data array of data values to be filled - * @param err array of arrors on the data. If NULL no errors are expected - * on the file - * @param ang array of angular values. If NULL data are expected in the - * form chan-val(-err) otherwise ang-val(-err) - * @param dataformat format of the data: can be 'i' integer or 'f' double (default) - * @param nch number of channels to be written to file. if <=0 defaults - * to the number of installed channels of the detector - * @returns OK or FAIL if it could not read the file or data=NULL - *\sa mythenDetector::readDataFile - */ - int readDataFile(std::string fname, double *data, double *err=NULL, - double *ang=NULL, char dataformat='f'); - - - /** - * Reads a data file - * @param name of the file to be read - * @param data array of data values - * @returns OK or FAIL if it could not read the file or data=NULL - * \sa mythenDetector::readDataFile - */ - int readDataFile(std::string fname, int *data); - - /** - * Checks error mask and returns error message and its severity if it exists - * @param critical is 1 if any of the messages is critical - * @returns error message else an empty std::string - */ - std::string getErrorMessage(int &critical); - - /** - * Clears error mask of both multi and sls - * @returns error mask - */ - int64_t clearAllErrorMask(); - - /** - * Set Error Mask from all detectors - * if each had errors in the mask already - */ - void setErrorMaskFromAllDetectors(); - - /** - * Set acquiring flag in shared memory - * @param b acquiring flag - */ - void setAcquiringFlag(bool b=false); - - /** - * Get acquiring flag from shared memory - * @returns acquiring flag - */ - bool getAcquiringFlag(); - - /** - * Check if acquiring flag is set, set error if set - * @returns FAIL if not ready, OK if ready - */ - bool isAcquireReady(); - - /** - * Check version compatibility with detector/receiver software - * (if hostname/rx_hostname has been set/ sockets created) - * @param p port type control port or receiver port - * @returns FAIL for incompatibility, OK for compatibility - */ - int checkVersionCompatibility(portType t); - - /** - * Get ID or version numbers - * @param mode version type - * @param imod module number in entire module list (gets decoded) (-1 for all) - * @returns Id or version number of that type - */ - int64_t getId(idMode mode, int imod=0); - - /** - * Get sls detector object from position in detectors array - * @param pos position in detectors array - * @returns pointer to sls detector object - */ - slsDetector* getSlsDetector(unsigned int pos); - - /** - * Accessing the sls detector from the multi list using position - * @param pos position in the multi list - * @returns slsDetector object - */ - slsDetector *operator()(int pos) const; - - /** - * Free shared memory from the command line - * avoiding creating the constructor classes and mapping - * @param multiId multi detector Id - */ - static void freeSharedMemory(int multiId); - - /** - * Free shared memory and delete shared memory structure - * occupied by the sharedMultiSlsDetector structure - * Clears all the vectors and destroys threadpool to bring - * object back to state before object creation amap - */ - void freeSharedMemory(); - - /** - * Get user details of shared memory - * @returns string with user details - */ - std::string getUserDetails(); - - /** - * Sets the hostname of all sls detectors in shared memory - * Connects to them to set up online flag - * @param name concatenated hostname of all the sls detectors - */ - void setHostname(const char* name); - - /** - * Gets the hostname of detector at particular position - * or concatenated hostnames of all the sls detectors - * @param pos position of detector in array, -1 for all detectors - * @returns concatenated hostnames of all detectors or hostname of specific one - */ - std::string getHostname(int pos = -1); - - /** - * Appends detectors to the end of the list in shared memory - * Connects to them to set up online flag - * @param name concatenated hostname of the sls detectors to be appended to the list - */ - void addMultipleDetectors(const char* name); - - - using slsDetectorBase::getDetectorType; - /** - * Get Detector type for a particular sls detector or get the first one - * @param pos position of sls detector in array, if -1, returns first detector type - * @returns detector type of sls detector in position pos, if -1, returns the first det type - */ - detectorType getDetectorsType(int pos = -1); - - /** - * Concatenates string types of all sls detectors or - * returns the detector type of the first sls detector - * @param pos position of sls detector in array, if -1, returns first detector type - * @returns detector type of sls detector in position pos, if -1, concatenates - */ - std::string sgetDetectorsType(int pos=-1); - - /** - * Just to overload getDetectorType from users - * Concatenates string types of all sls detectors or - * returns the detector type of the first sls detector - * @returns detector type of sls detector in position pos, if -1, concatenates - */ - std::string getDetectorType(); - - /** - * Creates all the threads in the threadpool - * throws an exception if it cannot create threads - */ - void createThreadPool(); - - /** - * Destroys all the threads in the threadpool - */ - void destroyThreadPool(); - - /** - * Returns the number of detectors in the multidetector structure - * @returns number of detectors - */ - int getNumberOfDetectors(); - - /** - * Returns number of detectors in dimension d - * @param d dimension d - * @returns number of detectors in dimension d - */ - int getNumberOfDetectors(dimension d); - - /** - * Returns the number of detectors in each direction - @param nx number of detectors in x direction - @param ny number of detectors in y direction - */ - void getNumberOfDetectors(int& nx, int& ny); - - /** - * Returns sum of all modules per sls detector from shared memory (Mythen) - * Other detectors, it is 1 - * @returns sum of all modules per sls detector - */ - int getNMods(); - - /** - * Returns sum of all modules per sls detector in dimension d from shared memory (Mythen) - * Other detectors, it is 1 - * @param d dimension d - * @returns sum of all modules per sls detector in dimension d - */ - int getNMod(dimension d); - - /** - * Returns sum of all maximum modules per sls detector from shared memory (Mythen) - * Other detectors, it is 1 - * @returns sum of all maximum modules per sls detector - */ - int getMaxMods(); - - /** - * Returns sum of all maximum modules per sls detector in dimension d from shared memory (Mythen) - * Other detectors, it is 1 - * @param d dimension d - * @returns sum of all maximum modules per sls detector in dimension d - */ - int getMaxMod(dimension d); - - /** - * Returns the sum of all maximum modules per sls detector in dimension d Mythen) - * from the detector directly. - * Other detectors, it is 1 - * @param d dimension d - * @returns sum of all maximum modules per sls detector in dimension d - */ - int getMaxNumberOfModules(dimension d=X); - - /** - * Sets/Gets the sum of all modules per sls detector in dimension d (Mythen) - * from the detector directly. - * Other detectors, it is 1 - * @param i the number of modules to set to - * @param d dimension d - * @returns sum of all modules per sls detector in dimension d - */ - int setNumberOfModules(int i=-1, dimension d=X); - - /** - * Using module id, returns the number of channels per that module - * from shared memory (Mythen) - * @param imod module number of entire multi detector list - * @returns number of channels per module imod - */ - int getChansPerMod(int imod=0); - - /** - * Returns the total number of channels of all sls detectors from shared memory - * @returns the total number of channels of all sls detectors - */ - int getTotalNumberOfChannels(); - - /** - * Returns the total number of channels of all sls detectors in dimension d - * from shared memory - * @param d dimension d - * @returns the total number of channels of all sls detectors in dimension d - */ - int getTotalNumberOfChannels(dimension d); - - /** - * Returns the total number of channels of all sls detectors in dimension d - * including gap pixels from shared memory - * @param d dimension d - * @returns the total number of channels of all sls detectors in dimension d - * including gap pixels - */ - int getTotalNumberOfChannelsInclGapPixels(dimension d); - - /** - * Returns the maximum number of channels of all sls detectors - * from shared memory (Mythen) - * @returns the maximum number of channels of all sls detectors - */ - int getMaxNumberOfChannels(); - - /** - * Returns the maximum number of channels of all sls detectors in dimension d - * from shared memory (Mythen) - * @param d dimension d - * @returns the maximum number of channels of all sls detectors in dimension d - */ - int getMaxNumberOfChannels(dimension d); - - /** - * Returns the total number of channels of all sls detectors in dimension d - * including gap pixels from shared memory(Mythen) - * @param d dimension d - * @returns the maximum number of channels of all sls detectors in dimension d - * including gap pixels - */ - int getMaxNumberOfChannelsInclGapPixels(dimension d); - - /** - * Returns the maximum number of channels of all sls detectors in each dimension d - * from shared memory. multi detector shared memory variable to calculate - * offsets for each sls detector - * @param d dimension d - * @returns the maximum number of channels of all sls detectors in dimension d - */ - int getMaxNumberOfChannelsPerDetector(dimension d); - - /** - * Sets the maximum number of channels of all sls detectors in each dimension d - * from shared memory, multi detector shared memory variable to calculate - * offsets for each sls detector - * @param d dimension d - * @param i maximum number of channels for multi structure in dimension d - * @returns the maximum number of channels of all sls detectors in dimension d - */ - int setMaxNumberOfChannelsPerDetector(dimension d,int i); - - /** - * Get Detector offset from shared memory in dimension d - * @param d dimension d - * @param pos detector position in multi detector list - * @returns offset in dimension d, -1 if pos is not an actual position in list - */ - int getDetectorOffset(dimension d, int pos); - - /** - * Set Detector offset in shared memory in dimension d - * @param d dimension d - * @param off offset for detector - * @param pos detector position in multi detector list - */ - void setDetectorOffset(dimension d, int off, int pos); - - /** - * Updates the channel offsets in X and Y dimension for all the sls detectors - * It is required for decodeNMod and setting ROI - */ - void updateOffsets(); - - /** - * Checks if the multi detectors are online and sets the online flag - * @param online if GET_ONLINE_FLAG, only returns shared memory online flag, - * else sets the detector in online/offline state - * if OFFLINE_FLAG, (i.e. no communication to the detector - using only local structure - no data acquisition possible!); - * if ONLINE_FLAG, detector in online state (i.e. communication to the detector updating the local structure) - * @returns online/offline status - */ - int setOnline(int const online=GET_ONLINE_FLAG); - - /** - * Checks if each of the detectors are online/offline - * @returns empty string if they are all online, - * else returns concatenation of strings of all detectors that are offline - */ - std::string checkOnline(); - - /** - * Set/Gets TCP Port of detector or receiver - * @param t port type - * @param p port number (-1 gets) - * @returns port number - */ - int setPort(portType t, int p); - - /** - * Lock server for this client IP - * @param p 0 to unlock, 1 to lock - * @returns 1 for locked or 0 for unlocked - */ - int lockServer(int p); - - /** - * Get last client IP saved on detector server - * @returns last client IP saved on detector server - */ - std::string getLastClientIP(); - - /** - * Exit detector server - * @returns OK or FAIL - */ - int exitServer(); - - /** - * Load configuration from a configuration File - * @param fname configuration file name - * @return OK or FAIL - */ - int readConfigurationFile(std::string const fname); - - /** - * Write current configuration to a file - * @param fname configuration file name - * @returns OK or FAIL - */ - int writeConfigurationFile(std::string const fname); - - /** - * Returns the trimfile or settings file name (Useless??) - * @returns the trimfile or settings file name - */ - std::string getSettingsFile(); - - /** - * Get detector settings - * @param ipos position in multi list (-1 all) - * @returns current settings - */ - detectorSettings getSettings(int pos=-1); - - /** - * Load detector settings from the settings file picked from the trimdir/settingsdir - * Eiger only stores in shared memory ( a get will overwrite this) - * For Eiger, one must use threshold - * @param isettings settings - * @param ipos position in multi list (-1 all) - * @returns current settings - */ - detectorSettings setSettings(detectorSettings isettings, int pos=-1); - - /** - * Get threshold energy (Mythen and Eiger) - * @param imod module number (-1 all) - * @returns current threshold value for imod in ev (-1 failed) - */ - int getThresholdEnergy(int imod=-1); - - /** - * Set threshold energy (Mythen and Eiger) - * @param e_eV threshold in eV - * @param imod module number (-1 all) - * @param isettings ev. change settings - * @param tb 1 to include trimbits, 0 to exclude - * @returns current threshold value for imod in ev (-1 failed) - */ - int setThresholdEnergy(int e_eV, int imod=-1, detectorSettings isettings=GET_SETTINGS,int tb=1); - - /** - * Returns the detector trimbit/settings directory \sa sharedSlsDetector - * @returns the trimbit/settings directory - */ - std::string getSettingsDir(); - - /** - * Sets the detector trimbit/settings directory \sa sharedSlsDetector - * @param s trimbits/settings directory - * @returns the trimbit/settings directory - */ - std::string setSettingsDir(std::string s); - - /** - * Returns the calibration files directory \sa sharedSlsDetector (Mythen) - * @returns the calibration files directory - */ - std::string getCalDir(); - - /** - * Sets the calibration files directory \sa sharedSlsDetector (Mythen) - * @param s the calibration files directory - * @returns the calibration files directory - */ - std::string setCalDir(std::string s); - - /** - * Loads the modules settings/trimbits reading from a specific file - * file name extension is automatically generated. - * @param fname specific settings/trimbits file - * @param imod module number (-1 for all) - * returns OK or FAIL - */ - int loadSettingsFile(std::string fname, int imod=-1); - - /** - * Saves the modules settings/trimbits to a specific file - * file name extension is automatically generated. - * @param fname specific settings/trimbits file - * @param imod module number (-1 for all) - * returns OK or FAIL - */ - int saveSettingsFile(std::string fname, int imod=-1); - - /** - * Loads the modules calibration data reading from a specific file (Mythen) - * file name extension is automatically generated. - * @param fname specific calibration file - * @param imod module number (-1 for all) - * returns OK or FAIL - */ - int loadCalibrationFile(std::string fname, int imod=-1); - - /** - * Saves the modules calibration data to a specific file (Mythen) - * file name extension is automatically generated. - * @param fname specific calibration file - * @param imod module number (-1 for all) - * returns OK or FAIL - */ - int saveCalibrationFile(std::string fname, int imod=-1); - - /** - * Sets/gets the detector in position i as master of the structure (Mythen) - * (e.g. it gates the other detectors and therefore must be started as last. - * Assumes that signal 0 is gate in, signal 1 is trigger in, signal 2 is gate out - * @param i position of master (-1 gets, -2 unset) - * @return master's position (-1 none) - */ - int setMaster(int i=-1); - - /** - * Sets/gets the synchronization mode of the various detector (Mythen) - * @param sync syncronization mode - * @returns current syncronization mode - */ - synchronizationMode setSynchronization(synchronizationMode sync=GET_SYNCHRONIZATION_MODE); - - /** - * Get Detector run status - * @returns status - */ - runStatus getRunStatus(); - - /** - * Prepares detector for acquisition (Eiger and Gotthard) - * For Gotthard, it sets the detector data transmission mode (CPU or receiver) - * @returns OK if all detectors are ready for acquisition, FAIL otherwise - */ - int prepareAcquisition(); - - /** - * Cleans up after acquisition (Gotthard only) - * For Gotthard, it sets the detector data transmission to default (via CPU) - * @returns OK or FAIL - */ - int cleanupAcquisition(); - - /** - * Start detector acquisition (Non blocking) - * @returns OK or FAIL if even one does not start properly - */ - int startAcquisition(); - - /** - * Stop detector acquisition - * @returns OK or FAIL - */ - int stopAcquisition(); - - /** - * Give an internal software trigger to the detector (Eiger only) - * @return OK or FAIL - */ - int sendSoftwareTrigger(); - - /** - * Start readout (without exposure or interrupting exposure) (Mythen) - * @returns OK or FAIL - */ - int startReadOut(); - - /** - * Start detector acquisition and read all data (Blocking until end of acquisition) - * (Mythen, puts all data into a data queue. Others, data at receiver via udp packets) - * @returns pointer to the front of the data queue (return significant only for Mythen) - * \sa startAndReadAllNoWait getDataFromDetector dataQueue - */ - int* startAndReadAll(); - - /** - * Start detector acquisition and call read out, but not reading (data for Mythen, - * and status for other detectors) from the socket. - * (startAndReadAll calls this and getDataFromDetector. Client is not blocking, - * but server is blocked until getDataFromDetector is called. so not recommended - * for users) - * @returns OK or FAIL - */ - int startAndReadAllNoWait(); - - /** - * Reads from the detector socket (data frame for Mythen and status for other - * detectors) - * @returns pointer to the data or NULL. If NULL disconnects the socket - * (return significant only for Mythen) - * Other detectors return NULL - * \sa getDataFromDetector - */ - int* getDataFromDetector(); - - /** - * Requests and receives a single data frame from the detector - * (Mythen: and puts it in the data queue) - * @returns pointer to the data or NULL. (return Mythen significant) - * Other detectors return NULL - * \sa getDataFromDetector - */ - int* readFrame(); - - /** - * Requests and receives all data from the detector - * (Mythen: and puts them in a data queue) - * @returns pointer to the front of the queue or NULL (return Mythen significant) - * Other detectors return NULL - * \sa getDataFromDetector dataQueue - */ - int* readAll(); - - /** - * Pops the data from the data queue (Mythen) - * @returns pointer to the popped data or NULL if the queue is empty. - * \sa dataQueue - */ - int* popDataQueue(); - - /** - * Pops the data from the postprocessed data queue (Mythen) - * @returns pointer to the popped data or NULL if the queue is empty. - * \sa finalDataQueue - */ - detectorData* popFinalDataQueue(); - - /** - * Resets the raw data queue (Mythen) - * \sa dataQueue - */ - void resetDataQueue(); - - /** - * Resets the post processed data queue (Mythen) - * \sa finalDataQueue - */ - void resetFinalDataQueue(); - - /** - * Configures in detector the destination for UDP packets (Not Mythen) - * @returns OK or FAIL - */ - int configureMAC(); - - /** - * Set/get timer value (not all implemented for all detectors) - * @param index timer index - * @param t time in ns or number of...(e.g. frames, gates, probes) - * @param imod module number (gotthard delay can have different values) - * @returns timer set value in ns or number of...(e.g. frames, gates, probes) - */ - int64_t setTimer(timerIndex index, int64_t t=-1, int imod = -1); - - /** - * Set/get timer value left in acquisition (not all implemented for all detectors) - * @param index timer index - * @param t time in ns or number of...(e.g. frames, gates, probes) - * @param imod module number - * @returns timer set value in ns or number of...(e.g. frames, gates, probes) - */ - int64_t getTimeLeft(timerIndex index, int imod = -1); - - /** - * Set speed - * @param sp speed type (clkdivider option for Jungfrau and Eiger, others for Mythen/Gotthard) - * @param value (clkdivider 0,1,2 for full, half and quarter speed). Other values check manual - * @returns value of speed set - */ - int setSpeed(speedVariable sp, int value=-1); - - /** - * Set/get dynamic range and updates the number of dataBytes - * (Eiger: If i is 32, also sets clkdivider to 2, if 16, sets clkdivider to 1) - * @param i dynamic range (-1 get) - * @returns current dynamic range - * \sa sharedSlsDetector - */ - int setDynamicRange(int i=-1); - - /** - * Recalculated number of data bytes for multi detector - * @returns tota number of data bytes for multi detector - */ - int getDataBytes(); - - /** - * Set/get dacs value - * @param val value (in V) - * @param index DAC index - * @param mV 0 in dac units or 1 in mV - * @param imod module number (if -1 all modules) - * @returns current DAC value - */ - dacs_t setDAC(dacs_t val, dacIndex index , int mV, int imod=-1); - - /** - * Get adc value - * @param index adc(DAC) index - * @param imod module number (if -1 all modules) - * @returns current adc value (temperature for eiger and jungfrau in millidegrees) - */ - dacs_t getADC(dacIndex index, int imod=-1); - - /** - * Set/get timing mode - * @param pol timing mode (-1 gets) - * @returns current timing mode - */ - externalCommunicationMode setExternalCommunicationMode(externalCommunicationMode pol=GET_EXTERNAL_COMMUNICATION_MODE); - - /** - * Set/get external signal flags (to specify triggerinrising edge etc) (Gotthard, Mythen) - * @param pol external signal flag (-1 gets) - * @param signalindex singal index (0 - 3) - * @returns current timing mode - */ - externalSignalFlag setExternalSignalFlags(externalSignalFlag pol=GET_EXTERNAL_SIGNAL_FLAG , int signalindex=0); - - /** - * Set/get readout flags (Eiger, Mythen) - * @param flag readout flag (Eiger options: parallel, nonparallel, safe etc.) (-1 gets) - * @returns readout flag - */ - int setReadOutFlags(readOutFlags flag=GET_READOUT_FLAGS); - - /** - * Write in a register. For Advanced users - * @param addr address of register - * @param val value to write into register - * @returns value read after writing - */ - uint32_t writeRegister(uint32_t addr, uint32_t val); - - /** - * Read from a register. For Advanced users - * @param addr address of register - * @returns value read from register - */ - uint32_t readRegister(uint32_t addr); - - /** - * Set bit in a register. For Advanced users - * @param addr address of register - * @param n nth bit - * @returns value read from register - */ - uint32_t setBit(uint32_t addr, int n); - - /** - * Clear bit in a register. For Advanced users - * @param addr address of register - * @param n nth bit - * @returns value read from register - */ - uint32_t clearBit(uint32_t addr, int n); - - /** - * Set network parameter - * @param p network parameter type - * @param s network parameter value - * @returns network parameter value set (from getNetworkParameter) - */ - std::string setNetworkParameter(networkParameter p, std::string s); - - /** - * Get network parameter - * @param p network parameter type - * @returns network parameter value set (from getNetworkParameter) - */ - std::string getNetworkParameter(networkParameter); - - /** - * Execute a digital test (Gotthard, Mythen) - * @param mode testmode type - * @param imod module index (-1 for all) - * @returns result of test - */ - int digitalTest(digitalTestMode mode, int imod=0); - - /** - * Execute trimming (Mythen) - * @param mode trimming mode type - * @param par1 parameter 1 - * @param par2 parameter 2 - * @param imod module index (-1 for all) - * @returns result of trimming - */ - int executeTrimming(trimMode mode, int par1, int par2, int imod=-1); - - /** - * Load dark or gain image to detector (Gotthard) - * @param index image type - * @param fname file name from which to load image - * @returns OK or FAIL - */ - int loadImageToDetector(imageType index,std::string const fname); - - /** - * Writes the counter memory block from the detector (Gotthard) - * @param fname file name to load data from - * @param startACQ is 1 to start acquisition after reading counter - * @returns OK or FAIL - */ - int writeCounterBlockFile(std::string const fname,int startACQ=0); - - /** - * Resets counter in detector (Gotthard) - * @param startACQ is 1 to start acquisition after resetting counter - * @returns OK or FAIL - */ - int resetCounterBlock(int startACQ=0); - - /** - * Set/get counter bit in detector (Gotthard) - * @param i is -1 to get, 0 to reset and any other value to set the counter bit - * @returns the counter bit in detector - */ - int setCounterBit(int i = -1); - - /** - * Ensures that min is less than max in both dimensions (Gotthard) - * @param n number of rois - * @param r array of rois - */ - void verifyMinMaxROI(int n, ROI r[]); - - /** - * Set ROI (Gotthard) - * At the moment only one set allowed - * @param n number of rois - * @param roiLimits array of roi - * @param imod module number (-1 for all) - * @returns OK or FAIL - */ - int setROI(int n=-1,ROI roiLimits[]=NULL, int imod = -1); - - /** - * Get ROI from each detector and convert it to the multi detector scale (Gotthard) - * @param n number of rois - * @param imod module number (-1 for all) - * @returns pointer to array of ROI structure - */ - ROI* getROI(int &n, int imod = -1); - - /** - * Write to ADC register (Gotthard, Jungfrau, ChipTestBoard). For expert users - * @param addr address of adc register - * @param val value - * @returns return value (mostly -1 as it can't read adc register) - */ - int writeAdcRegister(int addr, int val); - - /** - * Activates/Deactivates the detector (Eiger only) - * @param enable active (1) or inactive (0), -1 gets - * @returns 0 (inactive) or 1 (active)for activate mode - */ - int activate(int const enable=-1); - - /** - * Set deactivated Receiver padding mode (Eiger only) - * @param padding padding option for deactivated receiver. Can be 1 (padding), 0 (no padding), -1 (gets) - * @returns 1 (padding), 0 (no padding), -1 (inconsistent values) for padding option - */ - int setDeactivatedRxrPaddingMode(int padding=-1); - - /** - * Returns the enable if data will be flipped across x or y axis (Eiger) - * @param d axis across which data is flipped - * @returns 1 for flipped, else 0 - */ - int getFlippedData(dimension d=X); - - /** - * Sets the enable which determines if - * data will be flipped across x or y axis (Eiger) - * @param d axis across which data is flipped - * @param value 0 or 1 to reset/set or -1 to get value - * @returns enable flipped data across x or y axis - */ - int setFlippedData(dimension d=X, int value=-1); - - /** - * Sets all the trimbits to a particular value (Eiger) - * @param val trimbit value - * @param imod module number, -1 means all modules - * @returns OK or FAIL - */ - int setAllTrimbits(int val, int imod=-1); - - /** - * Enable gap pixels, only for Eiger and for 8,16 and 32 bit mode. (Eiger) - * 4 bit mode gap pixels only in gui call back - * @param val 1 sets, 0 unsets, -1 gets - * @returns gap pixel enable or -1 for error - */ - int enableGapPixels(int val=-1); - - /** - * Sets the number of trim energies and their value (Eiger) - * \sa sharedSlsDetector - * @param nen number of energies - * @param en array of energies - * @returns number of trim energies - */ - int setTrimEn(int nen, int *en=NULL); - - /** - * Returns the number of trim energies and their value (Eiger) - * \sa sharedSlsDetector - * @param en array of energies - * @returns number of trim energies - */ - int getTrimEn(int *en=NULL); - - /** - * Pulse Pixel (Eiger) - * @param n is number of times to pulse - * @param x is x coordinate - * @param y is y coordinate - * @returns OK or FAIL - */ - int pulsePixel(int n=0,int x=0,int y=0); - - /** - * Pulse Pixel and move by a relative value (Eiger) - * @param n is number of times to pulse - * @param x is relative x value - * @param y is relative y value - * @returns OK or FAIL - */ - int pulsePixelNMove(int n=0,int x=0,int y=0); - - /** - * Pulse Chip (Eiger) - * @param n is number of times to pulse - * @returns OK or FAIL - */ - int pulseChip(int n=0); - - /** - * Set/gets threshold temperature (Jungfrau) - * @param val value in millidegrees, -1 gets - * @param imod module number, -1 is all - * @returns threshold temperature in millidegrees - */ - int setThresholdTemperature(int val=-1, int imod=-1); - - /** - * Enables/disables temperature control (Jungfrau) - * @param val value, -1 gets - * @param imod module number, -1 is all - * @returns temperature control enable - */ - int setTemperatureControl(int val=-1, int imod=-1); - - /** - * Resets/ gets over-temperature event (Jungfrau) - * @param val value, -1 gets - * @param imod module number, -1 is all - * @returns over-temperature event - */ - int setTemperatureEvent(int val=-1, int imod=-1); - - /** - * Set storage cell that stores first acquisition of the series (Jungfrau) - * @param value storage cell index. Value can be 0 to 15. (-1 gets) - * @returns the storage cell that stores the first acquisition of the series - */ - int setStoragecellStart(int pos=-1); - - /** - * Programs FPGA with pof file (Jungfrau) - * @param fname file name - * @returns OK or FAIL - */ - int programFPGA(std::string fname); - - /** - * Resets FPGA (Jungfrau) - * @returns OK or FAIL - */ - int resetFPGA(); - - /** - * Power on/off Chip (Jungfrau) - * @param ival on is 1, off is 0, -1 to get - * @returns OK or FAIL - */ - int powerChip(int ival= -1); - - /** - * Automatic comparator disable (Jungfrau) - * @param ival on is 1, off is 0, -1 to get - * @returns OK or FAIL - */ - int setAutoComparatorDisableMode(int ival= -1); - - /** - * Get Scan steps (Mythen) - * @param index scan index - * @param istep step index - * @returns scan step value - */ - double getScanStep(int index, int istep); - - /** - * Returns the trimbits from the detector's shared memmory (Mythen, Eiger) - * @param retval is the array with the trimbits - * @param fromDetector is true if the trimbits shared memory have to be - * uploaded from detector - * @returns total number of channels for the detector - */ - int getChanRegs(double* retval,bool fromDetector); - - /** - * Configure channel (Mythen) - * @param reg channel register - * @param ichan channel number (-1 all) - * @param ichip chip number (-1 all) - * @param imod module number (-1 all) - * \sa ::sls_detector_channel - * @returns current register value - */ - int setChannel(int64_t reg, int ichan=-1, int ichip=-1, int imod=-1); - - /** - * Get Move Flag (Mythen) - * @param imod module number (-1 all) - * @param istep step index - * @returns move flag - */ - int getMoveFlag(int imod); - - /** - * Fill Module mask for flat field corrections (Mythen) - * @param mM array - * @returns number of modules - */ - int fillModuleMask(int *mM); - - /** - * Calibrate Pedestal (ChipTestBoard) - * Starts acquisition, calibrates pedestal and writes to fpga - * @param frames number of frames - * @returns number of frames - */ - int calibratePedestal(int frames = 0); - - /** - * Set Rate correction (Mythen, Eiger) - * @param t dead time in ns - if 0 disable correction, - * if >0 set dead time to t, if < 0 set deadtime to default dead time - * for current settings - * @returns 0 if rate correction disabled, >0 otherwise - */ - int setRateCorrection(double t=0); - - /** - * Get rate correction (Mythen, Eiger) - * @param t reference for dead time - * @returns 0 if rate correction disabled, > 0 otherwise - */ - int getRateCorrection(double &t); - - /** - * Get rate correction tau (Mythen, Eiger) - * @returns 0 if rate correction disabled, otherwise the tau used for the correction - */ - double getRateCorrectionTau(); - - /** - * Get rate correction (Mythen, Eiger) - * @returns 0 if rate correction disabled, > 0 otherwise - */ - int getRateCorrection(); - - /** - * Rate correct data (Mythen) - * @param datain data array - * @param errin error array on data (if NULL will default to sqrt(datain) - * @param dataout array of corrected data - * @param errout error on corrected data (if not NULL) - * @returns 0 - */ - int rateCorrect(double* datain, double *errin, double* dataout, double *errout); - - /** - * Set flat field corrections (Mythen) - * @param fname name of the flat field file (or "" if disable) - * @returns 0 if disable (or file could not be read), >0 otherwise - */ - int setFlatFieldCorrection(std::string fname=""); - - /** - * Set flat field corrections (Mythen) - * @param corr if !=NULL the flat field corrections will be filled with - * corr (NULL usets ff corrections) - * @param ecorr if !=NULL the flat field correction errors will be filled - * with ecorr (1 otherwise) - * @returns 0 if ff correction disabled, >0 otherwise - */ - int setFlatFieldCorrection(double *corr, double *ecorr=NULL); - - /** - * Get flat field corrections (Mythen) - * @param corr if !=NULL will be filled with the correction coefficients - * @param ecorr if !=NULL will be filled with the correction coefficients errors - * @returns 0 if ff correction disabled, >0 otherwise - */ - int getFlatFieldCorrection(double *corr=NULL, double *ecorr=NULL); - - /** - * Flat field correct data (Mythen) - * @param datain data array - * @param errin error array on data (if NULL will default to sqrt(datain) - * @param dataout array of corrected data - * @param errout error on corrected data (if not NULL) - * @returns 0 - */ - int flatFieldCorrect(double* datain, double *errin, double* dataout, double *errout); - - /** - * Set bad channels correction (Mythen) - * @param fname file with bad channel list ("" disable) - * @returns 0 if bad channel disabled, >0 otherwise - */ - int setBadChannelCorrection(std::string fname=""); - - /** - * Set bad channels correction (Mythen) - * @param nch number of bad channels - * @param chs array of channels - * @param ff 0 if normal bad channels, 1 if ff bad channels - * @returns 0 if bad channel disabled, >0 otherwise - */ - int setBadChannelCorrection(int nch, int *chs, int ff); - - /** - * Get bad channels correction (Mythen) - * @param bad pointer to array that if bad!=NULL will be filled with the - * bad channel list - * @returns 0 if bad channel disabled or no bad channels, >0 otherwise - */ - int getBadChannelCorrection(int *bad=NULL); - - /** - * Reads an angular conversion file (Mythen, Gotthard) - * \sa angleConversionConstant mythenDetector::readAngularConversion - * @param fname file to be read - * @returns 0 if angular conversion disabled, >0 otherwise - */ - int readAngularConversionFile(std::string fname); - - /** - * Writes an angular conversion file (Mythen, Gotthard) - * \sa angleConversionConstant mythenDetector::writeAngularConversion - * @param fname file to be written - * @returns 0 if angular conversion disabled, >0 otherwise - */ - int writeAngularConversion(std::string fname); - - /** - * Get angular conversion (Mythen, Gotthard) - * \sa angleConversionConstant mythenDetector::getAngularConversion - * @param direction reference to diffractometer - * @param angconv array that will be filled with the angular conversion constants - * @returns 0 if angular conversion disabled, >0 otherwise - */ - int getAngularConversion(int &direction, angleConversionConstant *angconv=NULL) ; - - /** - * Sets the value of angular conversion parameter (Mythen, Gotthard) - * @param c can be ANGULAR_DIRECTION, GLOBAL_OFFSET, FINE_OFFSET, BIN_SIZE - * @param v the value to be set - * @returns the actual value - */ - double setAngularConversionParameter(angleConversionParameter c, double v); - - /** - * Gets the value of angular conversion parameter (Mythen, Gotthard) - * @param imod module index (-1 for all) - * @returns the actual value - */ - angleConversionConstant *getAngularConversionPointer(int imod=0); - - /** - * Prints receiver configuration - * @returns OK or FAIL - */ - int printReceiverConfiguration(); - - /** - * Sets up receiver socket if online and sets the flag - * @param online online/offline flag (-1 gets) - * @returns online/offline flag - */ - int setReceiverOnline(int const online=GET_ONLINE_FLAG); - - /** - * Checks if the receiver is really online - * @returns empty string if all online, else concatenates hostnames of all - * detectors that are offline - */ - std::string checkReceiverOnline(); - - /** - * Locks/Unlocks the connection to the receiver - * @param lock sets (1), usets (0), gets (-1) the lock - * @returns lock status of the receiver - */ - int lockReceiver(int lock=-1); - - /** - * Returns the IP of the last client connecting to the receiver - * @returns IP of last client connecting to receiver - */ - std::string getReceiverLastClientIP(); - - /** - * Turns off the receiver server! - * @returns OK or FAIL - */ - int exitReceiver(); - - /** - * Returns output file directory - * @returns output file directory - */ - std::string getFilePath(); - - /** - * Sets up the file directory - * @param s file directory - * @returns file dir - */ - std::string setFilePath(std::string s=""); - - /** - * Returns file name prefix - * @returns file name prefix - */ - std::string getFileName(); - - /** - * Sets up the file name prefix - * @param s file name prefix - * @returns file name prefix - */ - std::string setFileName(std::string s=""); - - /** - * Sets the max frames per file in receiver - * @param f max frames per file - * @returns max frames per file in receiver - */ - int setReceiverFramesPerFile(int f = -1); - - /** - * Sets the frames discard policy in receiver - * @param f frames discard policy - * @returns frames discard policy set in receiver - */ - frameDiscardPolicy setReceiverFramesDiscardPolicy(frameDiscardPolicy f = GET_FRAME_DISCARD_POLICY); - - /** - * Sets the partial frames padding enable in receiver - * @param f partial frames padding enable - * @returns partial frames padding enable in receiver - */ - int setReceiverPartialFramesPadding(int f = -1); - - /** - * Returns file format - * @returns file name - */ - fileFormat getFileFormat(); - - /** - * Sets up the file format - * @param f file format - * @returns file format - */ - fileFormat setFileFormat(fileFormat f=GET_FILE_FORMAT); - - /** - * Returns file index - * @returns file index - */ - int getFileIndex(); - - /** - * Sets up the file index - * @param i file index - * @returns file index - */ - int setFileIndex(int i=-1); - - /** - * Receiver starts listening to packets - * @returns OK or FAIL - */ - int startReceiver(); - - /** - * Stops the listening mode of receiver - * @returns OK or FAIL - */ - int stopReceiver(); - - /** - * Sets the receiver to start any readout remaining in the fifo and - * change status to transmitting (Mythen) - * The status changes to run_finished when fifo is empty - */ - runStatus startReceiverReadout(); - - /** - * Gets the status of the listening mode of receiver - * @returns status - */ - runStatus getReceiverStatus(); - - /** - * Gets the number of frames caught by receiver - * @returns number of frames caught by receiver - */ - int getFramesCaughtByReceiver(); - - /** - * Gets the number of frames caught by any one receiver (to avoid using threadpool) - * @returns number of frames caught by any one receiver (master receiver if exists) - */ - int getFramesCaughtByAnyReceiver(); - - /** - * Gets the current frame index of receiver - * @returns current frame index of receiver - */ - int getReceiverCurrentFrameIndex(); - - /** - * Resets framescaught in receiver - * Use this when using startAcquisition instead of acquire - * @returns OK or FAIL - */ - int resetFramesCaught(); - - /** - * Create Receiving Data Sockets - * @param destroy is true to destroy all the sockets - * @returns OK or FAIL - */ - int createReceivingDataSockets(const bool destroy = false); - - /** - * Reads frames from receiver through a constant socket - * Called during acquire() when call back registered or when using gui - */ - void readFrameFromReceiver(); - - /** - * Sets/Gets receiver file write enable - * @param enable 1 or 0 to set/reset file write enable - * @returns file write enable - */ - int enableWriteToFile(int enable=-1); - - /** - * Sets/Gets file overwrite enable - * @param enable 1 or 0 to set/reset file overwrite enable - * @returns file overwrite enable - */ - int overwriteFile(int enable=-1); - - /** - * Sets the read receiver frequency - * if data required from receiver randomly readRxrFrequency=0, - * else every nth frame to be sent to gui/callback - * @param freq is the receiver read frequency. Value 0 is 200 ms timer (other - * frames not sent), 1 is every frame, 2 is every second frame etc. - * @returns read receiver frequency - */ - int setReadReceiverFrequency(int freq=-1); - - /** - * Sets the read receiver timer - * if data required from receiver randomly readRxrFrequency=0, - * then the timer between each data stream is set with time_in_ms - * @param time_in_ms timer between frames - * @returns read receiver timer - */ - int setReceiverReadTimer(int time_in_ms=500); - - /** - * Enable data streaming to client - * @param enable 0 to disable, 1 to enable, -1 to get the value - * @returns data streaming to client enable - */ - int enableDataStreamingToClient(int enable=-1); - - /** - * Enable or disable streaming data from receiver to client - * @param enable 0 to disable 1 to enable -1 to only get the value - * @returns data streaming from receiver enable - */ - int enableDataStreamingFromReceiver(int enable=-1); - - /** - * Enable/disable or get data compression in receiver - * @param i is -1 to get, 0 to disable and 1 to enable - * @returns data compression in receiver - */ - int enableReceiverCompression(int i = -1); - - /** - * Enable/disable or 10Gbe - * @param i is -1 to get, 0 to disable and 1 to enable - * @returns if 10Gbe is enabled - */ - int enableTenGigabitEthernet(int i = -1); - - /** - * Set/get receiver fifo depth - * @param i is -1 to get, any other value to set the fifo deph - * @returns the receiver fifo depth - */ - int setReceiverFifoDepth(int i = -1); - - /** - * Set/get receiver silent mode - * @param i is -1 to get, 0 unsets silent mode, 1 sets silent mode - * @returns the receiver silent mode enable - */ - int setReceiverSilentMode(int i = -1); - - /** - * Opens pattern file and sends pattern to CTB - * @param fname pattern file to open - * @returns OK/FAIL - */ - int setCTBPattern(std::string fname); - - /** - * Writes a pattern word to the CTB - * @param addr address of the word, -1 is I/O control register, - * -2 is clk control register - * @param word 64bit word to be written, -1 gets - * @returns actual value - */ - uint64_t setCTBWord(int addr,uint64_t word=-1); - - /** - * Sets the pattern or loop limits in the CTB - * @param level -1 complete pattern, 0,1,2, loop level - * @param start start address if >=0 - * @param stop stop address if >=0 - * @param n number of loops (if level >=0) - * @returns OK/FAIL - */ - int setCTBPatLoops(int level,int &start, int &stop, int &n); - - /** - * Sets the wait address in the CTB - * @param level 0,1,2, wait level - * @param addr wait address, -1 gets - * @returns actual value - */ - int setCTBPatWaitAddr(int level, int addr=-1); - - /** - * Sets the wait time in the CTB - * @param level 0,1,2, wait level - * @param t wait time, -1 gets - * @returns actual value - */ - int setCTBPatWaitTime(int level, uint64_t t=-1); - - -private: - /** - * Initialize (open/create) shared memory for the sharedMultiDetector structure - * @param verify true to verify if shm size matches existing one - * @param update true to update last user pid, date etc - * @returns true if shared memory was created in this call, else false - */ - bool initSharedMemory(bool verify = true); - - /** - * Initialize detector structure for the shared memory just created - */ - void initializeDetectorStructure(); - - /** - * Initialize class members (and from parent classes) - * @param verify true to verify if shm size matches existing one - */ - void initializeMembers(bool verify = true); - - /** - * Update user details in detector structure - */ - void updateUserdetails(); - - /** - * Execute in command line and return result - * @param cmd command - * @returns result - */ - std::string exec(const char* cmd); - - /** - * Add sls detector - * @param s hostname of the single detector - */ - void addSlsDetector (std::string s); - - /** - * add gap pixels to the image (only for Eiger in 4 bit mode) - * @param image pointer to image without gap pixels - * @param gpImage poiner to image with gap pixels, if NULL, allocated inside function - * @returns number of data bytes of image with gap pixels - */ - int processImageWithGapPixels(char* image, char*& gpImage); - - - /** Multi detector Id */ - int detId; - - /** Shared Memory object */ - SharedMemory* sharedMemory; - - /** Shared memory structure */ - sharedMultiSlsDetector *thisMultiDetector; - - /** pointers to the slsDetector structures */ - std::vector detectors; - - /** data streaming (down stream) enabled in client (zmq sckets created) */ - bool client_downstream; - - /** ZMQ Socket - Receiver to Client */ - std::vector zmqSocket; - - /** Threadpool */ - ThreadPool* threadpool; -}; - - - -#endif diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h deleted file mode 100644 index 3711ac583..000000000 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorClient.h +++ /dev/null @@ -1,162 +0,0 @@ -#include -#include - - -#include "multiSlsDetector.h" -#include "multiSlsDetectorCommand.h" -#include "sls_receiver_exceptions.h" - - -#include - - -int dummyCallback(detectorData* d, int p,void*) { - cout << "got data " << p << endl; - return 0; -}; - -class multiSlsDetectorClient { - -public: - multiSlsDetectorClient(int argc, char *argv[], int action, multiSlsDetector *myDetector=NULL) { \ - std::string answer; \ - multiSlsDetectorCommand *myCmd; \ - int id = -1, pos = -1, iv = 0; \ - bool verify = true, update = true; \ - int del = 0; \ - char cmd[100] = ""; \ - - if (action==slsDetectorDefs::PUT_ACTION && argc<2) { \ - cout << "Wrong usage - should be: "<< argv[0] << \ - "[id-][pos:]channel arg" << endl; \ - cout << endl; \ - return; \ - if (del) delete myDetector; \ - }; \ - if (action==slsDetectorDefs::GET_ACTION && argc<1) { \ - cout << "Wrong usage - should be: "<< argv[0] << \ - "[id-][pos:]channel arg" << endl; \ - cout << endl; \ - if (del) delete myDetector; \ - return; \ - }; \ - - if (action==slsDetectorDefs::READOUT_ACTION) { \ - id = 0; \ - pos = -1; \ - if (argc) { \ - // multi id scanned - if (strchr(argv[0],'-')) { \ - iv=sscanf(argv[0],"%d-%s",&id, cmd); \ - //%s needn't be there (if not 1:), so 1 or 2 arguments scanned - if (iv >= 1 && id >= 0) { \ - argv[0] = cmd; \ - cout << id << "-" ; \ - } else { \ - id = 0; \ - } \ - } \ - // single id scanned - if (strchr(argv[0],':')) { \ - iv=sscanf(argv[0],"%d:",&pos); \ - if (iv == 1 && pos >= 0) { \ - cout << "pos " << pos << " is not allowed for readout!" << endl; \ - return; \ - } \ - } \ - } \ - } else { \ - // multi id scanned - iv=sscanf(argv[0],"%d-%s",&id, cmd); \ - // scan success - if (iv == 2 && id >= 0) { \ - argv[0] = cmd; \ - cout << id << "-" ; \ - } else { \ - id = 0; \ - } \ - // sls pos scanned - iv=sscanf(argv[0],"%d:%s", &pos, cmd); \ - // scan success - if (iv == 2 && pos >= 0) { \ - argv[0] = cmd; \ - cout << pos << ":" ; \ - } \ - if (iv != 2) { \ - pos = -1; \ - } \ - // remove the %d- and %d: - if (!strlen(cmd)) { \ - strcpy(cmd, argv[0]); \ - } \ - // special commands - std::string scmd = cmd; \ - // free without calling multiSlsDetector constructor - if (scmd == "free") { \ - if (pos != -1) \ - slsDetector::freeSharedMemory(id, pos); \ - else \ - multiSlsDetector::freeSharedMemory(id); \ - return; \ - } \ - // get user details without verify sharedMultiSlsDetector version - else if ((scmd == "user") && (action==slsDetectorDefs::GET_ACTION)) { \ - verify = false; \ - update = false; \ - myDetector=NULL; \ - } \ - } \ - - - - //cout<<"id:"<executeLine(argc, argv, action, pos); \ - } catch (const SlsDetectorPackageExceptions & e) { \ - /*cout << e.GetMessage() << endl; */ \ - delete myCmd; \ - if (del) delete myDetector; \ - return; \ - } catch (...) { \ - cout << " caught exception" << endl; \ - delete myCmd; \ - if (del) delete myDetector; \ - return; \ - } \ - if (action!=slsDetectorDefs::READOUT_ACTION) { \ - cout << argv[0] << " " ; \ - } \ - cout << answer<< endl; \ - delete myCmd; \ - if (del) delete myDetector; \ - }; - -}; - - - - - - - - - - - diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorCommand.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorCommand.h deleted file mode 100644 index f30d807f8..000000000 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetectorCommand.h +++ /dev/null @@ -1,72 +0,0 @@ - -#ifndef MULTI_SLS_DETECTOR_COMMAND_H -#define MULTI_SLS_DETECTOR_COMMAND_H - - -#include "slsDetector.h" -#include "multiSlsDetector.h" -#include "slsDetectorCommand.h" - - - -/** @short This class handles the command line I/Os, help etc. of the text clients */ - - -class multiSlsDetectorCommand : public slsDetectorCommand { - - public: - - - multiSlsDetectorCommand(multiSlsDetector *det) : slsDetectorCommand(det) {myDet=det;}; - - - /* /\** */ -/* executes a set of string arguments according to a given format. It is used to read/write configuration file, dump and retrieve detector settings and for the command line interface command parsing */ -/* \param narg number of arguments */ -/* \param args array of string arguments */ -/* \param action can be PUT_ACTION or GET_ACTION (from text client even READOUT_ACTION for acquisition) */ -/* \returns answer string */ -/* *\/ */ - - std::string executeLine(int narg, char *args[], int action, int id=-1) { \ - std::string s; \ - if (id>=0) { - slsDetector *d=myDet->getSlsDetector(id); \ - if (d) { \ - slsDetectorCommand *cmd=new slsDetectorCommand(d); \ - s=cmd->executeLine(narg, args, action); \ - if(d->getErrorMask()) \ - myDet->setErrorMask((myDet->getErrorMask())|(1<UNEAjye8i-KkU$dKkTh*fV%q_Y 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

QEBJdSkHKXwK`{H*B25*o zLVB!5W-I*;Li3yYrW?l@rr%p)oM>7r%t6Uk%L?NkCae(t8@~bZIrc42f$)?1%Z@y( zOsUzO_wKUIw8qG5L;+SNv-R&@ZG%Z(nbxz5%qs*}nHg)r#9gJ;%Gwm$Fx@)7;;Q$p zE!u{G+GX3HVJa(E6;XIZyw*>^gZ-y}4Z?>qe>Ki0}Z`}UvC(1lm5^g4 z8>T`1Qy9j&|Md4X`%X{IYVO*LmS5maR@@g@mmT2MdSuI;LbI@|{G$Eq!hhP$hJj+N zAI%2@v$n_{uci7M@ca)uqn%)Q$o_de>$KmrkHrcQr%l9PjrOFys5;GnQcXp6v-V+u z(LQ9)sV>4AQr5J(;uNgl9Zh8w&DEX49Tjg>kAY@4Z#-K%#-ewW<9ijiv2HeZ`I`0H z_iaonSFG*2Eky}0M6tGKVQtUC+MZpbm#ytOz0=ZSoen)9|A0IV#p`gb{aY1z9QVl{ zhp+apRUwaKi!j{d@YM<;!`vpngc+!Pv5fqzvm2C}|B$y|;}tLB?1uk<2T^5RoHp99mVIfdAI> zmSJs7VAz}?bUv(Z8P0+%+TK<+udrv-A#hc)2Qt3Dw{{PyYW?% z9A?$p)@+{xyPJg`*2`Sm^JtyfAUsw%7pEoVw(9EX)?KzMvx#bg43A;`DYuQ=_@pf} zSCM#2UW;`v>@Tf{0sE`)sA-s<7qGvXD*L<9wr^vaa1!>-4f}RkKC60Mw!2d?$~S8Z z1nUO!E6MVvSCKu+ggwfv(BylL>^P#c76>z}e}Y!kJUPDNO8M~(G0-i&Y_qXnux3_F zWF>R4z}&%EH?Ti6pQzL(WW(bA)wEhDgiRQ*+^E+Ye>irN;H`8Ej|pF`%#b~uQd|-5qxW0n-e8-|n+0##7;9IJRd1Z|kgycJjBg2I z-?2mR*bfPt>?g5WpRz0c>#`)&(aIUeZpH~2timoGzEX2?4OxgA;PuAdvBJ5HhPrR% z6`-EXwDIy9U}VcxtsF3sr?D(OzQ)Sl^lSWTe_z4VsNW3xwBELHSgOcvBvLN zG3Y-x_NF64-zAUmTmBK=Cv&|?Fq4N=zYlz`vz3DHrz6s_d?cQ(JS3DrH=lwR=;me# z{!xH7Y&Fxoo5!}AZNe)1W}!*%7JdqOn_=B=z~0>0t1llboWhu#$qnd@&e5C8)MN^5 z<+p4lwvVfywtX*``VxmFX^-WN19!7bagHomTVov^xins{nrXad`z4P)UVqQsCu|bZ zQT{2@I7mv8Zx;6X>;B!iJMu`2Hs><%TVsuj(%eF+kciy8Wu34P|1%S4%xJ_q(3fAe zpR#*P`z)B(YZCA_V_j~nvB(rC^M*+&b1d_I>t-Pi^QsCmag}5{=L#F)FYbZAxS)DH z{6$J#k$aCo645AE1aoc{$gkXJTU4#lmR1)Dc3YXO0X9=W60a-?$uSvxr{}gn!VK{G zIg>I%iKgjT(?sm0zs6AAh#ch7%t~Z0k0Z_kniZEzTKRFBP1pmS@KBPg=wG8b zq<>#Ck^VhzCJXbbf7Xnoe;(*TVBV7MO%8Ic%xrhAGE;UhKtDS7QrPLcR0l*^J{)xik}LtR9?Aef2)|6(n&A&*cSr zUE#kaFIo7xygHSlM3ZfoEe4~aht)94?^3akk0dc08_Pq~~Wly8-d7vI0BwKv(4sz1(akk``! zfiV`E5$F0woY7fQ5KrsaCT*5DF}A3ZYGo^LI5<6igB*3Tm3wW;_3Bb|j%1B(D~r=-nMmR*kT_MpOqMuD?nP?n6}vGeR-3=B*feZx>e?Q=casv=!NQ8NX-C+W4$(O8hQk znlLWD*!ZV3t&k(+3u>NdoZ{@s!sl$wwmI16-Hn~lul##Fwwlgt3Ndc~A>aLNGXBmy z)tV>hjFU~|IXtGpdEGs{xD?}+W1RtsHs~jriiNeX!8aXd{aN!@AaQDJLFFEQpYM@J z^X!ISz>ke}Jk661RHK&gI{ub9L!6JgmRPdI-`;Go4>?Sg*wZyPA+}?;X{vc^hCou@ z1sRisb++$A!gT9hLYDaD*v*w|){}SNVAD1v3weUJ{?GB>v`rKa*qV(E8)wE(6`GCv zZQJ5MdR^i3bfPDf*R_`@?*T4sbh51LbW@Ey3 z@_6pTcWHgP)T&z#vI(U@uV;nOE%yrI!q5R7xKV5Sa4#sJ>#=@arwAsz*GglI-eJ~W z^J=smCFj;#1!cUZXWo%F6>*Q<{yDG`a!PLdY@QL8B~`V4-zDtX@RpqB zLFALhOj*f~V|Q}FKZ^0#S5WkiBIu=<-;we2$($2!Kp}>%jX9H!__?-=b%w{!Ip#0L zsaCe~>*c3Q5Lte5V09q6uITP&xWMTN7dQ*`|IZ0d(dQ$3sWqfw2K(@T5xh#X zEkK*zzQ4q9){YWiE#5+u$5wss%^Z<;U(~$IH7ju18pGs>`I@gBS$yPXn~TYjTZofe z_&iFzQgRC|C_ePOmV7$ZVtQex86t^}?s#Gxc!};_2p* z<**UsgmAgDBV;*B8ZFU}EzXV0ACWy#L2k*G1;2d>XY8_aaO!*c5gOC3-MW?|rpeKB+F=s5h+we^iIw zLA7i{e4bkWvD`m2&U9)>T(GE=gLH$F3dLhgY0J+aF zjw$HnDQuEMS81ydHsw6~h08q7(imwxdv^V*iqAGb*vB(duCe76*X(CsX}{8*)7}6*I5zPM$I<_C%Q$C-LTZ!Hw8!mZZ| zOZBoW`SE+!=Lqo$u_i%4oE9_uYmBa{Ug+ra`Ih2@AeQ&l>+l|REWXlGg_e#du*T0a zZ?9j#8cp+1E(RWEJorcyDD|a;v+EQ+R^~aKbCxqR#Gczbj;Gx@9bWZvvk_Ws;gWT%>_%#YL83Nvc-b+263FdW-9 zfjB$4rLeEVhd7S(h*rVr`HIHV8}HLt3wnR)V-f})j5o~?1>Z@0mtN1WuA_W(kN)Hq z`d&QZaQxGEbA7jcwmSXxg_nQjyTA@)7GCc36&aJUqA*E?y|4R?SMp$Amkx9!q@Ag!|zWaX)h;_pk;n>NFq{Hi9NUu}#v&3DA`KQ6i3QPAu0;g+2_=Dt||}<~p7s$xnyRsah+8!G$v4PW37@(bw0G3wd^urZZztyQj6{>gargoBZvooZnb@*| zzSn)m?c*FQ&mw*q?}+7@Qr;oNuM#@ybF77EwaJLzn$uDKDa-lNah8-s0Vl2*;IZ71 zgx@33LSya{(hYi(<8V_A?i8E!;CU^+HM6V6aoEfzn{piS`c0_QVAPq`i09`R0ka!$ z^BQ%;HI(ohgk*!wf;!f(;U8~UXUM>q(D)S#d|ki$J&#T7Kf(Zn_8mu(TPtzH!;|1N zy3HXSILbeTaxYt+!{4LaI`%zJhN-G`xzT|3-bQ8go9zX? zCw-g&GB~uneLZnwu;@}ho zhY)q%9rH@tK>aK2Ypr<)iau|1lrbZ7%-GHkaW#w`rX{Rha#y~aR` zP57-4Sl;_vwLGOV#($*c$t%V$V9}@zYT+ks)B92xU4j9-nOE8y+^@Jllx?q$`AIu* zM0r{3uVcx>+lM=6`&=7Lw3}nuF($+1R3>}7;qR%;yAR^KM|~z{A6Cs7qMa#q4OS#? ziJqs_9oLY{zj}Aeks?RJc9zYtuzIRVXX5ZyKbMehDRdb5EX+BUMI>LJjQAzP;&%be zg>@`zFcr%!o<@u7T+D$Yw~i0-z#On`XPDpq_z!G%W(KeDsW#PfT9&w>W zPLp7?thMU5>x_lzr@Xo|g^5~Thq{ftEFt!+@8=bEY1EHIOMqP5D?0%#hQZnYYEsm%1 zjIk@N;c$;TwX~^*snNtc+G%ajR;8{nSM#{BcCXv@dQUs$YcT5)s?Gn0y?23+s=WGt zpSdKN3`3YeAOl3$pkP2Cn~~apm*xry=Ee{pf`u6}lZy^Xngj&jwgzeyt*t~vx!5*9 zFK8(u?Q6MJ(JJ~{Yt^<^@lqm}QeW$f)+(T||KGLuOfn$0wEy!t=X}opL^r>Ed9LfZ zt!J(Ethu&3cX%JJ8}+BdQ@g8%tA?aW$zT2sVKdHZK{)|nx&+mWuv|)FR^4ZX2r@Myv`ubP-KWMI6BfV{| z`;*KeMFqO6JQ*)*GuFM|T(ZW?`|Ef=xF|pNzO;~iSgJFlkN>Xu_v~;*-~OpP`lM@D zW*?1{k4HzVBKY9ENO%26xXxj=zR`mlfBZ;fwKr^MZttC|WDbe*(Q$t!4N1tg;FXWp zdiQAE8`V;{WU-*1rcczz>Us6Xp@&Y19s9IBm%{VoPs^54rJEe|H2tPMY3M_QdtPdB zf6PCBKW9Io>kXUG8fT5!cx>bH)MRhE|E9u0>&O0bB4bSU3YWvrU1svDy}J$BXLQtO zvKx@yLgH@Y+*Fcdsd!1{{JRX<n~kfx@@kCva&bYT=LyG^o>)>GlK79f10^Id(GHi=9T!emKM&yvL(a( z-p2QSgg;TA{fPKYydiMRspAYAa zDU}uu39hQPdj^xziv9Vw+Mh~yj(jS;XnX3wRd0-mLAY(0runisrpp^^nfXG4%_@CYgwZ;AG~s?lWf!yE{74{VCnX83%WSU6otq&q_eu4ygnNho=gAfJn$Pywvp4KApB+5El}YHZL7N$HnN&qx4Q6+(`7@ z97*4%-^yygG-+D5b8-ro%yRwodqV0^N9P(H-sq-tz9U(S5o4 z=*b#>7U4ZzDXe^+hIJ=1X#;rwOl>>oS`_D61~9+$(NC2hWAE_olx+6m*AKUGwFVyz zu4$IpVd0r1j|%3d$UT0j!ny9;6mLjRPVw}~5-CY0@2k#yZN@I`A zws-A1wtXjddRvZq)wiRSda>SEzn-}y=(PoJ;B-pv8EZC?nJ4x~+Rpt@v?891v;s15 z{$0NRiRH`p=dZ}0?cAT57mM*Pg#Wuax7qymNnX!ncFvXlok!{0&GrTd(&0dGgvR-q zx{BaLcY20v-HUm)D)djv<-W}8+Tif?hesaOa6{@P-ahb`UxBw7?sZ@z!aFRNQltGg zID(XWt@6B?Ik#_mRweo-(0Mx z&(qf7i)4_;pIy-rSsqFY|7EU^8NlVz)@5bncR&BUt@}66BM%#ts}HZZrBL38v_;-4(t)lCz-*-&NWEuY~%BFY24Vp>Ono;dA_Rn;)7h5-lh7`|0V)n_bw! z8i)4(-RnOX?4zC7kqa`iQ-j@=&^Bdk_pvhv z_uM}>g&871=%M{OnB8O_oyaLLD*Y$xSL}anxz}&`?v#wHhty4HHP5zin0W}Z)^&KV%=KIb-OiU+CQ`U~UT5e1_~+!EoR#T6zRL^G zl9FK@D*Mpu57Kt_2BBMlZmm(4%+i6Z{rbc>RBv6j1s4^sUd%tPh9K>xIMUC$d&{t=f*3Wotr2ew1XJ_>Z z-!&`8otBjoxGv;!53kBik#avAkaG7W?m{)mJs@k6`8B1dRlJ?I&6IFIH^V{ULlv~F zMgMp`7OHF9uB@*IthMBaN$TzGX5SOZ>(i{|%HLfpeJQ)s7cQx;3EJF2WMu`NBQ&M@ zcix#gG>h}Hkrk=lj2T<=p}?xHl~AB_YgHFdzLM?C)vMjQLvshbtLN$i0>SW@)vV4c zu(iPRr%Y=$lHL7(n|phOb~mXZ)S05?>%nje^I4<6lypyK7HIjNJYQX~QU7CAYG+y? z2^-DajOkS(eJl3p*yR%5H7?_!t=XMI`x$%fT4;5C)t!4sl3U5vJWsk$L61THRda9F zuSAwnOsEDz1qt=dy;c5x+7N%SXWiVYy=(S5d^hlA;p#lb?h5W^_|sQ=wN3SZoRR5Y z7%ukoUp>PN)lB^^U7hc-`|jLp^}L@zH<_POIa?@vpDS38X9XWC+1}Ip_M`^A-2H;H z+_vCK?sl9$hz;`Xc&q84Pdu?p!fiSI(k==0gVQU6;)SQ{^oiPH_?e3{Y-T!ZPut8? z?gb@{Rh$pE##&zY8x!-p4^J%UJ~ollgcI=vKhZAthsG+Aj;ljan^l%2r>&B-p2mmP z_DZC0-Su`x>2tPRPK6xj#D<8IoQ|HS zUwA}V_C@LblR5puEB0r0*hqCjKjp9VcSntSuRnS9q;99mpENSs@m-!*r+7X=TX7Y$ z$W@b*uvF@gY}sKGT8g!V=vD5TgxBavcuSpx=jchNlU(rY4&)HW`;GA@BWLXA|27uQ zXrbWRr*{{TQqkl9eZZb&?lpNXF`tuslIkxRw-!q3(zC5TXg$ai_3-d$#LpKcJD zw`T~NSQ*FG=tSb+l_#uKxO(#2NPZjH^<+sZR$h{p@G0mG8QZy(D0lLS%@Vi7EZt7- zN3g#d>o0){E-p`W;r#s7H+1^-t2ckzJOe4s59b%GHV*AH(wLu0CXvS^SEqM%d1tXF z15XrHys4TrYqhI$8GQ1u`cQJ-luZ)Onw`dKyEcp5iY71JEY$I?z7|UM;S$OURjD-#`w7(S8(qi=ot>$th9@zm`}#xb!edPD-tv7n7kfxrK+bL@QmOZyhniUJ zo<^$|=^=>ZP0Q|nOm)TfT@F>#a5iUB^ZsW!6ZZEeZL{?>Y+{oAy)jM>Hx7NtjNx7V zH};qo-*EFI+Z(&YitKo!H^?nZaPA>S7Ou`D6aH4jgwqpP0 zK38qZ?%t<9*;s(~xL2ob9C8rud^+to?=p{Cp3NJ*bNqaDi-&Jj!WkvKk%KI*&DI_c_c$qN~Aq5pIvxh;>qqW)zmr;GRynZB;)NHjoy7)Tn{>S&DatT z?R+uREuo#6hoDXN{U>V2@;lbz8(?Tw|C02K#*HFJa%8x%;186zu$=U=QuV}gK&>HZaXpRFnBpF!`m zd0pw9j*Qa6WQ`}g*Y#|H3;NlD1GSoxq%3AAWbpmun=QQ)31dcTPso*K$dl#qd5keg z>UK^6DBH~&2NTx2p`XT+YcQ?rT^-o&GV@56FZbKExUV{yvy#+Ro3s5Qqq^0Tmhpqa z6`nrq{#M4U!0s=6W~ThYn?thℑHz-r&L3);Lt~-f?_y$o}J7@A>?FqJ_HVO3L6| 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 I?CsS3f3U=Yj{pDw diff --git a/slsDetectorSoftware/mythen3DetectorServer/mythen3Server.gdb b/slsDetectorSoftware/mythen3DetectorServer/mythen3Server.gdb deleted file mode 100755 index 4d4b23a68f2b4622c59812d318f09c797cf3a8e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 435662 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

4U3 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

KwaQwil$H)+f1OMsUf&s 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 diff --git a/slsDetectorSoftware/mythen3DetectorServer/programfpga.h b/slsDetectorSoftware/mythen3DetectorServer/programfpga.h deleted file mode 120000 index 72c54d21d..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/programfpga.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/programfpga.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.c deleted file mode 100644 index b31416c6a..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.c +++ /dev/null @@ -1,1304 +0,0 @@ -//#ifdef SLS_DETECTOR_FUNCTION_LIST - - -#include "slsDetectorFunctionList.h" -#include "gitInfoMythen3.h" - - -#include "AD9257.h" // include "commonServerFunctions.h", which in turn includes "blackfin.h" -#include "programfpga.h" -#include "RegisterDefs.h" - -/* global variables */ -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -dacs_t *detectorDacs=NULL; -dacs_t *detectorAdcs=NULL; - -enum detectorSettings thisSettings; -enum masterFlags masterMode = NO_MASTER; -int32_t clkPhase[2] = {0, 0}; -int vlimit = -1; - - - -/* basic tests */ - -void checkFirmwareCompatibility(int flag) { - - defineGPIOpins(); - resetFPGA(); - if (mapCSP0() == FAIL) { - cprintf(BG_RED, "Dangerous to continue. Goodbye!\n"); - exit(EXIT_FAILURE); - } - - // does check only if flag is 0 (by default), set by command line - if ((!flag) && ((checkType() == FAIL) || (testFpga() == FAIL) || (testBus() == FAIL))) { - cprintf(BG_RED, "Dangerous to continue. Goodbye!\n"); - exit(EXIT_FAILURE); - } - - uint32_t ipadd = getDetectorIP(); - uint64_t macadd = getDetectorMAC(); - int64_t fwversion = getDetectorId(DETECTOR_FIRMWARE_VERSION); - int64_t swversion = getDetectorId(DETECTOR_SOFTWARE_VERSION); - //int64_t sw_fw_apiversion = getDetectorId(SOFTWARE_FIRMWARE_API_VERSION); - cprintf(BLUE,"\n\n" - "********************************************************\n" - "****************** Mythen3 Server *********************\n" - "********************************************************\n\n" - - "Detector IP Addr:\t\t 0x%x\n" - "Detector MAC Addr:\t\t 0x%llx\n" - - "Firmware Version:\t\t 0x%llx\n" - "Software Version:\t\t 0x%llx\n" - //"F/w-S/w API Version:\t\t 0x%llx\n" - //"Required Firmware Version:\t 0x%x\n" - "\n" - "********************************************************\n", - hversion, hsnumber, - ipadd, macadd, - fwversion, swversion - //, sw_fw_apiversion, REQUIRED_FIRMWARE_VERSION - ); - - -/* - * printf("Testing firmware capability... "); - //cant read versions - if(!fwversion || !sw_fw_apiversion){ - cprintf(RED,"FATAL ERROR: Cant read versions from FPGA. Please update firmware\n"); - cprintf(RED,"Exiting Server. Goodbye!\n\n"); - exit(-1); - } - - //check for API compatibility - old server - if(sw_fw_apiversion > REQUIRED_FIRMWARE_VERSION){ - cprintf(RED,"FATAL ERROR: This software version is incompatible.\n" - "Please update it to be compatible with this firmware\n\n"); - cprintf(RED,"Exiting Server. Goodbye!\n\n"); - exit(-1); - } - - //check for firmware compatibility - old firmware - if( REQUIRED_FIRMWARE_VERSION > fwversion){ - cprintf(RED,"FATAL ERROR: This firmware version is incompatible.\n" - "Please update it to v%d to be compatible with this server\n\n", REQUIRED_FIRMWARE_VERSION); - cprintf(RED,"Exiting Server. Goodbye!\n\n"); - exit(-1); - } -*/ -} - - -int checkType() { - volatile u_int32_t type = ((bus_r(FPGA_VERSION_REG) & DETECTOR_TYPE_MSK) >> DETECTOR_TYPE_OFST); - if (type != JUNGFRAUCTB){ - cprintf(BG_RED,"This is not a Mythen 3 Server (read %d, expected %d)\n",type, JUNGFRAUCTB); - return FAIL; - } - - return OK; -} - - - -u_int32_t testFpga(void) { - printf("\nTesting FPGA...\n"); - - //fixed pattern - int ret = OK; - volatile u_int32_t val = bus_r(FIX_PATT_REG); - if (val == FIX_PATT_VAL) { - printf("Fixed pattern: successful match 0x%08x\n",val); - } else { - cprintf(RED,"Fixed pattern does not match! Read 0x%08x, expected 0x%08x\n", val, FIX_PATT_VAL); - ret = FAIL; - } - return ret; -} - - -int testBus() { - printf("\nTesting Bus...\n"); - - int ret = OK; - u_int32_t addr = SET_DELAY_LSB_REG; - int times = 1000 * 1000; - int i = 0; - - for (i = 0; i < times; ++i) { - bus_w(addr, i * 100); - if (i * 100 != bus_r(SET_DELAY_LSB_REG)) { - cprintf(RED,"ERROR: Mismatch! Wrote 0x%x, read 0x%x\n", i * 100, bus_r(SET_DELAY_LSB_REG)); - ret = FAIL; - } - } - - if (ret == OK) - printf("Successfully tested bus %d times\n", times); - return ret; -} - - - - -int detectorTest( enum digitalTestMode arg){ - switch(arg){ - case DETECTOR_FIRMWARE_TEST: return testFpga(); - case DETECTOR_BUS_TEST: return testBus(); - default: - cprintf(RED,"Warning: Test not implemented for this detector %d\n", (int)arg); - break; - } - return OK; -} - - - - - -/* Ids */ - -int64_t getDetectorId(enum idMode arg){ - int64_t retval = -1; - - switch(arg){ - case DETECTOR_SERIAL_NUMBER: - retval = getDetectorMAC(); - break; - case DETECTOR_FIRMWARE_VERSION: - retval = getFirmwareVersion(); - break; - //case SOFTWARE_FIRMWARE_API_VERSION: - //return GetFirmwareSoftwareAPIVersion(); - case DETECTOR_SOFTWARE_VERSION: - retval= GITREV; - retval= (retval <<32) | GITDATE; - break; - default: - break; - } - - return retval; -} - -u_int64_t getFirmwareVersion() { - return ((bus_r(FPGA_VERSION_REG) & BOARD_REVISION_MSK) >> BOARD_REVISION_OFST); -} - - - -u_int64_t getDetectorMAC() { - char output[255],mac[255]=""; - u_int64_t res=0; - FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - return res; -} - -u_int32_t getDetectorIP(){ - char temp[50]=""; - u_int32_t res=0; - //execute and get address - char output[255]; - FILE* sysFile = popen("ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - - //converting IPaddress to hex. - char* pcword = strtok (output,"."); - while (pcword != NULL) { - sprintf(output,"%02x",atoi(pcword)); - strcat(temp,output); - pcword = strtok (NULL, "."); - } - strcpy(output,temp); - sscanf(output, "%x", &res); - //printf("ip:%x\n",res); - - return res; -} - - - - - - - - -/* initialization */ - -void initControlServer(){ - clkPhase[0] = 0; clkPhase[1] = 0; - setupDetector(); - printf("\n"); -} - - - -void initStopServer() { - - usleep(CTRL_SRVR_INIT_TIME_US); - if (mapCSP0() == FAIL) { - cprintf(BG_RED, "Stop Server: Map Fail. Dangerous to continue. Goodbye!\n"); - exit(EXIT_FAILURE); - } -} - - - - - - -/* set up detector */ - -void allocateDetectorStructureMemory(){ - printf("This Server is for 1 Jungfrau module (500k)\n"); - - //Allocation of memory - if (detectorModules!=NULL) free(detectorModules); - if (detectorChans!=NULL) free(detectorChans); - if (detectorChips!=NULL) free(detectorChips); - if (detectorDacs!=NULL) free(detectorDacs); - if (detectorAdcs!=NULL) free(detectorAdcs); - detectorModules=malloc(sizeof(sls_detector_module)); - detectorChips=malloc(NCHIP*sizeof(int)); - detectorChans=malloc(NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(NDAC*sizeof(dacs_t)); - detectorAdcs=malloc(NADC*sizeof(dacs_t)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); - printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); - printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); -#endif - (detectorModules)->dacs=detectorDacs; - (detectorModules)->adcs=detectorAdcs; - (detectorModules)->ndac=NDAC; - (detectorModules)->nadc=NADC; - (detectorModules)->nchip=NCHIP; - (detectorModules)->nchan=NCHIP*NCHAN; - (detectorModules)->module=0; - (detectorModules)->gain=0; - (detectorModules)->offset=0; - (detectorModules)->reg=0; - thisSettings = UNINITIALIZED; - - // if trimval requested, should return -1 to acknowledge unknown - int ichan=0; - for (ichan=0; ichan<(detectorModules->nchan); ichan++) { - *((detectorModules->chanregs)+ichan) = -1; - } -} - - - -void setupDetector() { - - allocateDetectorStructureMemory(); - - resetPLL(); - resetCore(); - resetPeripheral(); - cleanFifos(); - - //initialize dac series - initDac(0); - initDac(8); - initDac(16); - - //set dacs - printf("Setting Default Dac values\n"); - { - int i = 0; - int retval[2]={-1,-1}; - const int defaultvals[NDAC] = DEFAULT_DAC_VALS; - for(i = 0; i < NDAC; ++i) { - setDAC((enum DACINDEX)i,defaultvals[i],0,0,retval); - if (retval[0] != defaultvals[i]) - cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); - } - } - - /*setSamples(1); - bus_w(DAC_REG,0xffff); - setSpeed - cleanFifos(); /* todo might work without - resetCore(); /* todo might work without */ - - //Initialization of acquistion parameters - setTimer(FRAME_NUMBER, DEFAULT_NUM_FRAMES); - setTimer(CYCLES_NUMBER, DEFAULT_NUM_CYCLES); - setTimer(ACQUISITION_TIME, DEFAULT_EXPTIME); - setTimer(FRAME_PERIOD, DEFAULT_PERIOD); - setTimer(DELAY_AFTER_TRIGGER, DEFAULT_DELAY); -} - - - - - - - -/* firmware functions (resets) */ - -int powerChip (int on){ - - /* set all the required voltages */ - return 0; -} - - -void cleanFifos() { printf("\nClearing Acquisition Fifos - Not doing anything\n"); - /* printf("\nClearing Acquisition Fifos\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_ACQ_FIFO_CLR_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_ACQ_FIFO_CLR_MSK);*/ -} - -void resetCore() {printf("\nResetting Core - Not doing anything\n"); - /*printf("\nResetting Core\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_CORE_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_CORE_RST_MSK);*/ -} - -void resetPeripheral() {printf("\nResetting Peripheral - Not doing anything\n"); - /* printf("\nResetting Peripheral\n"); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_PERIPHERAL_RST_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_PERIPHERAL_RST_MSK);*/ -} - -int getPhase(int i) { - if (i>=0 && i<4) - return clkPhase[i]; - else - return -1; -} - - -int configurePhase(int val, int i) { /** compare with old jungfrau software and add in */ - - u_int32_t l=0x0c; - u_int32_t h=0x0d; - u_int32_t vv; - int32_t phase=0, inv=0; - - u_int32_t tot; - u_int32_t odd=1;//0; - - if (i<0 || i>3) - return -1; - - if (val>65535 || val<-65535) - return clkPhase[i]; - - resetPLL(); - - setPllReconfigReg(PLL_MODE_REG, 1, 0); - printf("phase in %d\n",clkPhase[1]); - - if (val>0) { - inv=0; - phase=val&0xffff; - } else { - inv=0; - val=-1*val; - phase=(~val)&0xffff; - } - - - vv=phase | (i<<16);// | (inv<<21); - - setPllReconfigReg(PLL_PHASE_SHIFT_REG,vv,0); - - clkPhase[i]=val; - return clkPhase[i]; -} - - - -int configureFrequency(int val, enum CLKINDEX i) { /** compare with old jungfrau software and add in */ - - - u_int32_t l=0x0c; - u_int32_t h=0x0d; - u_int32_t vv; - int32_t phase=0, inv=0; - - u_int32_t tot; - u_int32_t odd=1;//0; - printf("Want to configure frequency of counter %d to %d\n",i,val); - // printf("PLL reconfig reset\N"); bus_w(PLL_CNTRL_REG,(1<3) { - printf("wrong counter number %d\n",i); - return -1; - } - - if (val<=0) { - - printf("get value %d %d \n",i,clkDivider[i]); - return clkDivider[i]; - } - if (i==adc_clk_c){ - if (val>40) - { - printf("Too high frequency %d MHz for these ADCs!\n", val); - return clkDivider[i]; - } - } - - tot= PLL_VCO_FREQ_MHZ/val; - l=tot/2; - h=l; - if (tot>2*l) { - h=l+1; - odd=1; - } - else - { - odd=0; - } - - printf("Counter %d: Low is %d, High is %d\n",i, l,h); - - - vv= (i<<18)| (odd<<17) | l | (h<<8); - - printf("Counter %d, val: %08x\n", i, vv); - setPllReconfigReg(PLL_C_COUNTER_REG, vv,0); - - - usleep(10000); - - resetPLL(); - - clkDivider[i]=PLL_VCO_FREQ_MHZ/(l+h); - - printf("Frequency of clock %d is %d\n", i, clkDivider[i]); - - return clkDivider[i]; -} - - - - - - - - -/* set parameters - nmod, dr, roi */ - -int setNMod(int nm, enum dimension dim){ - return NMOD; -} - - -int getNModBoard(enum dimension arg){ - return NMAXMOD; -} - - -int setDynamicRange(int dr){ - /* edit functionality */ - return 16; -} - - - - -/* parameters - readout */ - -int setSpeed(enum speedVariable arg, int val) { - int retval = -1; - - switch (arg) { - case DBIT_PHASE: - if (val==-1) - retval=getPhase(DBIT_CLK_C); - else - retval=configurePhase(val,DBIT_CLK_C); - break; - case DBIT_CLOCK: - retval=configureFrequency(val,DBIT_CLK_C); - if (configureFrequency(-1,SYNC_CLK_C)>retval){ - configureFrequency(retval,SYNC_CLK_C); - printf("--Configuring sync clk to %d MHz\n",val); - } else if (configureFrequency(-1,ADC_CLK_C)>retval && configureFrequency(-1,RUN_CLK_C)>retval) { - printf("++Configuring sync clk to %d MHz\n",val); - configureFrequency(retval,SYNC_CLK_C); - } - break; - default: - sprintf(mess,"Unknown speed parameter %d",arg); - break; - } - return retval; -} - - - - - - -/* parameters - timer */ - -int64_t setTimer(enum timerIndex ind, int64_t val) { - - int64_t retval = -1; - switch(ind){ - - case FRAME_NUMBER: - if(val >= 0) - printf("\nSetting #frames: %lld\n",(long long int)val); - retval = set64BitReg(val, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); - printf("Getting #frames: %lld\n",(long long int)retval); - break; - - case ACQUISITION_TIME: - if(val >= 0){ - printf("\nSetting exptime: %lldns\n", (long long int)val); - val *= (1E-3 * CLK_RUN); /* ?? */ - } - retval = set64BitReg(val, SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / (1E-3 * CLK_RUN); - printf("Getting exptime: %lldns\n", (long long int)retval); - break; - - case FRAME_PERIOD: - if(val >= 0){ - printf("\nSetting period to %lldns\n",(long long int)val); - val *= (1E-3 * CLK_SYNC); /* ?? */ - } - retval = set64BitReg(val, SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG )/ (1E-3 * CLK_SYNC); - printf("Getting period: %lldns\n", (long long int)retval); - break; - - case DELAY_AFTER_TRIGGER: - if(val >= 0){ - printf("\nSetting delay to %lldns\n", (long long int)val); - val *= (1E-3 * CLK_SYNC); /* ?? */ - } - retval = set64BitReg(val, SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting delay: %lldns\n", (long long int)retval); - break; - - case CYCLES_NUMBER: - if(val >= 0) - printf("\nSetting #cycles to %lld\n", (long long int)val); - retval = set64BitReg(val, SET_CYCLES_LSB_REG, SET_CYCLES_MSB_REG); - printf("Getting #cycles: %lld\n", (long long int)retval); - break; - - case GATES_NUMBER: - if(val >= 0) - printf("\nSetting #gates to %lld\n", (long long int)val); - retval = set64BitReg(val, SET_GATES_LSB_REG, SET_GATES_MSB_REG); - printf("Getting #gates: %lld\n", (long long int)retval); - break; - - case PROBES_NUMBER: /* does not exist in firmware_funcs.c*/ - /*if(val >= 0) - printf("\nSetting #probes to %lld\n", (long long int)val); - retval = set64BitReg(val, SET_PROBES_LSB_REG, SET_PROBES_MSB_REG); - printf("Getting #probes: %lld\n", (long long int)retval); - */ - break; - - case SAMPLES_JCTB: - if(val >= 0) - printf("\nSetting #samples to %lld\n", (long long int)val); - retval = bus_w(NSAMPLES_REG, val); - printf("Getting #samples: %lld\n", (long long int)retval); - - break; - - default: - cprintf(RED,"Warning: Timer Index not implemented for this detector: %d\n", ind); - break; - } - - return retval; - -} - - - -int64_t getTimeLeft(enum timerIndex ind){ - int64_t retval = -1; - switch(ind){ - - case FRAME_NUMBER: - retval = get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); - printf("Getting number of frames left: %lld\n",(long long int)retval); - break; - - case FRAME_PERIOD: - retval = get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting period left: %lldns\n", (long long int)retval); - break; - - case DELAY_AFTER_TRIGGER: - retval = get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / (1E-3 * CLK_SYNC); - printf("Getting delay left: %lldns\n", (long long int)retval); - break; - - /** acquisition time and period gives in time left in func.c, pls check with anna */ - - case CYCLES_NUMBER: - retval = get64BitReg(GET_CYCLES_LSB_REG, GET_CYCLES_MSB_REG); - printf("Getting number of cycles left: %lld\n", (long long int)retval); - break; - - case ACTUAL_TIME: - retval = get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG) / (1E-9 * CLK_SYNC); - printf("Getting actual time (time from start): %lld\n", (long long int)retval); - break; - - case MEASUREMENT_TIME: - retval = get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG) / (1E-9 * CLK_SYNC); - printf("Getting measurement time (timestamp/ start frame time): %lld\n", (long long int)retval); - break; - - case FRAMES_FROM_START: - retval = get64BitReg(FRAMES_FROM_START_LSB_REG, FRAMES_FROM_START_MSB_REG); - printf("Getting frames from start run control %lld\n", (long long int)retval); - break; - - case FRAMES_FROM_START_PG: /** ask anna, seems to be calling previous function (frames_from_start) */ - retval = get64BitReg(FRAMES_FROM_START_PG_LSB_REG, FRAMES_FROM_START_PG_MSB_REG); - printf("Getting frames from start run control %lld\n", (long long int)retval); - break; - - default: - cprintf(RED, "Warning: Remaining Timer index not implemented for this detector: %d\n", ind); - break; - } - - return retval; -} - - - - - - -/* parameters - channel, chip, module, settings */ - - -int setModule(sls_detector_module myMod){ - return thisSettings; -} - - -int getModule(sls_detector_module *myMod){ - return OK; -} - - - -enum detectorSettings setSettings(enum detectorSettings sett, int imod){ - return getSettings(); - -} - - -enum detectorSettings getSettings(){ - return thisSettings; -} - - - - - -/* parameters - dac, adc, hv */ - - - - - - -void initDac(int dacnum) { - printf("\nInitializing dac for %d to \n",dacnum); - - u_int32_t codata; - int csdx = dacnum / NDAC_PER_SET + DAC_SERIAL_CS_OUT_OFST; //,so can be DAC_SERIAL_CS_OUT_OFST or +1 - int dacchannel = 0xf; // all channels - int dacvalue = 0x6; // can be any random value (just writing to power up) - printf(" Write to Input Register\n" - " Chip select bit:%d\n" - " Dac Channel:0x%x\n" - " Dac Value:0x%x\n", - csdx, dacchannel, dacvalue); - - codata = LTC2620_DAC_CMD_WRITE + // command to write to input register - ((dacchannel << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) + // all channels - ((dacvalue << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK); // any random value - serializeToSPI(SPI_REG, codata, (0x1 << csdx), LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); -} - - - - - - - - - -int voltageToDac(int value){ - int vmin = 0; - int vmax = MAX_DACVOLTVAL; - int nsteps = MAX_DACVAL; - if ((value < vmin) || (value > vmax)) { - cprintf(RED,"Voltage value (to convert to dac value) is outside bounds: %d\n", value); - return -1; - } - return (int)(((value - vmin) / (vmax - vmin)) * (nsteps - 1) + 0.5); -} - -int dacToVoltage(unsigned int digital){ - int vmin = 0; - int vmax = MAX_DACVOLTVAL; - int nsteps = MAX_DACVAL; - int v = vmin + (vmax - vmin) * digital / (nsteps - 1); - if((v < 0) || (v > nsteps - 1)) { - cprintf(RED,"Voltage value (converted from dac value) is outside bounds: %d\n", v); - return -1; - } - return v; -} - -int powerToDac(int value, int chip) { - int nsteps = MAX_DACVAL; - int vchip = MAX_VCHIPVAL - (getDacRegister(V_CHIP)*1000)/(nsteps -1); - printf("Current V_Chip: %d mV\n",vchip); - - int vmax = vchip - MIN_VCHIP_OFSTVAL; - int vmin = MIN_VCHIP_VAL; - - // recalculating only for v_chip - if (chip) { - printf("vchip\n"); - vmax = MAX_VCHIPVAL; - vmin = MAX_VCHIPVAL - 1000; - } - else - printf("vpower\n"); - - int v = (int)(((vmax - value) * (nsteps - 1) / (vmax - vmin)) ); /***+0.5 removed is this correct? seems different from voltageToDac maybe get rid of 0.5*/ - - - if (v < 0) v = 0; - if (v > nsteps - 1) v = nsteps - 1; - if (value == -100) v = -100; - - return v; -} - -int dacToPower(int value, int chip) { - int retval1 = -1; - int nsteps = MAX_DACVAL; - int vchip = MAX_VCHIPVAL - (getDacRegister(V_CHIP)*1000)/(nsteps -1); - printf("Vchip id %d mV\n",vmax); - int vmax = vchip - MIN_VCHIP_OFSTVAL; - int vmin = MIN_VCHIP_VAL; - - // recalculating only for v_chip - if (chip) { - printf("vchip\n"); - vmax = MAX_VCHIPVAL; - vmin = MAX_VCHIPVAL - 1000; - } - else - printf("vpower\n"); - - retval1 = vmax - (value * (vmax - vmin)) / (nsteps - 1); - if (retval1 > vmax) retval1 = vmax; - if (retval1 < vmin) retval1 = vmin; - if (value < 0) retval1 = value; - return retval1; -} - - - -void setDAC(enum DACINDEX ind, int val, int imod, int mV, int retval[]){ - - int dacval = val; - - // dacs: if set and mv, convert to dac - if (ind < val > 0 && mV) { - val = voltageToDac(val); //gives -1 on error - } - - - if ( (val >= 0) || (val == -100)) { - - - u_int32_t ichip = 2 - ind / NDAC_PER_SET; - u_int32_t valw = 0; - int i; - - // start and chip select bar down ----------------- - SPIChipSelect (&valw, SPI_REG, (0x1 << csdx)); - - - // next dac -------------------------------------- - for (i = 0; i < ichip; ++i) { - printf("%d next DAC\n", i); - sendDataToSPI (&valw, SPI_REG, LTC2620_DAC_CMD_MSK, LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); - } - - - // this dac ---------------------------------------- - u_int32_t codata; - int csdx = DAC_SERIAL_CS_OUT_OFST; - int dacchannel = ind % NDAC_PER_SET; - - printf("\nSetting of DAC %d : %d dac units (%d mV)\n",ind, dacval, val); - // command - if (val >= 0) { - printf(" Write to Input Register and Update\n"); - codata = LTC2620_DAC_CMD_SET; - - } else if (val == -100) { - printf(" POWER DOWN\n"); - codata = LTC2620_DAC_CMD_POWER_DOWN; - } - // address - printf(" Chip select bit:%d\n" - " Dac Channel:0x%x\n" - " Dac Value:0x%x\n", - csdx, dacchannel, val); - codata += ((dacchannel << LTC2620_DAC_ADDR_OFST) & LTC2620_DAC_ADDR_MSK) + - ((val << LTC2620_DAC_DATA_OFST) & LTC2620_DAC_DATA_MSK); - // to spi - serializeToSPI(SPI_REG, codata, (0x1 << csdx), LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); - - - printf("--------done setting dac set %d \n",i); - - // next dac ----------------------------------------------------------- - for (i = ichip+1; i < (N_DAC / NDAC_PER_SET); ++i) { - printf("%d next DAC\n", i); - sendDataToSPI (&valw, SPI_REG, LTC2620_DAC_CMD_MSK, LTC2620_DAC_NUMBITS, - DAC_SERIAL_CLK_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_MSK, DAC_SERIAL_DIGITAL_OUT_OFST); - } - - - //chip select bar up, clk down and stop -------------------------------- - SPIChipDeselect (&valw, SPI_REG, (0x1 << csdx), DAC_SERIAL_CLK_OUT_MSK); - - // writes to register - setDacRegister(ind, dacval); - } - - // reading dac value from register - printf("Getting DAC %d : ",ind); - retval[0] = getDacRegister(ind); printf("%d dac units ", retval[0]); - retval[1] = dacToVoltage(retval[0]);printf("(%d mV)\n", retval[1]); -} - - -int setPower(enum DACINDEX ind, int val) { - - // not implemented yet - if ((ind == V_D) || (ind == V_C)) - return -1; - - // vlimit software limit - else if (ind == V_LIMIT) { - if (val >= 0) - vlimit = val; - return vlimit; - } - - int pwrindex = -1; - int dacval = val; - int retval=-1, retval1=-1; - u_int32_t preg = 0; - int temp[2] = {-1,-1}; - - // get - if (val == -1) - dacval = -1; - - // vchip - else if (ind == V_CHIP) - dacval = powerToDac(val, 1); - - // power a, b, c , d, io - else { - dacval = powerToDac(val, 0); - - switch (ind) { - case V_IO: pwrindex = 0;break; - case V_A: pwrindex = 1; break; - case V_B: pwrindex = 2; break; - default:break; - } - - // shut down - preg = bus_r(POWER_ON_REG); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - printf("Switching off power %d\n", ind); - bus_w(POWER_ON_REG,preg &(~(1 << (POWER_ENABLE_OFST + pwrindex)))); - setDac(ind,-100, 0, 1, temp); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - retval=0; - } - - // actual setting - if (val != -100) { - printf("Setting power %d to %d mV (%d dac val)\n",ind, val, dacval); - retval = setDac(ind, dacval); - // setting power a, b, c, d, io - if (pwrindex >= 0 && dacval >= 0 ) { - preg = bus_r(POWER_ON_REG); - printf("power reg is %08x\n", bus_r(POWER_ON_REG)); - printf("Switching on power %d\n", pwrindex); - bus_w(POWER_ON_REG, preg | ((1 << (POWER_ENABLE_OFST + pwrindex)))); - printf("power reg is %08x\n",bus_r(POWER_ON_REG)); - } - } - - if (pwrindex >= 0) { - if (bus_r(POWER_ON_REG) & (1 << (POWER_ENABLE_OFST + pwrindex))) { - retval1 = dacToPower(retval, 0); - printf("Vdac id %d mV\n",retval1); - } else - retval1 = 0; - } else { - if (retval >= 0) { - retval1 = dacToPower(retval, 1); - /*printf("Vchip is %d mV\n",vmax); makes no sense.. should be printing retval1??? */ - } else - retval1=-1; - } - - return retval1; -} - -int getVLimit() { - return vlimit; -} - -void setDacRegister(int dacnum,int dacvalue) { - bus_w(DAC_NUM_REG, dacnum); - bus_w(DAC_VAL_REG, dacvalue); - bus_w(DAC_NUM_REG, dacnum | (1<<16));/** super strange writing dac num in weird ways */ - bus_w(DAC_NUM_REG, dacnum); - printf("Wrote dac register value %d address %d\n",bus_r(DAC_VAL_REG),bus_r(DAC_NUM_REG)) ; -} - -int getDacRegister(int dacnum) {/** super strange, reading out in some other register than written */ - bus_w(DAC_NUM_REG, dacnum); - printf("READ dac register value %d address %d\n",(int16_t)bus_r(DAC_VAL_OUT_REG),bus_r(DAC_NUM_REG)) ; - return (int16_t)bus_r(DAC_VAL_OUT_REG); -} - - - - - -/* parameters - timing, extsig */ - - -enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ - return AUTO_TIMING; -} - - - - -/* jungfrau specific - pll, flashing fpga */ - - - -void resetPLL() { - // reset PLL Reconfiguration and PLL - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_RECONFIG_RST_MSK | PLL_CTRL_RST_MSK); - usleep(100); - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) & ~PLL_CTRL_RECONFIG_RST_MSK & ~PLL_CTRL_RST_MSK); -} - - -u_int32_t setPllReconfigReg(u_int32_t reg, u_int32_t val) { - - // set parameter - bus_w(PLL_PARAM_REG, val); - - // set address - bus_w(PLL_CONTROL_REG, (reg << PLL_CTRL_ADDR_OFST) & PLL_CTRL_ADDR_MSK); - usleep(10*1000); - - //write parameter - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) | PLL_CTRL_WR_PARAMETER_MSK); - bus_w(PLL_CONTROL_REG, bus_r(PLL_CONTROL_REG) & ~PLL_CTRL_WR_PARAMETER_MSK); - usleep(10*1000); - - return val; -} - - - - -void configurePll() { - u_int32_t val; - int32_t phase=0, inv=0; - - printf(" phase in %d\n", clkPhase[1]); - if (clkPhase[1]>0) { - inv=0; - phase=clkPhase[1]; - } else { - inv=1; - phase=-1*clkPhase[1]; - } - printf(" phase out %d (0x%08x)\n", phase, phase); - - if (inv) { - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C1_VAL + PLL_SHIFT_UP_DOWN_NEG_VAL; - printf(" phase word 0x%08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - } else { - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C0_VAL + PLL_SHIFT_UP_DOWN_NEG_VAL; - printf(" phase word 0x%08x\n", val); - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - - printf(" phase word 0x%08x\n", val); - val = ((phase << PLL_SHIFT_NUM_SHIFTS_OFST) & PLL_SHIFT_NUM_SHIFTS_MSK) + PLL_SHIFT_CNT_SLCT_C2_VAL; - setPllReconfigReg(PLL_PHASE_SHIFT_REG, val); - } - usleep(10000); -} - - - - -/* aquisition */ - -int startStateMachine(){ - printf("*******Starting State Machine*******\n"); - - cleanFifos(); - - //start state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_START_ACQ_MSK); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_START_ACQ_MSK); - - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - -int stopStateMachine(){ - cprintf(BG_RED,"*******Stopping State Machine*******\n"); - - //stop state machine - bus_w(CONTROL_REG, bus_r(CONTROL_REG) | CONTROL_STOP_ACQ_MSK); - usleep(100); - bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STOP_ACQ_MSK); - - printf("Status Register: %08x\n",bus_r(STATUS_REG)); - return OK; -} - - - - - -enum runStatus getRunStatus(){ -#ifdef VERBOSE - printf("Getting status\n"); -#endif - - enum runStatus s; - u_int32_t retval = bus_r(STATUS_REG); - printf("Status Register: %08x\n",retval); - - //running - if(((retval & RUN_BUSY_MSK) >> RUN_BUSY_OFST)) { - if ((retval & WAITING_FOR_TRIGGER_MSK) >> WAITING_FOR_TRIGGER_OFST) { - printf("-----------------------------------WAITING-----------------------------------\n"); - s=WAITING; - } - else{ - printf("-----------------------------------RUNNING-----------------------------------\n"); - s=RUNNING; - } - } - - //not running - else { - if ((retval & STOPPED_MSK) >> STOPPED_OFST) { - printf("-----------------------------------STOPPED--------------------------\n"); - s=STOPPED; - } else if ((retval & RUNMACHINE_BUSY_MSK) >> RUNMACHINE_BUSY_OFST) { - printf("-----------------------------------READ MACHINE BUSY--------------------------\n"); - s=TRANSMITTING; - } else if (!retval) { - printf("-----------------------------------IDLE--------------------------------------\n"); - s=IDLE; - } else { - printf("-----------------------------------Unknown status %08x--------------------------------------\n", retval); - s=ERROR; - } - } - - return s; -} - - - -void readFrame(int *ret, char *mess){ - - // wait for status to be done - while(runBusy()){ - usleep(500); - } - - // frames left to give status - int64_t retval = getTimeLeft(FRAME_NUMBER) + 1; - if ( retval > 0) { - *ret = (int)FAIL; - sprintf(mess,"no data and run stopped: %lld frames left\n",retval); - cprintf(RED,"%s\n",mess); - } else { - *ret = (int)FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s",mess); - } -} - - - -u_int32_t runBusy(void) { - u_int32_t s = ((bus_r(STATUS_REG) & RUN_BUSY_MSK) >> RUN_BUSY_OFST); -#ifdef VERBOSE - printf("Status Register: %08x\n", s); -#endif - return s; -} - - - - - - - - -/* common */ - -//jungfrau doesnt require chips and chans (save memory) -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod){ - - int idac, iadc; - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",srcMod,destMod); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ - - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - -int calculateDataBytes(){ - return DATA_BYTES; -} - -int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerModule() * (int)getTotalNumberOfModules());} -int getTotalNumberOfChips(){return ((int)getNumberOfChipsPerModule() * (int)getTotalNumberOfModules());} -int getTotalNumberOfModules(){return NMOD;} -int getNumberOfChannelsPerModule(){return ((int)getNumberOfChannelsPerChip() * (int)getTotalNumberOfChips());} -int getNumberOfChipsPerModule(){return NCHIP;} -int getNumberOfDACsPerModule(){return NDAC;} -int getNumberOfADCsPerModule(){return NADC;} -int getNumberOfChannelsPerChip(){return NCHAN;} - - - -/* sync */ - -enum masterFlags setMaster(enum masterFlags arg){ - return NO_MASTER; -} - -enum synchronizationMode setSynchronization(enum synchronizationMode arg){ - return NO_SYNCHRONIZATION; -} - - - - - - -//#endif diff --git a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.h deleted file mode 120000 index 345b8c029..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorFunctionList.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorFunctionList.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer.c b/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer.c deleted file mode 120000 index a7eb59acb..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer.c +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer.c \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_defs.h deleted file mode 100644 index e638f840e..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_defs.h +++ /dev/null @@ -1,167 +0,0 @@ -/* - * mythen3Server_defs.h - * - * Created on: Jan 24, 2013 - * Author: l_maliakal_d, changed my Marie A. - */ - -#ifndef SLSDETECTORSERVER_DEFS_H_ -#define SLSDETECTORSERVER_DEFS_H_ - -#include "sls_detector_defs.h" -#include - -/** This is only an example file!!! */ - - - -#define GOODBYE (-200) -enum DACINDEX {vIpre, vIbias, Vrf, VrfSh, vIinSh, VdcSh, Vth2, VPL, Vth1, Vth3, Vtrim, casSh, cas, vIbiasSh, vIcin, VPH, NC, vIpreOut, V_D, V_CHIP, V_C, V_B, V_A, V_IO, V_LIM}; // Mythen 3.01 -enum PWRINDEX {PWR_IO, PWR_A, PWR_B, PWR_C, PWR_D, PWR_CHIP=-1, PWR_LIMIT=-1}; -enum CLKINDEX {RUN_CLK_C, ADC_CLK_C, SYNC_CLK_C, DBIT_CLK_C}; - -#define DEFAULT_DAC_VALS { 2150, /* vIpre */ \ - 1200, /* vIbias */ \ - 900, /* Vrf */ \ - 1050, /* VrfSh */ \ - 1400, /* vIinSh */ \ - 655, /* VdcSh */ \ - 850, /* Vth2 */ \ - 1400, /* VPL */ \ - 850, /* Vth1 */ \ - 850, /* Vth3 */ \ - 2294, /* Vtrim */ \ - 983, /* casSh */ \ - 1474, /* cas */ \ - 1200, /* vIbiasSh */ \ - 1600, /* vIcin */ \ - 1520, /* VPH */ \ - 0, /* NC */ \ - 1000 /* vIpreOut */ \ - 0 /* V_D */ \ - 0 /* V_CHIP */ \ - 0 /* V_C */ \ - 1335 /* V_B */ \ - 1335 /* V_A */ \ - 1350 /* V_IO */ \ - }; - -#define DEFAULT_DAC_NAMES { "vIpre", \ - "vIbias", \ - "Vrf", \ - "VrfSh", \ - "vIinSh", \ - "VdcSh", \ - "Vth2", \ - "VPL", \ - "Vth1", \ - "Vth3", \ - "Vtrim", \ - "casSh", \ - "cas", \ - "vIbiasSh", \ - "vIcin", \ - "VPH", \ - "NC", \ - "vIpreOut" \ - "v_d" \ - "v_chip" \ - "v_c" \ - "v_b" \ - "v_a" \ - "v_io" \ - }; - -/*Hardware Definitions */ -#define NMAXMOD (1) -#define NMOD (1) -#define NCHAN (32) -#define NCHIP (1) -#define NADC (0) -#define NDAC (24) -#define NDAC_PER_SET (8) - - -#define NPWR (5) -#define MAX_DACVOLTVAL (2500) //mV -#define MAX_DACVAL (4096) // dac val -#define MAX_VCHIPVAL (2700) //mV /** name ???? */ -#define MIN_VCHIP_OFSTVAL (200) //mV /** name ???? */ -#define MIN_VCHIP_VAL (600) //mV /** name ???? */ - - -/** Default Parameters */ -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_NUM_CYCLES (1) -#define DEFAULT_EXPTIME (200*1000) //ns -#define DEFAULT_PERIOD (1*1000*1000) //ns -#define DEFAULT_DELAY (0) -#define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) - - -/* Defines in the Firmware */ -#define FIX_PATT_VAL (0xACDC1980) - -/* LTC2620 DAC DEFINES */ -#define LTC2620_DAC_CMD_OFST (20) -#define LTC2620_DAC_CMD_MSK (0x0000000F << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_ADDR_OFST (16) -#define LTC2620_DAC_ADDR_MSK (0x0000000F << LTC2620_DAC_ADDR_OFST) -#define LTC2620_DAC_DATA_OFST (4) -#define LTC2620_DAC_DATA_MSK (0x00000FFF << LTC2620_DAC_DATA_OFST) - -#define LTC2620_DAC_CMD_WRITE (0x00000000 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_CMD_SET (0x00000003 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_CMD_POWER_DOWN (0x00000004 << LTC2620_DAC_CMD_OFST) -#define LTC2620_DAC_NUMBITS (24) - -/** PLL Reconfiguration Registers */ -//https://www.altera.com/documentation/mcn1424769382940.html -#define PLL_MODE_REG (0x00) -#define PLL_STATUS_REG (0x01) -#define PLL_START_REG (0x02) -#define PLL_N_COUNTER_REG (0x03) -#define PLL_M_COUNTER_REG (0x04) -#define PLL_C_COUNTER_REG (0x05) -#define PLL_PHASE_SHIFT_REG (0x06) - -#define PLL_SHIFT_NUM_SHIFTS_OFST (0) -#define PLL_SHIFT_NUM_SHIFTS_MSK (0x0000FFFF << PLL_SHIFT_NUM_SHIFTS_OFST) - -#define PLL_SHIFT_CNT_SELECT_OFST (16) -#define PLL_SHIFT_CNT_SELECT_MSK (0x0000001F << PLL_SHIFT_CNT_SELECT_OFST) -#define PLL_SHIFT_CNT_SLCT_C0_VAL ((0x0 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C1_VAL ((0x1 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C2_VAL ((0x2 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C3_VAL ((0x3 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C4_VAL ((0x4 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C5_VAL ((0x5 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C6_VAL ((0x6 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C7_VAL ((0x7 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C8_VAL ((0x8 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C9_VAL ((0x9 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C10_VAL ((0x10 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C11_VAL ((0x11 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C12_VAL ((0x12 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C13_VAL ((0x13 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C14_VAL ((0x14 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C15_VAL ((0x15 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C16_VAL ((0x16 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) -#define PLL_SHIFT_CNT_SLCT_C17_VAL ((0x17 << PLL_SHIFT_CNT_SELECT_OFST) & PLL_SHIFT_CNT_SELECT_MSK) - -#define PLL_SHIFT_UP_DOWN_OFST (21) -#define PLL_SHIFT_UP_DOWN_MSK (0x00000001 << PLL_SHIFT_UP_DOWN_OFST) -#define PLL_SHIFT_UP_DOWN_NEG_VAL ((0x0 << PLL_SHIFT_UP_DOWN_OFST) & PLL_SHIFT_UP_DOWN_MSK) -#define PLL_SHIFT_UP_DOWN_POS_VAL ((0x1 << PLL_SHIFT_UP_DOWN_OFST) & PLL_SHIFT_UP_DOWN_MSK) - -#define PLL_K_COUNTER_REG (0x07) -#define PLL_BANDWIDTH_REG (0x08) -#define PLL_CHARGEPUMP_REG (0x09) -#define PLL_VCO_DIV_REG (0x1c) -#define PLL_MIF_REG (0x1f) - -#define PLL_VCO_FREQ_MHZ 400 - - -#endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.c deleted file mode 120000 index a7532ccd4..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.h deleted file mode 120000 index 7569daf47..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/slsDetectorServer_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/sls_detector_defs.h b/slsDetectorSoftware/mythen3DetectorServer/sls_detector_defs.h deleted file mode 120000 index c5062e03f..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/sls_detector_defs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/sls_detector_funcs.h b/slsDetectorSoftware/mythen3DetectorServer/sls_detector_funcs.h deleted file mode 120000 index 844b67129..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/sls_detector_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/sls_receiver_defs.h b/slsDetectorSoftware/mythen3DetectorServer/sls_receiver_defs.h deleted file mode 120000 index 1de31caf5..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/sls_receiver_defs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/sls_receiver_funcs.h b/slsDetectorSoftware/mythen3DetectorServer/sls_receiver_funcs.h deleted file mode 120000 index c2ea4ded9..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/sls_receiver_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythen3DetectorServer/updateGitVersion.sh b/slsDetectorSoftware/mythen3DetectorServer/updateGitVersion.sh deleted file mode 100755 index 0c25e7f1e..000000000 --- a/slsDetectorSoftware/mythen3DetectorServer/updateGitVersion.sh +++ /dev/null @@ -1,31 +0,0 @@ -SERVER=jungfrauDetectorServer -MAINDIR=slsDetectorsPackage -SPECDIR=slsDetectorSoftware/$SERVER -TMPFILE=gitInfoJungfrauTmp.h -INCLFILE=gitInfoJungfrau.h - - -#evaluate the variables -EVALFILE=../../evalVersionVariables.sh -source $EVALFILE - - -#get modified date -#RDATE1='git log --pretty=format:"%ci" -1' -RDATE1="find ../slsDetectorServer . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|bin|.git|updateGitVersion|.o' | head -n 1" -RDATE=`eval $RDATE1` -NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') -NEWDATE=${NEWDATE/#/0x} - - -#get old date from INCLFILE -OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') - - -#update INCLFILE if changes -if [ "$OLDDATE" != "$NEWDATE" ]; then - echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt - cd ../../ - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -fi \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/.target-makefrag b/slsDetectorSoftware/mythenDetectorServer/.target-makefrag deleted file mode 100755 index ce093ecac..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/.target-makefrag +++ /dev/null @@ -1 +0,0 @@ -AXIS_BUILDTYPE ?= cris-axis-linux-gnu diff --git a/slsDetectorSoftware/mythenDetectorServer/Makefile b/slsDetectorSoftware/mythenDetectorServer/Makefile deleted file mode 100755 index b72e33681..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - -AXIS_USABLE_LIBS = UCLIBC GLIBC -include $(AXIS_TOP_DIR)/tools/build/Rules.axis - -PROGS= mythenDetectorServer - -INSTDIR= $(prefix)/bin -INSTMODE= 0777 - -SRCS= server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c -OBJS= $(SRCS:%.c=%.o) - -VFLAGS= -#-DVERBOSE -#-DVERYVERBOSE -CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS -DDACS_INT $(VFLAGS) -#-Werror - -LDLIBS+= -lm - -mythen: clean versioning $(PROGS) -all: versioning $(PROGS) - -boot: $(OBJS) - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - - -$(PROGS): $(OBJS) - echo $(OBJS) - $(CC) $(LDFLAGS) $^ $(LDLIBS) $(CFLAGS) -o $@ -DVERBOSE - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - -clean: - rm -rf $(PROGS) $(PICASSO) *.o - -depend: - makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null - \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/Makefile.dum b/slsDetectorSoftware/mythenDetectorServer/Makefile.dum deleted file mode 100644 index 4656a39bf..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/Makefile.dum +++ /dev/null @@ -1,40 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - -AXIS_USABLE_LIBS = UCLIBC GLIBC -include $(AXIS_TOP_DIR)/tools/build/Rules.axis - -PROGS= dummy - -INSTDIR= $(prefix)/bin -INSTMODE= 0777 - -SRCS= dummy_main.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c -OBJS= $(SRCS:%.c=%.o) - -CFLAGS+= -Wall -DC_ONLY -DVERBOSE -#-Werror - -LDLIBS+= -lm - -all: versioning $(PROGS) - -boot: $(OBJS) - -$(PROGS): $(OBJS) - echo $(OBJS) - $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - -clean: - rm -rf $(PROGS) *.o - -depend: - makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/Makefile.picasso b/slsDetectorSoftware/mythenDetectorServer/Makefile.picasso deleted file mode 100644 index 48d204135..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/Makefile.picasso +++ /dev/null @@ -1,49 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - -AXIS_USABLE_LIBS = UCLIBC GLIBC -include $(AXIS_TOP_DIR)/tools/build/Rules.axis - -PROGS= mythenDetectorServer -PICASSO= picassoDetectorServer -PICASSOFLAGS= -DPICASSOD - -INSTDIR= $(prefix)/bin -INSTMODE= 0777 - -SRCS= server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c -OBJS= $(SRCS:%.c=%.o) - -CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS -DVERBOSE -DVERYVERBOSE -DPICASSOD -#-Werror - -LDLIBS+= -lm - -picasso: $(PICASSO) -mythen: versioning $(PROGS) -all: versioning $(PROGS) $(PICASSO) - -boot: $(OBJS) - -$(PROGS): $(OBJS) - echo $(OBJS) - $(CC) $(LDFLAGS) $^ $(LDLIBS) $(CFLAGS) -o $@ - -$(PICASSO): $(OBJS) - echo $(OBJS) - $(CC) $(LDFLAGS) $^ $(LDLIBS) $(CFLAGS) $(PICASSOFLAGS) -o $@ - - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - -clean: - rm -rf $(PROGS) $(PICASSO) *.o - -depend: - makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/Makefile.virtual b/slsDetectorSoftware/mythenDetectorServer/Makefile.virtual deleted file mode 100755 index f3cb34b21..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/Makefile.virtual +++ /dev/null @@ -1,18 +0,0 @@ -DESTDIR?= ./ -PROGS= $(DESTDIR)/mythenVirtualServer - -SRCS= server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c - -OBJS= $(SRCS:%.c=%.o) - -CFLAGS+= -Wall -DC_ONLY -DMCB_FUNCS -DDACS_INT $(VFLAGS) -DVIRTUAL -DVERBOSE - -LDLIBS+= -lm -mythenVirtualServer : clean $(PROGS) - -$(PROGS): $(SRCS) - gcc $(LDFLAGS) $(SRCS) $(LDLIBS) $(CFLAGS) -o $@ - -clean: - rm -f *.o $(PROGS) - diff --git a/slsDetectorSoftware/mythenDetectorServer/ansi.h b/slsDetectorSoftware/mythenDetectorServer/ansi.h deleted file mode 120000 index a122db0ad..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/ansi.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/communication_funcs.c b/slsDetectorSoftware/mythenDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/communication_funcs.h b/slsDetectorSoftware/mythenDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c b/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c deleted file mode 100755 index 6e90105cb..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/firmware_funcs.c +++ /dev/null @@ -1,1765 +0,0 @@ -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif - -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "registers.h" - -#ifdef SHAREDMEMORY -#include "sharedmemory.h" -#endif - -#include -#include -#include - -#include -//#define VERBOSE - -//for memory mapping -u_int64_t CSP0BASE; - -FILE *debugfp, *datafp; - -int fr; -int wait_time; -int *fifocntrl; -int *values; -int *statusreg; -const int nModY=1; -int nModBoard; -int nModX=NMAXMOD; -int dynamicRange=32; -int dataBytes=NMAXMOD*NCHIP*NCHAN*4; -int storeInRAM=0; -int *ram_values=NULL; -char *now_ptr=NULL; -int ram_size=0; - -int64_t totalTime=1; -u_int32_t progressMask=0; - - - -int ififostart, ififostop, ififostep, ififo; - -int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; - -enum externalSignalFlag signals[4]={GATE_IN_ACTIVE_HIGH, TRIGGER_IN_RISING_EDGE, SIGNAL_OFF, SIGNAL_OFF}; - - -#ifdef MCB_FUNCS -extern const int nChans; -extern const int nChips; -extern const int nDacs; -extern const int nAdcs; -#endif -#ifndef MCB_FUNCS - -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -#endif - -//int mybyte; -//int mysize=dataBytes/8; - -int mapCSP0(void) { - printf("Mapping memory\n"); -#ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } - printf("/dev/mem opened\n"); - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSP0 mapped\n"); - -#endif -#ifdef VIRTUAL - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); -#endif -#ifdef SHAREDMEMORY - if ( (res=inism(SMSV))<0) { - printf("error attaching shared memory! %i",res); - return FAIL; - } -#endif - printf("CSPOBASE=from %08x to %x\n",CSP0BASE,CSP0BASE+MEM_SIZE); - - values=(u_int32_t*)(CSP0BASE+FIFO_DATA_REG_OFF); - printf("values=%08x\n",values); - fifocntrl=(u_int32_t*)(CSP0BASE+FIFO_CNTRL_REG_OFF); - printf("fifcntrl=%08x\n",fifocntrl); - statusreg=(u_int32_t*)(CSP0BASE+STATUS_REG); - printf("statusreg=%08x\n",statusreg); - - return OK; -} - - -u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - u_int32_t *ptr1; - - - ptr1=(u_int32_t*)(CSP0BASE+offset); - *ptr1=data; - - return OK; -} - - -u_int32_t bus_r(u_int32_t offset) { - u_int32_t *ptr1; - - ptr1=(u_int32_t*)(CSP0BASE+offset); - return *ptr1; -} - -// direct pattern output -u_int32_t putout(char *s, int modnum) { - int i; - u_int32_t pat; - int addr; - - if (strlen(s)<16) { - fprintf(stdout," *** putout error: incorrect pattern length ***\n"); - fprintf(stdout," %s \n",s); - return FAIL; - } - - pat=0; - for (i=0;i<16;i++) { - if (s[i]=='1') pat=pat+(1<>CLK_DIVIDER_OFFSET); -} - -u_int32_t getClockDivider() { - u_int32_t clk_div; - clk_div=((bus_r(SPEED_REG)&CLK_DIVIDER_MASK)>>CLK_DIVIDER_OFFSET); - return clk_div; -} - -u_int32_t setSetLength(int d) { - u_int32_t c; - c=bus_r(SPEED_REG); - bus_w(SPEED_REG,(d<>SET_LENGTH_OFFSET); -} - -u_int32_t getSetLength() { - u_int32_t clk_div; - clk_div=((bus_r(SPEED_REG)& SET_LENGTH_MASK)>>SET_LENGTH_OFFSET); - return clk_div; -} - - -u_int32_t setWaitStates(int d1) { - u_int32_t c; - int d=d1-2; - //int d=d1-3; - char cmd[100]; - if (d1<=0xf) { - sprintf(cmd,"bus -a 0xb0000000 -w 0x%x0008",d1); - c=bus_r(SPEED_REG); - bus_w(SPEED_REG,(d<>WAIT_STATES_OFFSET)+2; -} - -u_int32_t getWaitStates() { - u_int32_t clk_div; - clk_div=((bus_r(SPEED_REG)& WAIT_STATES_MASK)>>WAIT_STATES_OFFSET); - return clk_div+2; -} - - -u_int32_t setTotClockDivider(int d) { - u_int32_t c; - c=bus_r(SPEED_REG); - bus_w(SPEED_REG,(d<>TOTCLK_DIVIDER_OFFSET); -} - -u_int32_t getTotClockDivider() { - u_int32_t clk_div; - clk_div=((bus_r(SPEED_REG)&TOTCLK_DIVIDER_MASK)>>TOTCLK_DIVIDER_OFFSET); - return clk_div; -} - - -u_int32_t setTotDutyCycle(int d) { - u_int32_t c; - c=bus_r(SPEED_REG); - bus_w(SPEED_REG,(d<>TOTCLK_DUTYCYCLE_OFFSET); -} - -u_int32_t getTotDutyCycle() { - u_int32_t clk_div; - clk_div=((bus_r(SPEED_REG)&TOTCLK_DUTYCYCLE_MASK)>>TOTCLK_DUTYCYCLE_OFFSET); - return clk_div; -} - - -u_int32_t setExtSignal(int d, enum externalSignalFlag mode) { - - - // int modes[]={EXT_SIG_OFF, EXT_GATE_IN_ACTIVEHIGH, EXT_GATE_IN_ACTIVELOW,EXT_TRIG_IN_RISING,EXT_TRIG_IN_FALLING,EXT_RO_TRIG_IN_RISING, EXT_RO_TRIG_IN_FALLING,EXT_GATE_OUT_ACTIVEHIGH, EXT_GATE_OUT_ACTIVELOW, EXT_TRIG_OUT_RISING, EXT_TRIG_OUT_FALLING, EXT_RO_TRIG_OUT_RISING, EXT_RO_TRIG_OUT_FALLING}; - - u_int32_t c; - // int off=d*SIGNAL_OFFSET; - c=bus_r(EXT_SIGNAL_REG); - - - - if (d>=0 && d<4) { - signals[d]=mode; -#ifdef VERBOSE - printf("settings signal variable number %d to value %04x\n", d, signals[d]); -#endif - - // if output signal, set it! - - switch (mode) { - case GATE_IN_ACTIVE_HIGH: - case GATE_IN_ACTIVE_LOW: - if (timingMode==GATE_FIX_NUMBER || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case TRIGGER_IN_RISING_EDGE: - case TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_EXPOSURE || timingMode==GATE_WITH_START_TRIGGER) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case RO_TRIGGER_IN_RISING_EDGE: - case RO_TRIGGER_IN_FALLING_EDGE: - if (timingMode==TRIGGER_READOUT) - setFPGASignal(d,mode); - else - setFPGASignal(d,SIGNAL_OFF); - break; - case MASTER_SLAVE_SYNCHRONIZATION: - setSynchronization(syncMode); - break; - default: - setFPGASignal(d,mode); - } - - setTiming(GET_EXTERNAL_COMMUNICATION_MODE); - } - - return getExtSignal(d); -} - -u_int32_t setFPGASignal(int d, enum externalSignalFlag mode) { - - - int modes[]={SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE, GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE, TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,RO_TRIGGER_OUT_FALLING_EDGE}; - - // int modes[]={EXT_SIG_OFF, EXT_GATE_IN_ACTIVEHIGH, EXT_GATE_IN_ACTIVELOW,EXT_TRIG_IN_RISING,EXT_TRIG_IN_FALLING,EXT_RO_TRIG_IN_RISING, EXT_RO_TRIG_IN_FALLING,EXT_GATE_OUT_ACTIVEHIGH, EXT_GATE_OUT_ACTIVELOW, EXT_TRIG_OUT_RISING, EXT_TRIG_OUT_FALLING, EXT_RO_TRIG_OUT_RISING, EXT_RO_TRIG_OUT_FALLING}; - - u_int32_t c; - int off=d*SIGNAL_OFFSET; - c=bus_r(EXT_SIGNAL_REG); - - - if (mode<=RO_TRIGGER_OUT_FALLING_EDGE && mode>=0) { -#ifdef VERBOSE - printf("writing signal register number %d mode %04x\n",d, modes[mode]); -#endif - bus_w(EXT_SIGNAL_REG,((modes[mode])<>off); */ - -/* if (mode=0 && d<4) { -#ifdef VERBOSE - printf("gettings signal variable number %d value %04x\n", d, signals[d]); -#endif - return signals[d]; - } else - return -1; - -} - - -int getFPGASignal(int d) { - - int modes[]={SIGNAL_OFF, GATE_IN_ACTIVE_HIGH, GATE_IN_ACTIVE_LOW,TRIGGER_IN_RISING_EDGE, TRIGGER_IN_FALLING_EDGE,RO_TRIGGER_IN_RISING_EDGE, RO_TRIGGER_IN_FALLING_EDGE, GATE_OUT_ACTIVE_HIGH, GATE_OUT_ACTIVE_LOW, TRIGGER_OUT_RISING_EDGE, TRIGGER_OUT_FALLING_EDGE, RO_TRIGGER_OUT_RISING_EDGE,RO_TRIGGER_OUT_FALLING_EDGE}; - - int off=d*SIGNAL_OFFSET; - int mode=((bus_r(EXT_SIGNAL_REG)&(SIGNAL_MASK<>off); - - if (mode<=RO_TRIGGER_OUT_FALLING_EDGE) { - if (modes[mode]!=SIGNAL_OFF && signals[d]!=MASTER_SLAVE_SYNCHRONIZATION) - signals[d]=modes[mode]; -#ifdef VERBOSE - printf("gettings signal register number %d value %04x\n", d, modes[mode]); -#endif - return modes[mode]; - } else - return -1; - -} - - -/* -enum externalCommunicationMode{ - GET_EXTERNAL_COMMUNICATION_MODE, - AUTO, - TRIGGER_EXPOSURE_SERIES, - TRIGGER_EXPOSURE_BURST, - TRIGGER_READOUT, - TRIGGER_COINCIDENCE_WITH_INTERNAL_ENABLE, - GATE_FIX_NUMBER, - GATE_FIX_DURATION, - GATE_WITH_START_TRIGGER, - GATE_COINCIDENCE_WITH_INTERNAL_ENABLE -}; -*/ - - -int setTiming(int ti) { - - - int ret=GET_EXTERNAL_COMMUNICATION_MODE; - - int g=-1, t=-1, rot=-1; - - int i; - printf("*********************************Setting timing mode %d!\n", ti); - switch (ti) { - case AUTO_TIMING: - timingMode=ti; - // disable all gates/triggers in except if used for master/slave synchronization - for (i=0; i<4; i++) { - if (getFPGASignal(i)>0 && getFPGASignal(i)=0 && t>=0 && rot<0) { - ret=GATE_WITH_START_TRIGGER; - } else if (g<0 && t>=0 && rot<0) { - ret=TRIGGER_EXPOSURE; - } else if (g>=0 && t<0 && rot<0) { - ret=GATE_FIX_NUMBER; - } else if (g<0 && t<0 && rot>0) { - ret=TRIGGER_READOUT; - } else if (g<0 && t<0 && rot<0) { - ret=AUTO_TIMING; - } - - // timingMode=ret; - - return ret; - -} - - - - -int setConfigurationRegister(int d) { -#ifdef VERBOSE - printf("Setting configuration register to %x",d); -#endif - if (d>=0) { - bus_w(CONFIG_REG,d); - } -#ifdef VERBOSE - printf("configuration register is %x", bus_r(CONFIG_REG)); -#endif - return bus_r(CONFIG_REG); -} - -int setToT(int d) { - // int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting ToT to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: ToT is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("ToT is %x\n", reg); -#endif - if (reg&TOT_ENABLE_BIT) - return 1; - else - return 0; -} - -int setContinousReadOut(int d) { - // int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting Continous readout to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: Continous readout is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Continous readout is %x\n", reg); -#endif - if (reg&CONT_RO_ENABLE_BIT) - return 1; - else - return 0; -} - - -u_int64_t getMcsNumber() { - - FILE *fp=NULL; - u_int64_t res; - char line[150]; - int a[6]; - - int n=0, i; - //u_int64_t a0,a1,a2,a3,a4,a5,n=0; - fp=fopen("/etc/conf.d/mac","r"); - if (fp==NULL) { - printf("could not ope MAC file\n");; - return -1; - } - while (fgets(line,150,fp)) { - //MAC="00:40:8C:CD:00:00" - printf(line); - if (strstr(line,"MAC=")) - n=sscanf(line,"MAC=\"%x:%x:%x:%x:%x:%x\"",a+5,a+4,a+3,a+2,a+1,a); - } - fclose(fp); - if (n!=6){ - printf("could not scan MAC address\n");; - return -1; - } - res=0; - for (i=0; i=(FPGA_VERSION_VAL&0x00ffffff)) { - printf("FPGA version ok!! %06x\n",val); - } else { - printf("FPGA version too old! %06x\n",val); - return FAIL; - } - //dummy register - val=0xF0F0F0F0; - bus_w(DUMMY_REG, val); - val=bus_r(DUMMY_REG); - if (val==0xF0F0F0F0) { - printf("FPGA dummy register ok!! %x\n",val); - } else { - printf("FPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n",val); - result=FAIL; - // return FAIL; - } - //dummy register - val=0x0F0F0F0F; - bus_w(DUMMY_REG, val); - val=bus_r(DUMMY_REG); - if (val==0x0F0F0F0F) { - printf("FPGA dummy register ok!! %x\n",val); - } else { - printf("FPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",val); - result=FAIL; - // return FAIL; - } - // } - return result; -} - - -// for fpga test -u_int32_t testRAM(void) { - int result=OK; - int i=0; - allocateRAM(); - // while(i<100000) { - memcpy(ram_values, values, dataBytes); - printf ("%d: copied fifo %x to memory %x size %d\n",i++, values, ram_values, dataBytes); - // } - return result; -} - -int getNModBoard() { - int nmodboard; - u_int32_t val; - val=bus_r(FPGA_VERSION_REG)&0xff000000; - - // printf("version register %08x\n",val); - nmodboard=val >> 24; - #ifdef VERY_VERBOSE - printf("The board hosts %d modules\n",nmodboard); - #endif - nModBoard=nmodboard; - //getNModBoard()=nmodboard; - return nmodboard; -} - -int setNMod(int n) { - - // int fifo; - // int ifsta, ifsto, ifste; - int imod; - int rval; - int reg; - int nf=0; - int shiftfifo=SHIFTFIFO; - int ntot=getNModBoard(); - if (getProbes()==0) { - switch (dynamicRange) { - case 16: - shiftfifo=SHIFTFIFO-1; - break; - case 8: - shiftfifo=SHIFTFIFO-2; - break; - case 4: - shiftfifo=SHIFTFIFO-3; - break; - case 1: - shiftfifo=SHIFTFIFO-5; - break; - default: - shiftfifo=SHIFTFIFO; - } - } else - shiftfifo=SHIFTFIFO; - - - //#ifdef VERBOSE - printf("SetNMod called arg %d -- dr %d shiftfifo %d\n",n,dynamicRange,shiftfifo); - //#endif - if (n>=0 && n<=ntot) { - nModX=n; - - /*d isable the fifos relative to the unused modules */ - for (ififo=0; ififo>FIFO_NM_OFF, (reg&FIFO_NC_MASK)>>FIFO_NC_OFF, FIFO_COUNTR_REG_OFF+(ififo<>FIFO_NM_OFF, (reg&FIFO_NC_MASK)>>FIFO_NC_OFF, FIFO_COUNTR_REG_OFF+(ififo<> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - } - return get64BitReg(aLSB, aMSB); - -} - -int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vMSB=bus_r(aMSB); - vLSB=bus_r(aLSB); - v64=vMSB; - v64=(v64<<32) | vLSB; -#ifdef VERBOSE - printf("MSB %08x LSB %08x, %016llx\n", vMSB, vLSB, v64); -#endif - - return v64; -} - -int64_t setFrames(int64_t value){ - return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); -} - -int64_t getFrames(){ - return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); -} - -int64_t setExposureTime(int64_t value){ - /* time is in ns */ - if (value!=-1) - value*=(1E-9*CLK_FREQ); - - if (masterMode==IS_SLAVE && syncMode==MASTER_GATES) - setGates(1); - - return set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getExposureTime(){ - return get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t setGates(int64_t value){ - return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); -} - -int64_t getGates(){ - return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); -} - -int64_t setPeriod(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value*=(1E-9*CLK_FREQ); - } - - - - return set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getPeriod(){ - return get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t setDelay(int64_t value){ - /* time is in ns */ - if (value!=-1) { - value*=(1E-9*CLK_FREQ); - } - return set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getDelay(){ - return get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t setTrains(int64_t value){ - return set64BitReg(value, SET_TRAINS_LSB_REG, SET_TRAINS_MSB_REG); -} - -int64_t getTrains(){ - return get64BitReg(GET_TRAINS_LSB_REG, GET_TRAINS_MSB_REG); -} - - -int64_t setProbes(int64_t value){ - int ow; - int nm=setNMod(-1); - switch (getDynamicRange()) { - case 32: - ow=1; - break; - case 16: - ow=2; - break; - case 8: - ow=3; - break; - case 4: - ow=4; - break; - case 1: - ow=5; - break; - default: - ow=1; - } - if (value>=0) { - setCSregister(ALLMOD); - initChipWithProbes(0, ow,value, ALLMOD); - putout("0000000000000000",ALLMOD); - setNMod(nm); - getDynamicRange(); // needed to change dataBytes - } - return getProbes(); -} - - -int64_t setProgress() { - - //????? eventually call after setting the registers - return 100; -} - - -int64_t getProgress() { - - - //should be done in firmware!!!! - return 0; - -} - - -int64_t getActualTime(){ - return get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG)/(1E-9*CLK_FREQ); -} - -int64_t getMeasurementTime(){ - int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); - int64_t mask=0x8000000000000000; - - if (v & mask ) { -#ifdef VERBOSE - printf("no measurement time left\n"); -#endif - return -1E+9; - } else - return v/(1E-9*CLK_FREQ); -} - - - -int64_t getProbes(){ - u_int32_t shiftin=bus_r(GET_SHIFT_IN_REG); - u_int32_t np=(shiftin >>PROBES_OFF) & PROBES_MASK; -#ifdef VERYVERBOSE - printf("%08x ",shiftin); - printf("probes==%01x\n",np); -#endif - - return np; - -} - - -int setDACRegister(int idac, int val, int imod) { - u_int32_t addr, reg, mask; - int off; -#ifdef VERBOSE - printf("Settings dac %d module %d register to %d\n",idac,imod,val); -#endif - if ((idac%2)==0) { - addr=MOD_DACS1_REG; - } else { - addr=MOD_DACS2_REG; - } - off=(idac%3)*10; - mask=~((0x3ff)<=0 && val>off)&0x3ff; -#ifdef VERBOSE - printf("Dac %d module %d register is %d\n",idac,imod,val); -#endif - return val; -} - - - - -u_int32_t runBusy(void) { - return bus_r(STATUS_REG)&RUN_BUSY_BIT; -} - -u_int32_t dataPresent(void) { - return bus_r(LOOK_AT_ME_REG); -} - -u_int32_t runState(void) { - int s=bus_r(STATUS_REG); -#ifdef SHAREDMEMORY - if (s&RUN_BUSY_BIT) - write_status_sm("Running"); - else - write_status_sm("Stopped"); - - write_istatus_sm(s); - -#endif -#ifdef VERBOSE - printf("status %08x\n",s); -#endif - return s; -} - - -// State Machine - -u_int32_t startStateMachine(){ -#ifdef VERBOSE - printf("Starting State Machine\n"); -#endif - fifoReset(); - now_ptr=(char*)ram_values; -#ifdef SHAREDMEMORY - write_stop_sm(0); - write_status_sm("Started"); -#endif -#ifdef MCB_FUNCS - setCSregister(ALLMOD); - clearSSregister(ALLMOD); -#endif - putout("0000000000000000",ALLMOD); - bus_w(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT); - return OK; -} - - - - -u_int32_t stopStateMachine(){ - -#ifdef VERBOSE - printf("Stopping State Machine\n"); -#endif -#ifdef SHAREDMEMORY - write_stop_sm(1); - write_status_sm("Stopped"); -#endif - bus_w(CONTROL_REG, STOP_ACQ_BIT); - usleep(500); - if (!runBusy()) - return OK; - else - return FAIL; -} - - -u_int32_t startReadOut(){ - u_int32_t status; -#ifdef VERBOSE - printf("Starting State Machine Readout\n"); -#endif - status=bus_r(STATUS_REG)&RUN_BUSY_BIT; -#ifdef DEBUG - printf("State machine status is %08x\n",bus_r(STATUS_REG)); -#endif - bus_w(CONTROL_REG, START_ACQ_BIT |START_READOUT_BIT); // start readout - return OK; -} - - -// fifo routines - -u_int32_t fifoReset(void) { -#ifdef DEBUG - printf("resetting fifo\n"); -#endif - bus_w(FIFO_CNTRL_REG_OFF+(ALLFIFO<128) - printf("chip %d ch %d %d\n",ichip/128, ichip%128, (fifoReadCounter(ichip/128)&FIFO_COUNTER_MASK)); -#endif - } - //#endif - */ - - - -#ifdef VERYVERBOSE - printf("Copying to ptr %x %d\n",now_ptr, dataBytes); - printf("after readout %08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); - for (ichip=0; ichip0) { - now_ptr+=dataBytes; - } - return ram_values; -} - - - -u_int32_t* decode_data(int *datain) -{ - u_int32_t *dataout; - // const char one=1; - const int bytesize=8; - char *ptr=(char*)datain; - //int nbits=dynamicRange; - int ipos=0, ichan=0;; - //int nch, boff=0; - int ibyte;//, ibit; - char iptr; - -#ifdef VERBOSE - printf("Decoding data for DR %d\n",dynamicRange); -#endif - dataout=malloc(nChans*nChips*nModX*4); - ichan=0; - switch (dynamicRange) { - case 1: - for (ibyte=0; ibyte>(ipos))&0x1; - ichan++; - } - } - break; - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan0) { - nm=setNMod(-1); - if (dr==1) { - dynamicRange=1; - ow=5; - } else if (dr<=4) { - dynamicRange=4; - ow=4; - } else if (dr<=8) { - dynamicRange=8; - ow=3; - } else if (dr<=16) { - dynamicRange=16; - ow=2; - } else { - dynamicRange=32; - ow=0; //or 1? - } - setCSregister(ALLMOD); - initChipWithProbes(0, ow,np, ALLMOD); - putout("0000000000000000",ALLMOD); - setNMod(nm); - } - - - return getDynamicRange(); -} - - - - - - -int getDynamicRange() { - int dr; - u_int32_t shiftin=bus_r(GET_SHIFT_IN_REG); - u_int32_t outmux=(shiftin >> OUTMUX_OFF) & OUTMUX_MASK; - u_int32_t probes=(shiftin >> PROBES_OFF) & PROBES_MASK; -#ifdef VERYVERBOSE - printf("%08x ",shiftin); - printf("outmux=%02x probes=%d\n",outmux,probes); -#endif - - switch (outmux) { - case 2: - dr=16; - break; - case 4: - dr=8; - break; - case 8: - dr=4; - break; - case 16: - dr=1; - break; - default: - dr=32; - } - dynamicRange=dr; - if (probes==0) { - dataBytes=nModX*nModY*NCHIP*NCHAN*dynamicRange/8; - } else { - dataBytes=nModX*nModY*NCHIP*NCHAN*4;/// - } -#ifdef VERBOSE - printf("Number of data bytes %d - probes %d dr %d\n", dataBytes, probes, dr); -#endif - if (allocateRAM()==OK) { - ; - } else - printf("ram not allocated\n"); - - return dynamicRange; - -} - -int testBus() { - u_int32_t j; - u_int64_t i, n, nt; - //char cmd[100]; - u_int32_t val=0x0; - int ifail=OK; - // printf("%s\n",cmd); - // system(cmd); - i=0; - - n=1000000; - nt=n/100; - printf("testing bus %d times\n",n); - while (i0) - storeInRAM=1; - else - storeInRAM=0; - return allocateRAM(); -} - - -int allocateRAM() { - size_t size; - u_int32_t nt, nf; - nt=setTrains(-1); - nf=setFrames(-1); - if (nt==0) nt=1; - if (nf==0) nf=1; - // ret=clearRAM(); - if (storeInRAM) { - size=dataBytes*nf*nt; - if (size -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -int mapCSP0(void); -u_int32_t bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); - - -u_int32_t putout(char *s, int modnum); -u_int32_t readin(int modnum); -u_int32_t setClockDivider(int d); -u_int32_t getClockDivider(); -u_int32_t setSetLength(int d); -u_int32_t getSetLength(); -u_int32_t setWaitStates(int d); -u_int32_t getWaitStates(); -u_int32_t setTotClockDivider(int d); -u_int32_t getTotClockDivider(); -u_int32_t setTotDutyCycle(int d); -u_int32_t getTotDutyCycle(); - -u_int32_t setExtSignal(int d, enum externalSignalFlag mode); -int getExtSignal(int d); - -u_int32_t setFPGASignal(int d, enum externalSignalFlag mode); -int getFPGASignal(int d); - -int setTiming(int t); - - - - - - -int setConfigurationRegister(int d); -int setToT(int d); -int setContinousReadOut(int d); - -int setDACRegister(int idac, int val, int imod); - - -u_int64_t getMcsNumber(); -u_int32_t getMcsVersion(); -u_int32_t testFifos(void); -u_int32_t testFpga(void); -u_int32_t testRAM(void); -int testBus(void); -int64_t set64BitReg(int64_t value, int aLSB, int aMSB); -int64_t get64BitReg(int aLSB, int aMSB); - -int64_t setFrames(int64_t value); -int64_t getFrames(); - -int64_t setExposureTime(int64_t value); -int64_t getExposureTime(); - -int64_t setGates(int64_t value); -int64_t getGates(); - -int64_t setDelay(int64_t value); -int64_t getDelay(); - -int64_t setPeriod(int64_t value); -int64_t getPeriod(); - -int64_t setTrains(int64_t value); -int64_t getTrains(); - -int64_t setProbes(int64_t value); -int64_t getProbes(); - -int64_t getProgress(); -int64_t setProgress(); - -int64_t getActualTime(); -int64_t getMeasurementTime(); - -u_int32_t runBusy(void); -u_int32_t runState(void); -u_int32_t dataPresent(void); - - -u_int32_t startStateMachine(); -u_int32_t stopStateMachine(); -u_int32_t startReadOut(); -u_int32_t fifoReset(void); -u_int32_t fifoReadCounter(int fifonum); -u_int32_t fifoReadStatus(); - - -u_int32_t fifo_full(void); - - - -u_int32_t* fifo_read_event(); -u_int32_t* decode_data(int* datain); -//u_int32_t move_data(u_int64_t* datain, u_int64_t* dataout); -int setDynamicRange(int dr); -int getDynamicRange(); -int getNModBoard(); -int setNMod(int n); -int setStoreInRAM(int b); -int allocateRAM(); -int clearRAM(); - - -int setMaster(int f); -int setSynchronization(int s); - - -/* - -u_int32_t setNBits(u_int32_t); -u_int32_t getNBits(); -*/ - -/* -//move to mcb_funcs? - -int readOutChan(int *val); -u_int32_t getModuleNumber(int modnum); -int testShiftIn(int imod); -int testShiftOut(int imod); -int testShiftStSel(int imod); -int testDataInOut(int num, int imod); -int testExtPulse(int imod); -int testExtPulseMux(int imod, int ow); -int testDataInOutMux(int imod, int ow, int num); -int testOutMux(int imod); -int testFpgaMux(int imod); -int calibration_sensor(int num, int *values, int *dacs) ; -int calibration_chip(int num, int *values, int *dacs); -*/ - - -#endif diff --git a/slsDetectorSoftware/mythenDetectorServer/gitInfo.txt b/slsDetectorSoftware/mythenDetectorServer/gitInfo.txt deleted file mode 100644 index ac5d755fc..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/mythenDetectorServer -URL: -Repository Root: -Repsitory UUID: -Revision: 0 -Branch: -Last Changed Author: _ -Last Changed Rev: 0 -Last Changed Date: 2018-01-30 10:42:45.000000000 +0100 ./Makefile diff --git a/slsDetectorSoftware/mythenDetectorServer/gitInfoMythen.h b/slsDetectorSoftware/mythenDetectorServer/gitInfoMythen.h deleted file mode 100644 index 5fefed3fd..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/gitInfoMythen.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "URL:" -#define GITREPUUID "UUID:" -#define GITAUTH "_" -#define GITREV 0x0 -#define GITDATE 0x20180130 -#define GITBRANCH "Branch:" diff --git a/slsDetectorSoftware/mythenDetectorServer/gitInfoMythenTmp.h b/slsDetectorSoftware/mythenDetectorServer/gitInfoMythenTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/gitInfoMythenTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorSoftware/mythenDetectorServer/mcb_funcs.c b/slsDetectorSoftware/mythenDetectorServer/mcb_funcs.c deleted file mode 100755 index 70a995cd0..000000000 --- a/slsDetectorSoftware/mythenDetectorServer/mcb_funcs.c +++ /dev/null @@ -1,2716 +0,0 @@ -#ifdef MCB_FUNCS - -#include -#include -#include -#include -#include -#include "registers.h" - -#ifndef PICASSOD -#include "server_defs.h" -#else -#include "picasso_defs.h" -#endif -#include "firmware_funcs.h" -#include "mcb_funcs.h" - -/* global variables */ -#undef DEBUG -#undef DEBUGOUT - -extern int nModX; -extern int nModBoard; -extern int dataBytes; -extern int dynamicRange; -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -const enum detectorType myDetectorType=MYTHEN; -enum detectorSettings thisSettings; - -int sChan, sChip, sMod, sDac, sAdc; -const int allSelected=-2; -const int noneSelected=-1; - - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -dacs_t *detectorDacs=NULL; -dacs_t *detectorAdcs=NULL; -//int numberOfProbes; - - - - - - - - -int initDetector() { - int imod; - // sls_detector_module *myModule; - int n=getNModBoard(); - nModX=n; - //#ifdef VERBOSE - printf("Board is for %d modules\n",n); - //#endif - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorChips=malloc(n*NCHIP*sizeof(int)); - - detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(n*NDAC*sizeof(dacs_t)); - detectorAdcs=malloc(n*NADC*sizeof(dacs_t)); - //#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); - printf("chips from 0x%x to 0x%x\n",detectorChips, detectorChips+n*NCHIP); - printf("chans from 0x%x to 0x%x\n",detectorChans, detectorChans+n*NCHIP*NCHAN); - printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); - printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); - //#endif - for (imod=0; imoddacs=detectorDacs+imod*NDAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; - (detectorModules+imod)->ndac=NDAC; - (detectorModules+imod)->nadc=NADC; - (detectorModules+imod)->nchip=NCHIP; - (detectorModules+imod)->nchan=NCHIP*NCHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ - } - printf("modules done\n"); - thisSettings=UNINITIALIZED; - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - setCSregister(ALLMOD); - setSSregister(ALLMOD); - counterClear(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - - printf("dr\n"); - /* initialize dynamic range etc. */ - dynamicRange=getDynamicRange(); - printf("nmod\n"); - nModX=setNMod(-1); - printf("done\n"); - - - - - - //dataBytes=nModX*NCHIP*NCHAN*4; - // dynamicRange=32; - // initChip(0, 0,ALLMOD); - //nModX=n; - // - // allocateRAM(); - - - - - return OK; -} - - - - -int copyChannel(sls_detector_channel *destChan, sls_detector_channel *srcChan) { - destChan->chan=srcChan->chan; - destChan->chip=srcChan->chip; - destChan->module=srcChan->module; - destChan->reg=srcChan->reg; - return OK; -} - - -int copyChip(sls_detector_chip *destChip, sls_detector_chip *srcChip) { - - int ichan; - int ret=OK; - if ((srcChip->nchan)>(destChip->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - - destChip->nchan=srcChip->nchan; - destChip->reg=srcChip->reg; - destChip->chip=srcChip->chip; - destChip->module=srcChip->module; - for (ichan=0; ichan<(srcChip->nchan); ichan++) { - *((destChip->chanregs)+ichan)=*((srcChip->chanregs)+ichan); - } - return ret; -} - - -int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { - - int ichip, idac, ichan, iadc; - - int ret=OK; - -#ifdef VERBOSE - printf("Copying module %x to module %x\n",srcMod,destMod); -#endif - - if (srcMod->module>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ -/* #ifdef VERBOSE */ -/* printf("Copying module serial number %x to module serial number %x\n",srcMod->serialnumber,destMod->serialnumber); */ -/* #endif */ - destMod->serialnumber=srcMod->serialnumber; - } - if ((srcMod->nchip)>(destMod->nchip)) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - if ((srcMod->nchan)>(destMod->nchan)) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - - - - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); - - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - - -/* Register commands */ - - -int clearDACSregister(int imod) { - putout("0000000001000000",imod); - putout("0000000101000000",imod); - putout("0000000101000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Clearing DAC shiftregister\n"); -#endif - /* - sChan=noneSelected; - sChip=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - */ - sDac=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - -int nextDAC(int imod) { - putout("0000000001000000",imod); - putout("0000000001001000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Next DAC\n"); -#endif - sDac++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return OK; -} - - -int clearCSregister(int imod) { - - putout("0000000001000000",imod); - putout("0000100001000000",imod); - putout("0000100001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Clearing CS shiftregister\n"); -#endif - /* - sChan=noneSelected; - sMod=noneSelected; - sDac=noneSelected; - sAdc=noneSelected; - */ - sChip=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - //putout("0000000000000000",imod); - return 0; -} - -int setCSregister(int imod){ - - putout("0000000001000000",imod); - putout("0001000001000000",imod); - putout("0001000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Setting CS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChip=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextChip(int imod){ - - putout("0000000001000000",imod); - putout("0010000001000000",imod); - putout("0000000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "Next Chip\n"); -#endif - sChip++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int firstChip(int imod){ - - putout("0100000001000000",imod); - putout("0110000001000000",imod); - putout("0100000001000000",imod); -#ifdef DEBUG - fprintf(stdout, "First Chip\n"); -#endif - sChip=0; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int clearSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0000111000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Clearing SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=noneSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int setSSregister(int imod){ - int i; - putout("0000011000000000",imod); - for (i=0; i<10; i++) - putout("0001011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"Setting SS shiftregister\n"); -#endif - putout("0000000000000000",imod); - sChan=allSelected; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int nextStrip(int imod){ - putout("0000011000000000",imod); - putout("0010011000000000",imod); - putout("0000011000000000",imod); -#ifdef DEBUG - fprintf(stdout,"|-"); -#endif - sChan++; - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - return 0; -} - -int selChannel(const int strip,int imod) { - int istrip; - clearSSregister(imod); - nextStrip(imod); - for (istrip=0; istrip=0 && imoddacs[idac]=v; - detectorDacs[ireg+NDAC*imod]=v; - //#ifdef VERBOSE -#ifdef VERBOSE - printf("module=%d index=%d, val=%d addr=%x\n",imod, idac, v, detectorDacs+idac+NDAC*imod); -#endif - - setDACRegister(ireg,v,imod); - - /* - - reg=bus_r(MOD_DACS1_REG+(imod<dacs[idac]=v; - - - - reg=bus_r(MOD_DACS1_REG+(imod<=0) { - initDAC(cs, addr,val, imod); - /*#ifdef VERBOSE - iv=detectorDacs[ind+imod*NDAC]; - printf("module=%d index=%d, cs=%d, addr=%d, dacu=%d, set to %d",imod, ind,cs,addr,val,iv); -#endif - */ - //return val; - } - if (imod>=0 && imodgain,(detectorModules+imod)->offset); -#endif - if ((detectorModules+imod)->gain>0) - myg=(detectorModules+imod)->gain; - else { - if (thisSettings>=0 && thisSettings<3) - myg=g[thisSettings]; - // else - //myg=-1; - } - - if ((detectorModules+imod)->offset>0) - myo=(detectorModules+imod)->offset; - else { - if (thisSettings>=0 && thisSettings<3) - myo=o[thisSettings]; - // else - //myo=-1; - } - - if (myg>0 && myo>0) { - //ethr=(myo-detectorDacs[VTHRESH+imod*NDAC])*1000/myg; - - ethr=(myo-setDACRegister(VTHRESH,-1,imod))*1000/myg; - // else - // ethr=-1; - - } -#ifdef VERBOSE -#ifdef DACS_INT - printf("module=%d gain=%f, offset=%f, dacu=%d\n",imod, myg, myo,setDACRegister(VTHRESH,-1,imod)); -#else - printf("module=%d gain=%f, offset=%f, dacu=%f\n",imod, myg, myo,setDACRegister(VTHRESH,-1,imod)); -#endif - printf("Threshold energy of module %d is %d eV\n", imod, ethr); -#endif - - if (imod==0) - ret=ethr; - else { - if (ethr>(ret+100) || ethr<(ret-100)) - return FAIL; - } - } - } - return ret; -} - -int setThresholdEnergy(int ethr) { - float g[3]=DEFAULTGAIN; - float o[3]=DEFAULTOFFSET; - float myg=-1, myo=-1; - int dacu; - int imod; - int ret=ethr; - - setSettings(GET_SETTINGS); - if (thisSettings>=0 || thisSettings<3){ - myg=g[thisSettings]; - myo=o[thisSettings]; - } - for (imod=0; imodgain>0) - myg=(detectorModules+imod)->gain; - else - if (thisSettings>=0 && thisSettings<3) - myg=g[thisSettings]; - else - myg=-1; - if ((detectorModules+imod)->offset>0) - myo=(detectorModules+imod)->offset; - else - if (thisSettings>=0 && thisSettings<3) - myo=o[thisSettings]; - else - myo=-1; - } else { - if (thisSettings>=0 && thisSettings<3) - myo=o[thisSettings]; - else - myo=-1; - if (thisSettings>=0 && thisSettings<3) - myg=g[thisSettings]; - else - myg=-1; - } - if (myg>0 && myo>0) { - dacu=myo-myg*((float)ethr)/1000.; -#ifdef VERBOSE - printf("module %d (%x): gain %f, off %f, energy %d eV, dac %d\n",imod,(detectorModules+imod),(detectorModules+imod)->gain,(detectorModules+imod)->offset, ethr,dacu); -#endif - } else { - dacu=ethr; -#ifdef VERBOSE - printf("could not set threshold energy for module %d, settings %d (offset is %f; gain is %f)\n",imod,thisSettings,myo,myg); -#endif - } - initDACbyIndexDACU(VTHRESH, dacu, imod); - } - return ret; -} - - - -dacs_t getDACbyIndexDACU(int ind, int imod) { - /* - if (detectorDacs) { - if (imodndac) - return (detectorDacs[ind+imod*NDAC]); - } - return FAIL; - */ - return setDACRegister(ind, -1, imod); -} - - - -int initDAC(int dac_cs, int dac_addr, int value, int imod) { - int i; -#ifdef VERBOSE - printf("Programming dac %d %d with value %d\n", dac_cs, dac_addr, value); -#endif - clearDACSregister(imod); - /*if (dac_cs>0) {*/ - for (i=0; i0) {*/ - for (i=0; i=0) { -#ifdef VERBOSE - fprintf(stdout, "voltage %d\n", *(v+i)); -#endif - program_one_dac(iaddr, *(v+i),imod); - } - nextDAC(imod); - } - } - clearDACSregister(imod); - for (ichip=0; ichip<3; ichip++) { - set_one_dac(imod); - nextDAC(imod); - } - - return 0; -} - - - - -int setSettings(int i) { - int imod, isett, is; - int rgpr[]=RGPRVALS; - int rgsh1[]=RGSH1VALS; - int rgsh2[]=RGSH2VALS; - int irgpr, irgsh1, irgsh2; - - int v[NDAC]; - int ind; - for (ind=0; ind>(NTRIMBITS))&1; - int ae=(reg>>(NTRIMBITS+1))&1; - int coe=(reg>>(NTRIMBITS+2))&1; - int ocoe=(reg>>(NTRIMBITS+3))&1; - int counts=(reg>>(NTRIMBITS+4)); -#ifdef VERBOSE - printf("Initializing channel %d chip %d module %d reg %x\n",myChan.chan,myChan.chip,myChan.module, reg); - printf("trim %d, cae %d, ae %d, coe %d, ocoe %d, counts %d\n",ft, cae, ae, coe, ocoe, counts); -#endif - - if (myChan.chip<0) - setCSregister(myChan.module); - else - selChip(myChan.chip,myChan.module); - - if (myChan.chan<0) - setSSregister(myChan.module); - else - selChannel(myChan.chan,myChan.module); - - initChannel(ft,cae,ae, coe, ocoe, counts,myChan.module); - - setDynamicRange(dynamicRange); - - setCSregister(ALLMOD); - clearSSregister(ALLMOD); - putout("0000000000000000",ALLMOD); - - return myChan.reg; - -} - -int getChannelbyNumber(sls_detector_channel* myChan) { - int imod, ichip, ichan; - imod=myChan->module; - ichip=myChan->chip; - ichan=myChan->chan; - - if (detectorChans) { - if (imod=0) { - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - myChan->reg=detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan]; - return OK; - } - } - return FAIL; - -} - -int getTrimbit(int imod, int ichip, int ichan) { - if (detectorChans) { - if (imod=0) - if (ichip<(detectorModules+imod)->nchip && ichan<(detectorModules+imod)->nchan/(detectorModules+imod)->nchip) - return (detectorChans[imod*NCHAN*NCHIP+ichip*NCHAN+ichan] & TRIM_DR); - } //else - return -1; - - -} - -int initChannel(int ft,int cae, int ae, int coe, int ocoe, int counts, int imod){ - - int ibit, bit, i, im, ichip, ichan; - int chanmi, chanma, chipmi, chipma, modmi, modma; - - - - sMod=imod; - // printf("initializing module %d\n",sMod); - if (imod==ALLMOD) { - sMod=allSelected; - - // printf("initializing all modules\n"); - } - - if (sChan==allSelected) { - // printf("initializing all channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=NCHAN; - } else if (sChan==noneSelected || sChan>NCHAN || sChan<0) { - // printf("initializing no channels ft=%d coe=%d\n",ft,coe); - chanmi=0; - chanma=-1; - } else { - // printf("initializing channel %d ft=%d coe=%d\n",sChan, ft,coe); - chanmi=sChan; - chanma=sChan+1; - } - - if (sChip==allSelected) { - // printf("initializing all chips\n"); - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - // printf("initializing no chips\n"); - chipmi=0; - chipma=-1; - } else { - // printf("initializing chip %d\n",sChip); - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - return 1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChans) { - for (im=modmi; im63 || ft<0) { - fprintf(stdout,"Fine Threshold is %d while should be between 0 and 63!",ft); - return 1; - } - /*cal_enable*/ - if (cae) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - } - /*n_an_enable*/ - if (ae) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } else { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } - /*trb5*/ - ibit=5; - bit=ft & (1<>1; - int nchan, ichan; - int ft, cae, ae, coe, ocoe, counts, chanreg; - - - - nchan=myChip.nchan; - if (ichip<0) - setCSregister(imod); - else - selChip(ichip,imod); - - clearSSregister(imod); - for (ichan=0; ichan>(NTRIMBITS+1))&1; - ae=(chanreg>>(NTRIMBITS+2))&1; - coe=((chanreg)>>(NTRIMBITS+3))&1; - ocoe=((chanreg)>>(NTRIMBITS+4))&1; - counts=((chanreg)>>(NTRIMBITS+5)); - nextStrip(imod); - initChannel(ft,cae,ae, coe, ocoe, counts,imod); - } - initChip(obe,ow,imod); - return myChip.reg; - -} - -int getChipbyNumber(sls_detector_chip* myChip){ - int imod, ichip; - imod=myChip->module; - ichip=myChip->chip; - - if (detectorChips) { - if (imodnchip) { - myChip->reg=detectorChips[ichip+imod*NCHIP]; - myChip->nchan=NCHAN; - myChip->chanregs=detectorChans+imod*NCHAN*NCHIP+ichip*NCHIP; - return OK; - } - } - return FAIL; - -} - - - -int initChip(int obe, int ow,int imod){ - int i; - int im, ichip; - int chipmi, chipma, modmi, modma; - /* switch (ow) { - case 0:; - case 1: - setDynamicRange(32); - break; - case 2: - setDynamicRange(16); - break; - case 3: - setDynamicRange(8); - break; - case 4: - setDynamicRange(4); - break; - case 5: - setDynamicRange(1); - break; - default: - setDynamicRange(32); - break; - } - */ - -#ifdef DEBUGOUT - printf("Initializing chip\n"); -#endif - putout("0000000000000000",imod); -#ifdef DEBUGOUT - printf("Output mode= %d\n", ow); -#endif - - /* clearing shift in register */ - for (i=0; i<10; i++) - putout("0000100000000000",imod); - putout("0000000000000000",imod); - - if (ow>0) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - for (i=0; i<(OUTMUX_OFFSET-1); i++) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>1) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>2) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>3) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - if (ow>4) { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - } -#ifdef DEBUGOUT - printf("Output buffer enable= %d\n", obe); -#endif - if (obe) { - putout("0100000000000000",imod); - putout("0110000000000000",imod); - putout("0100000000000000",imod); - } else { - putout("0000000000000000",imod); - putout("0010000000000000",imod); - putout("0000000000000000",imod); - } - /*}*/ - putout("0000000000000000",imod); - - - - - - sMod=imod; - if (imod==ALLMOD) - sMod=allSelected; - - - if (sChip==allSelected) { - chipmi=0; - chipma=NCHIP; - } else if (sChip==noneSelected || sChip>NCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imNCHIP || sChip<0) { - chipmi=0; - chipma=-1; - } else { - chipmi=sChip; - chipma=sChip+1; - } - - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorChips) { - for (im=modmi; imnModX || sMod<0) {//(sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - if (detectorModules) { - for (im=modmi; imreg)=cm; -#ifdef VERBOSE - printf("imod=%d reg=%d (%x)\n",im,(detectorModules+im)->reg,(detectorModules+im)); -#endif - } - } - return 0; -} - -int initModulebyNumber(sls_detector_module myMod) { - - - int ichip, nchip, ichan, nchan; - int im, modmi,modma; - int ft, cae, ae, coe, ocoe, counts, chanreg; - int imod; - int obe; - int ow; - int v[NDAC]; - - - nchip=myMod.nchip; - nchan=(myMod.nchan)/nchip; - - imod=myMod.module; - sMod=imod; - - if (sMod==ALLMOD) - sMod=allSelected; - - if (sMod==allSelected) { - modmi=0; - modma=nModX;//getNModBoard(); - } else if (sMod==noneSelected || sMod>nModX || sMod<0) {// (sMod==noneSelected || sMod>getNModBoard() || sMod<0) { - modmi=0; - modma=-1; - } else { - modmi=sMod; - modma=sMod+1; - } - - - /* - for (idac=0; idac>(NTRIMBITS+1))&1; - ae=(chanreg>>(NTRIMBITS+2))&1; - coe=((chanreg)>>(NTRIMBITS+3))&1; - ocoe=((chanreg)>>(NTRIMBITS+4))&1; - counts=((chanreg)>>(NTRIMBITS+5)); - nextStrip(imod); - initChannel(ft,cae,ae, coe, ocoe, counts,imod); - } - obe=((myMod.chipregs)[ichip])&1; - ow=1;//((myMod.chipregs)[ichip])>>1; - initChip(obe,ow,imod); - nextChip(imod); - } - - - initMCBregisters(myMod.reg,imod); - - if (detectorModules) { - for (im=modmi; immodule; -#ifdef VERBOSE - printf("Getting module %d\n",imod); -#endif - if (detectorModules) { - copyModule(myMod,detectorModules+imod); - ; - } else - return FAIL; - - return OK; -} - -/* To chips */ -int clearCounter(int imod){ - int i; -#ifdef DEBUG - printf("Clearing counter with contclear\n"); -#endif - putout("0000000000000000",imod); - for (i=0; i<10; i++) - putout("0000000000010000",imod); - putout("0000000000000000",imod); - - return 0; -} - -int clearOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Clearing output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0000110000000000",imod); - putout("0000010000000000",imod); - return 0; -} -int setOutReg(int imod){ - int i; -#ifdef DEBUG - printf("Setting output register\n"); -#endif - putout("0000010000000000",imod); - for (i=0; i<10; i++) - putout("0001010000000000",imod); - putout("0000010000000000",imod); - return 0; -} - - -int extPulse(int ncal, int imod) { - int ical; -#ifdef DEBUG - printf("Giving a clock pulse to the counter\n"); -#endif - for (ical=0; ical0 && i%2==0) { - printf("Shift in: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<0 && (dum & (1<0) { - printf("Shift out: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, (dum &1<0 && i%2==0) { - printf("Shift stsel: module %d chip %i bit %d read %d instead of %d \n",k,j,i,val & 1<< j, i%2); - result++; - } - if (i%2>0 && (val & 1<> 1; - - - putout("0000000000000000",imod); - putout("0010000000000000",imod); //change mux setting - putout("0000000000000000",imod); - } - - printf("Test FpgaMux module %d : %d errors\n", imod,result); - if (result) - return 1; - else - return 0; -} - - - - - - - - - -int calibration_sensor(int num, int *v, int *dacs) { - int ich, ichip, imod; - int val[10]; - - - printf("calibrating sensor..."); - for (imod=0; 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 $?tfYMT(A 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

=S7D)x(TRUp3&|Tm?rNH}Iauj$^8Q^`I4|p%T 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

-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 diff --git a/slsDetectorSoftware/mythenDetectorServer/mythenDetectorServerv2.0.3 b/slsDetectorSoftware/mythenDetectorServer/mythenDetectorServerv2.0.3 deleted file mode 100755 index 62f811a894a206efbf124c5a150ce4414c32142b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384078 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

G#3}F5LdM zb;ltE%Pq@(oncR?P29Zp=>+>6`*B-|^ir1Wm90{`wTRbNBE7Ot2chL~e?m~Z1})R- z+sVl=upHX>@UgJ{Ro2BSO@PMVyHvW0oV>WIgzr)w27ZY)*&4CS=eMUBx5!S>?yao5 zSo^-^mP&>W&S) z)df^dsw&m~Fi172s#4RVltv1tGTLaCJ*&|eW!#sg?2{CMq?EJ z3P#iShRG3m-ji8m7aOe&uCJC}(RSEQx|hAp$_KLNa}-X|7m)Dh*%Hg}i1&p|aIXp-sGSb^u1_e9Fso4JF!GF5>;J1ldnAlUz?O$q!X*EZwks~_vNf&L%Or# zinBs<)zfx7J^@%}SvJACSgDCEC7rV2*(d(>=&er6RH9pZGwOp;9V*CN6Wy z%22Tx{HAh}K}(}<)*Ozl$TURWDlNT?`Lpy&&7b9#b|QO9Yv#VCu@|*T<{pYNbKLi+ zu(^k)wO8%B~pk8vNvb17bzLiTdEQ{wg8M%2??AE?*xn6w+ zupBCvMHyepR8jMew*v(2%WH5HH?B#r`wpvXt!9T=p*K@8J8LzSrOeJ+$&R~Nb7Q$h znwxd1XWyeN*Q2?y9Bwtt&4D&Id8dnh=XF2oK^{uf`M--^9ib-r7;j>8+cM0u&1W95q zp&3HzxxsdQ;?r;}A@#EZK=@Ilo*K>!v^xR=7+pm#-FY_&Y zbkuW)yMl9vyMl9vyXb|k=MHz#3*DP5k=HY_oIBh_FLXV3xQkxsdhT!+z0kdjBzeCY zQ1c`%_wS+?dUOWKaojeeP7k6TM~AVxJzTNef_#Vfrt?V`J(y zksew3qzHbDYsKrh$V6F5XQ@iEMHef2NS1jNcTL45vidU-xcIVHQOnPJZ1_r25*NDk z0P6CnyQU3d_44VWM|$M$DI%b|OV@0~E161XnJ#*ym+UGd5<;g$P9E)|M|#O_(wXRy zUb4H?7(LSKJ2%5l@#N7QJ<|Q#$I<1*pW(8;_2kiU^hoy?yZ1o3;)l4n8_;dksf@#* zk`tdZ?oPCrzrXtewcZ`7CAFbi^hoy)c0Zw3HGx4Xw|F~|EqWathaNVL9_jv}ZVTiU zlZNOzU00(h(WMJfiFtaYM=#!&3OIRmBt`T~k6xmpF8ZaH9>CV?qF;LHp_r1LF8ZZ6 zq<9u>*Bj^|4e7NcGbA%I`stV6&@4lUe(4P@GTi8w-q0#Th<@n}ZC7&$(J#HBLq^jb zv@oudQu?JgOe-bXizFLnG?AoVdc&N_B!7uQG|bmDG7LFuIzx0OweMr(Ty}6w~WeaTw zIij_EI!Jn_j2JJICw2-M?<;HI|0{Dt_mu%>s!=s)V5zb#WPMb&F*9RgC2775w(! z#eH_F59cS_F7C5aeF;BXP2lO))z{9bhLqb3)E{vi=8?R3=hxDL>*mFIU-}Xl@zSr? zkcr}g-r%Dga7y3)H|zl^e&~%>@+2j@BX@4nN_J4vFcXqdR`L`jCvl<2=d=kF&6SI`0B=xYVpyb2721#O++`IQ6NgX90^ZmORtBDeC-XKX0 zC4ZU^N!n)WMP{m#u`*Wj5+yCvX_c>8Ve<-n@F$L}R0TSoXadB&9fLa^EDo~$+ZWUaX;Yt21fYaaO)l>Nv;{{!@?$iC#T z;ve5`K=2Wyl7w5_B)01J;NHQTtLN|O{{kNzeAy3{F{-NYGWi|6>iW?}{~EkZN0XEw z$Uh#>_|Z}NK!Y;`e}NAQIL+r~gr18Onxh^5IGBufs)pk~11r(7R^JcNRu>&Z;C$f! z9WkP^QyCmT{ZZ7+sb+=0fa&CEmuC+xM1i8?HLT8GO3lJu5|;G8&9Dio+2oY*d$<>= z_9D+CJQkhqe~Xr;v9QcPH?WEB`jW&2XmBUW?Z!OnMn1&Fi_Z4%W43150yvR5cu%d1 z_W2(}HM-D>{p(Qh=zhw1{zjI$+gkNI@vao@(Xf~wrMX^Bzru+uhdD1g;9pFoWyMrR zoE8akNUC(t zVirF|VCe#;$L&EPzX1^|OZ%%)A7xGCSRY5BF3VC^S*0?5NB6>!5qQU|C~H&Q7IHgv zTUFP0%J?bS4~GZ%J{W89WS1;YcFFQ&mn=_q$?{~EEKhdH^4gKX5>Ix?@-`uRzV``h z&IunWMt1RJmn;u(4qh~?z6arJsOOs49{wiOOYERc6`GR+$sK%?aGw7zG95eQLE(I# zI|aqoYww8pfYzMYp^r*fg_HOYCUpZtQgu(^1-_1|b^Af1ZVfL&9Zc$2T(G?%o#U#g zDZ6CFcK0u5>PP<&p{$kVVJ(%S06Gd6cM%g_T{hVl({DseZ`@TdXuQv_(13Zyn)3Z0Fnd=j7xTBH zL&fB*BY0Z-2Qhos&9KE{_ljMwU8c@|mE4Wm7){8+BBWJ6fJ@oEs0`PSdCX7DW2!Na z0WpsQJLa(~B-q~CctMj%Yf-KEfYC%MpOF+=T)^qFF%^>Ll6Z2RPRi}Ww96~>K zJ2rfR_zs=B9RDnGcQOVBthU!()aH&?6&HeFlQnV@cOv(L9a}cV=LT41llK%YN8*(2 zLN&%2`HUz{trevSRI24JS!Gjb%&98jr?nQOS$?no4Ek94eUz|IbC<00`@f2>LCnb- zG;sMhY~!OCG+V_$LI#(Qn3Uu$S>>Ko0b(b)OICT*)sF5Zxl2}gsb&4-Elps{EE`L{ zg*qvZS+*j{U9!r{EnAc1E?MOxEL)f4E?MPq%O;cDC9Ax`vQ5dE_%v8vWm!G-xV+l3 z*(7(#DzCBZ*yO@2*jiUhoKJF>tnxZni###OU9!p>Y>B2Mxl2}gqh+Tjxl2}g($zV1 zW|F&Pl{dLRmg<_5v#}z{U9!rjxo?Z9)o7R)n~&L$U9!rb@MM=P?|VQo zT~Bt&@^qK1GTkMs?0$3ux1@rZ*?C*RM^~@n)4`GnPK3Ku_;Ee;IKEoDf)nK~S@AW> z;SMuLl=Rf&_#yU*L6z1k2c_ju+FYTh9#@Pehc4q(90r2_a%T%pJ-!wq*(Iw|Pd%k^p(wj#Rn3%BkE`~egngO2WL3@jiE#gP>hbR(-dwGx9#`){PIB`J z2>usyqq}5{I$@;UB`a=EJ&xb%QpQftU9#f0SyoRyj^A!sJ@q&~^wi_{&{L1&Lr*=9 z-)-aa)ZhU-{ zcv$y(U)}2|;iRbU_4+8_`|4glNy18fb+4Z;oSu4Io0~11o_buHUm%>GdR#lcM>sw8 zxVE4v=&8rG6E%faU)}38Z!HyX`NWo_bts?}~craqTSLaf_!O*Ur{E zrk;9SJ4eIx)Z^McHB3)EuAQr4dOmLLJmvI!+}iod{SQt(z8D$y67L(?Gv1CKk9dK3_-WtOMus-XcZGBoJQ zNl)&8)3lA|9^Mz1v0{#<_8DYOK9#uLshg;xjG9xrC$k3=l@BBCKxY0R#%X$ow(n%b zKCw-^_Ybn&D_OO+mFbbJD&4EL7mL=iX0a`d)3hg_8Gl5}Cx~TQeOoR6oYLd1WvK*Z zG}lVoTyGj|Ss15j6D^mr7*~j8S}nO-sy880i8Ijr3X_qSOsDA{#`)7exLhZ3s6Sfc z{7s}bju^O}jMFp%?-}lQ7SsI?qS)K98c*TJc}UnbLQ_Z$?Bra zOv;s6lDU-3-Bb!~8=JXk5SMMm0k8KkPAd+`x>pFC`*|OU%yTq&Kcl&eTV##v*Ca2! z8F7YCravPdhsyM1eoNyIh+1FfTryuD$;#`^98X5x{M;oOanXEmCQO@c&*Fjf2s|)) zUd(HRu0621tuloODaP7Y&rD^F&-(^zJu8D}Uug?>NjnFOGVnp_ken{muy**k zYZdcd(pY_BrBiC4-_**=+kOq8FKU) zbF`8rf7ul&bMwf~9KCF-gE@LxW8wTy9Dk>D_gLgk>5jv&RR2{?38zlZPs8Mzs$ZQv4N-9_3JEZ3*a9SO0yL)%X5yo&aUYe&C|8X#S>Lg>)86)!IBJOS&~8QPlm82La=B zVQDAJ^=ZrKaloN%hiJ=u+2(c~V&bL~V$sdE73=}%;#Y)r5q@cjP7zmH?S7piifp$u zMUmU5Q|8&LwBX&^Fjwzv7+M@u^>c@?`a*E{Um-aBZz2~Z>fwI{b;6Kb()%LP zB;};{MI2?vBxhJJ`yNK)|Qo3D4W(i5SC^B1mGTkmBbHpy)E+PU$73g*m(LP4E zi^yJLY!!1oPZFlvMP$AhquWJfApy?<9`~GxAZP`;T||2MExCXYC(D!xeDu9;#qB&}9$}FJhM*H$FjWLZL<)4Zi0!>V1O!A1bhU`} zFBbt3o&p!^$Ce!~0s=V&x?03mo+^T~a7|o?i`=j3o1r|J;*zm22Kek{#GFi5ixHQo zs6bbX_yGhB3UsxIA4#R5P+(psPh=I!BVO7L6Gh@pQFlY?fg|SBu6L8Dey` zXl#{XLsyH&Hl7PmpsPh=hm4>*XkpxYG)7m8#%a%xq^m{aj5kQq)uM6EXC&!r(Kx?^ z7U*ixxbS64>1xr~Ur8xlEgDz1kvxnR4(uaISBu6&*$9Ou)O_QS>q*kpqVcGWB{8Bev>3!Eh<+%PLi$`jay}$(bb}HoAi`tCxEPX)S9RPTL173eQ+*z|7=WRTk*5H5f!ojP}rz3ekw9tHj-_X9~@D}!^H-ASBc;hrIW=2snr(A{M z$`>zByI2=sP*}$suVHnDD_^_dDi#qd#&VbPKW*e@2@n&gai1aMPbzYz0$`@~;6&tR6@%B^BGhF%N zbz7^3D_^`G4U3s5&Gl;f6;6ofwRzrv;mQ}!?gfvG@wr!h05tB?eQU- zw8w{R(jLF;Wr_EnH)$WSxC~D|75~cz(47-!qQeK!4Ie-^d;s0>0d)V@1L(di)5XpM z==?|UHA+^#RO-PJm93O;Qsl~)${`0!RJL=WbtqFR2TN3r+aa7DEK!+zMmRlKqB8$; z;q+jM%JHuXrw2<^7BmGtSfX;s!4j224wk5#_PWH=gC#0=dq+4uSfX;s!4j224wk4K zad zHBKwZOB_rtr!kUy%08D!}5|&bwR@>nxpna*aQumBIkNkPt>sK<__AN zr1#aCrk31f<>r`P+T4Y?3uW{Kkm@NKPfq};o~j&90C@{Z;4Iz`q5B(@q`7)8^8oX1 z8`d$qFb}q2J(DE2Kx6yn2((o7-pZlg8E+ruDzudQDp#ZBTBux|mSjKWl5#>xb+>X& z*lq_+^f0ngSKV(mupo={Yl>qYVseXB(KAb#+!Ez{vw)gQm5Z6Z5x;twauw!e#v4$s z#__L30*~XXQd3RJyoleLbTI+KzBL);Jo6O8nw9g-I`n{=7RKcnecoLlxY37ffmZD_ zz5(7n4l!KayqDkUzJh;uRq||+(vI6b>SQvqZDZJcWh`FvMwjA?qmlU`c`Qmw{DQ?p6j%ei`~x(HMOYBYvGBS(l<;X+*3` z$V!d|oYCh~PDVN})zV zY3ij2@`W<2^b|op-C`}JTdciGL%PLUiddg+v6c$9SWD>^Yka;;1zW78viy)ITdbvY zi#16}w^*ai6tOK1EXBT1|;G($+;V(r_M>K1Dv z)h*V947ONH=@x5ZH`rn=)s1S>E!I-H#hMr+))$&53F{VXVl3EVEk&$Pw^&OBTdbw< zXzb_~YpES1`=zkK7Hg?si?tN7KHXw16>PDV3bt5Fal+Cq)>6S1Ybj!Vy2V+>ewg3_mgE!I-O7HcWpVof5ihn8-!mLk@tTdbvmE!I-O7Hg?s zi?vj+#af!H5=QD4YiZ(sBlmE{ayg*{(QO88vBufSNfYV$LR##QhTU&n8LSFR^ebN#cHq{w*Yl`z2Q2LXx;&;=t!f68B3S z%0@^vp|%o7zDbg}U*f1glO*n!*th_7m@0=tZ0_fj68DSsPNY<~SerqTxL-oHSW6N2 zOUM>$DdK*KOQol9^-n^!SW9vBPvT+eU|ju^c!aH$TEh}QDw8`g!h~$GmLf)&kS*3y z#0V4H#TYTdglw^vB1V{yE!I-O7Hg?si?x()vDOXnHx+ELmLf)|TdbvYi?xHOK#VZ) z+F>jZF~Y>_XOJXDn0V_-kZHTc+BcwF<~@RI#WT2Q?;};o3xa-zpOzFc!rCJqLWfUr znNQt&zoa?Bg>@glPLj`L)mh#;ThHfh+0-O)4Vz|cfK}%4`N;VhI%LS%7o_Koo)3Sh z$FNg4?%Vh5SKNeZe`sy#MtCS;%=-{KrnHB~z64>&d;*Cv5lB4qJxIdla9m5w6v!iv zcM9~6lh~(t;aA2X#wjAhlekl&7-Hx?=-eVYiHNC`6z1XTnk=p%a~`h7%%Or4`2lo& zqkj2jUvjh*{W%CGRZ3!~Uw-Vb-~^rY)GyzgOC`pLrBLgFPKMPlKb)ilLE@Jm9;J#q z{qkd9N2s8aVfD)ocUn{8mmeN$^~Eng-1Vv?qkj3}aT=z6`Qe;$>X#qR({9l(KRjN; z)Gt3=ctpa~FF!m%HJgfl`Q={ZKM)=Zt6zS28Vk$(^F|Tgl@K94S4Rjs8TY6g@h}Ly zu=?ePXK7*(_d#42R=@o4LMs-({P2Ftsb7A$+gcUB{BVzksb7A$SJQ`I{-KhJ`sIh0 z6;r7=pW>1QmGsLmnMbaYe)%Qyw}LGCX+{y`eO;JzycZ6smltgAyxD5 zyim1f6*Ov&;zg+ANu7y{6ZcA?6r<)=t z>X+}Ishs-d`{yX9e);~nS}zk(tp8xKSXlAP_th`ozvL9jtmD%!-`}E~`sMqVsVVi# z_pek={qp^5l~ccb|GI^?SnOW@_1b0BFW0zX;Ct7|^|)BS{J6*b#66}O_ZSfO zII!a$yFxYFTN^KEGHEU9*YE;O4xn201y>ptl83;=J@&8>;+G%yo)yV&a2?6f6!&fsvTjieHJ+)Jpp0 zMA1$@4AHJmtY?)6af(xvvR3 zH|(durd=+l4rTTV-^>ZG75n3pofoEGel+Lm6uVEDU(TYFTpgwTVfy7qCtG%Dn11=u zDK;A`!t~3JPIEsIQ>)Q1jj&zEY=~ce^a&$=`9}Qm&9;$9(fljF{3tWC^R|M8dR{b& z$Hbiy_~kc&-(05N^kt*Tp`o#H4ha6s{b;8*eT?tz;!Ph@Z~EBb#m5JF)5kU_=Q*+S zp(x(;bzI+c#*aPWJUp{NAaR1~@e=o$FN2oXbh&{+jZoUhG|Ha&>H+|%7h=M%@ zv>QA1x~G70cyx-R$NTZ(o&q+zs&fu3HJ_Y?4e)*KK(_6oMWxeoZ zGzI+fmG#4yA{PAeHMv-LQ3~vxmaPc?Aqn;_%hrS|vHlT$`5Lzl?RpW?uzva8A3zuV z@*DQw|3n9V`IIpa)-PY#5`?aG;FqucG8V2ti@`5n*%1g`n?ugj_Q# z%S87=h%uWcGtmXOhRy4!trBwsOhwE#j6~l&&oN~-Okkp4!y>^l^AIe=%Y z=xKOWjGGD2uQ11;l4t#tzC!=Mm%?G&Fmip3`SDD z`7u&#FnMIS(Y%YICCwe^v!hHICWp~xB62&%Ohn~1nV%!iDdV@|9mdq-nlUTJ;|DRHx}h#f~+y;kMx_)p6$cNH=FDA>F*W z0QnqmdLSv7{h>d>6kunf*@9-8WFAH7CYu$g_Fc@8m`|pd(;%5@dQt7u%$caGT}>7_ zpKg8u$#io<0*8s464dSP=56F*hB*&2*i5q$ntPZzsIgh*dq`!r84b-j=BtqGY2HDu z=9-bH!@W!nWtnGwjq7}KEoyRsse_%p%{tKgn3agNulX1+X$y@DoBNr&(S^Frxf30y z$F%O^IKAdJq}XSkguLHWprsZWu7F)^9)^V_rUCR)^CQ?_l@8+H{k-9oLi0J(vJaHa>JtF^8i~Pc=ND z>on7kR8BXSAat`a7z<~Z(kjO}(k_CV0qT~K2z@cQZCwkd~m zs6L0{e;}@3HQH@B9Ou~KmonZxK81WIi+iqv^u6$?40@|y)$Wcy)~RZ9nbPRP4|l4v zE(4shQsm1Ik68)Ey&4wW2G1qK?hC5|1L)-U8OlPF@ zF&j^Gsw2lC0IvnOjyM2z-OMuxtd3qJ;*)W09zpHQ&nPatNyL}pnpq0%8hJm-5Jjo^ z(PNNW549G4a;|B0S$7$JG#%ObDniS>48IYLJmPs8Akt!*_{xzX(qdA)6=sOEm^5u= zh_sjtA9ga^J&-NDUuKB3nAWjXNKBEI43QQyo)3Q+A}yvMHi@*D3H{XD4nv`EhJcHi zD5+owIc5?&L56^fnJftsa4}P8Izzz4OqB!|mw?>$I!NPQieUs?%x<+L3AmWu9g+lG z%nTv<(qU$nQA)tY>>*MDE@qaH1YFE)sU1GJnK@#YfQylD2^j(|Mm`Q@2)LNN#25h= zGfxsG;9};BF#;}T;e9L%0T&~mK{5nfOfO#uGMGmk(>83HcmXt6-R#T+ALBj93=lTr|H zF~@5usJls|1YFEXA|>ErP8E`Xi`o1hYjQnHETb_)z{Q*`9fN?2Iajhnz{Ol3W&1UX z8P0TLI@1qL83HchiCLtPA>b08{%w*3T*9-t$6$tlOL(qCUeCyV{4|x}Yi4+WpQADa zT*6uf1YE)wN%90-N+fe5lhc4v)^ z5Pzyx;wsVGTll^ko#C=tM~FXF3vrd`Vz&!-zG`}Fxg}@={i4L)Uh@sua9W6~ME7_5 zsI_6JmQ;Xh5m$*G>~5mgWz=G})E3#|Cx;PeoEG9L(L>!^sQcg$T_;0arF7}PL#^!> ztspOcnhI{*yO$#3Dy5gGC_@CLHuW~=HzFvt=?_T~L8;Bia3+FM+bm;(2uf{>j2|K> zwXHHHh@jNA@$`la5tP~v86J1g!nh|{!$eSOr`<%72ukgYhe;Aash#r-Ng^n<^Is-O z1f_Q2y(EdC)b_tYk_bxe>d#0LL8(2kjj0hqsXdg{ooPZn)gHMUNg^nWa%Or`Q)NYkQLQfknfBkC1oAO4Mg*mHyBH&aQv0|}=R{CypAZX*pa`i53g5vq zilCf;XQYfGC^DBRf^sDl6hXO|3Pez9UwfPd+D`KIUyvk%Qv24sB-MTH`;4aUb9^;! zvA$RD!$jQs7}x3;USYKNk*eVZK~?z4W(cMv-pipYWeBDuKAuKWJ_+r5IuaT2KJU=& z2Vl#P5p{C2ejE4Zs@YO^zb83IswPEpPpQTxl5?e&_{>o?Un=1rh+MTmDvZw9c(@N zEh7p&L*bm1!a0W_ZrmHdRpFep!Z~M(_-I@+0_UU^&Y=%l+&d4~bO7h170!7OQVZua z4}x>j3g^6l&~h)WaLx`I2;iJ_0OzDr_(*5cw3QCvoOA%^q!rFd<5Q!BbJ78vlMdjV zw8A+HsHbpFI)HQ1S-vg{oRd~KM-o&xho;j3oRd~K=Q2p+UV>o?=fp@VobwTLt8k8x z3g@^~P&h}V3g-wJz&UA!bHr`{=cEHTC#`Uf7*jY$5>_}zj0JEG5BjxmPC9^d(gB>4 z-a&rqDv=cEHTCmp~!=>X122XIb0fODEHoFmo(I42#zIq3k-Nh_T5XUQw!oOA){`wNV~ zBCYs9o>n-gMg)X&(hBFah=6cTTH&0@A|RZTRyc<~UvZC~5!DCdG6>EgTZD5qh!#PP zw8A;3iGcnR)mP)9(MS!3bJ7au+$p+*bJ7auJSqahIqBIbh{8E(g>yI<@j_OFbJ78v zlU6u~HKuS*i^4h0{{-hWTR0~}SYML5Sp<1|}1=UVFCHAL4*E1dHj)LIqJd4dXnb8eaE^=#g>$m_j-OUIM}~*OIghZ070$Vuq{2D(kyJS6`y>_4 zd6uNYIX9D3IOpF%GM0OzCwI42#z zIq3k-Nh_SQ0U%2{fOFCToRd~K=PW8HobxRfNa38PNh+N4Tap2slMdjVW(()MDR9oa zgmXebJGA$as^JAg*T+v=TH%})bfvVyIeC%_=NyMb6wb*8a85dabJ78vlU6uKsxg3b z(gB>4Ryap0OyL}<+yKr=E1YvZa%JJ1w8A;}Q=)KAI)HPU2g5m6VcAf~84LW>b5}3I zqOR}z&TGSP&aj`3Gwi2RJU?^TPY2Ht!+tu$emZ;#qmK=4fqViU_R|^m(*c4p?58sc zAFPJ`bSf|}4EyN}`{@k(=?wen4EyN}`|030k?#4AU}fnS0?yeVUj*HQdvK{SE*X9& z@wN+`gEQ5tjVKH>!B5B1E1WWZrST)FtMF;4i&1ej8`VN-Ifad68v37zFn!EXB&nM@ z;RGJW#uc}jBcS>>CD%dMlE>f-!_TcW@3?<=uV=J%I4;YQM+DL%21yG$6^@3&KQ!9W zP_QHxA3GtjbpQ@FQ?hwBJ}$PL%=}N#FnYjR+G(asP0M_S&XCZSEraMegXkH9=xKxK zg#n$}e}5#acAVx%cc#1dpmddXnn&Uzo2I*NP`Z|ubS*9ET3XVzw4|%FrmM8mOlMEE zync{nON(Voi)BlTWlM`?rPZ?1PV>dIEH!!2pb{zVH1lkG=;HvvYb4ZZ&1^u^+^MP? z&|pe7)3Z}E_~4)nT3Rw_Y003aC4-ih3@WV|RN84io|cbhgM3phuN*`lKZssBi0&Ii zUoeQid=Py=Ks(L!@6>`mS}dp(`w8XvhRLx}#!sJKq|L+k$%DXiwDAiij;cHntUHh; zAnLBjUW6aB?RBU9N+Diy+HVx%S*QITA$B z`=9u;xcyW9ENTy<|KaS*_6qr((%yhycWK8$fGM+(l@syb*#TMmWCpBsIxa@YR!CbP z_nr266fSD#LVcKA&7Z#Z!}&ANejC)X+Yo&wq8^X`&Kn_Yr$+}2 zk9{2>Q!t~pZ-)S9owh$Ezxno;sIa*Gb^Z*rzsH}Rc7g#gOBl>u;dG1v?6LTJ*nkQD zo!l6qvlW+ix}G3M#0U^|0e^bhxqB0$9>5>uXey#Ec*1u!t{0)Q0FBd5#}OFh4wUY)vDZWIJnB74eo^}m@q=?U+h361Z2PY%9%z4uKfUcA z^Jj6pLH|JVV_!q$?TkE{8`q%QibdJgKW~X_BC2K zS+tz4DrB*V*_3T1S0G6JD90)AJ`!Cm?y8yw4VK0oPmr zyyp~n-yc#7yvu=t){io$!278PE%$N?ydOgY0q~v+fcKmN@3fT*fcIPgyyp~ne~O8z zA7w58-g9rj`9}RHa|*nFKs^QCa{=(43xM~W0`HQb0`D}P3xM~W0`I#CNb)$t6nOt8 zNd?|-AgRE+kP5utMX3VsB30mB$N+fHDex|K1K>Ru0Pi^k-o=;#?~*@z*@z97Cr@;GnML^&^r@;F&A|UXdQ{eqI5fFIKDe(Tj2tLNOx)NT1gMfFk zMc_RFTKy<<3cP1UFb>!1*|=ylQiFl_oC5FtqD$aCr@;GxA|UXd3xM~W0`DA*Ih4-& zQRV{RJ*U7sYfORnf&%YyF5M76N;#Jfew0rmo$5Dnac@QM7zDic!-k$q2S3WcP^&yS zL`#5o)v~~QJrt@ZQ0o-LRa<0>!27-ENOCS6{3!RN?xG>OPELXMlTpzV6nNi21px00 zDN^8FML7lDFJMh5@cw0z3cSm3R^VO6gaYp}eiV3@F`>Zw^BfZjyvy)V;C&sX3cSxI zslYq89L*{4ek4f+-cKT_!23dy3cQ~~Qi1ntNh;v7fKa)@1RtH_emrJ;5`=r?>PnDW#9zBdrpCO={*7Po>SmmX6pcW&jrAH zPJwqZ769+L0C>*@zW( z=vh$V|72(6dnnZ|n|rW7&cop=AadQ2C*sGs1(%TXO_a!UC#}F+^iS{{h9{R{S4&jR zu&d?p9-7!aWf+?u#^&*OIE>9>N*u=K=}$MjhbDY0hxgFLleRy+hbA`K!v1W-duR^t zp*g&V=I|bx!+U7X$_($J`9<7A^KjyISK||k>l>F0zmq(Gf89efVnkt}31@~`dPNEd zdsO71ZLuOypS}esQ4y$ToKQx9dXgCd>V;CEp1RE^>;&qY1E9V+0P33qpuTyXK=OAn zngaDgDp0Sa0QE`=P%oqc^-2m*FQfqVN(oR;vZWiqU#kV`CCmc#q_LSELoHBGNvj3w zg%;F!Mo4H2)C(=Bv6U}m4J+MjfqLpVEjxCmySG?CC>97P?X;u;>S?;`)V`!^X-U`8 z7N`%>wQ@;UX-!vYr{$ELme&umY-zDqUT6!{3vGdVp)F8P+G+VRu3FGXwdifiJ)s;w${vofVS)N= zCB79O3!X!dpDW!}?dO06NV|nUE84Hd4}toQn}vAE>9|jbXPu5mgxKM9d|!y|PRFw# z-2RS#=TA?^@A$K%<9+`0b^MJ#i#sCdc#|HlNb!_6#K*u@!>FL(6PoIgDsQS>92 z0bvK1nlML85RwP5*um8$NM+nT; z&f+>=fcm@w_1z+#fonbh>hlWJ9}cMn>I;KB9Do{_;`2eWT zD^R}xhT`5&8KyuzkNwLlP=60e1?q)Vp#C9B6{r`f0`)=$Kz&|;da)Y-_4xp(&nr+b z##UiKn0b=00`+1n0P6FEcXY$!d;rwv1E4;yK)n<;0P6DrP@fNg`g{P?=L4WV9{~0F z0I1IgKz%*{>hlWJOW72tmr^KDucbgoHJe1LK)py6s25U!`s+~l`2eWT2S9y30P6D! z)JxfZjd}=YJ_qEZKz%*{>hl3mpAUfgyaM$SIRNVO0Z^Y0fcks@)aL`BJ|6(}1?wR% z)>?J~_4xp(&j&z#UV-{M1XHJne7=Cp`wJcs0fG9w0`)%;0fG9w0`;$mfIxlzOGw0D z#xo%F_@TT4^?w(EN3eP{A?;IOSvNc;TLkKxK`T(7SD=292zJG_ng{1;G*W|s`n&@5 zYebhoeO`h3V?;opJ|6(}c?Ie@81u-31?uwwP@h+zo;9XG{R9Q-3;*OHU$7qXFC(4m z4{&jL&dVU6ehq9m1?wU205Gp^AZi|H2~e+E7N~Ef)=X-h!W!a!&NXCefWNCoR5 z-%H&ChUhwZ1?ta3bx%~F{v;{@s9#Qz0`)4&D^PzW=LQApZzQQey$ojs>SatQP%q<0 zfqEGe3e^9ab*VtT3=akBkET?C`fid6)E`7rf%;QODo}qeNd@YclT@JoQj!YP-%e72 z`WHzmP|u3YH=&+tk9?b?0`(t~RG@xe)K*@BdWYme=$x_MT}UcWKZ|4l)aL`BKCeK% z44eR{&nr+by(a+b^9t0anasKs)iQ?J%*o2 zc?IfUp*aQW-z2F({aBC+)K3n8`g{P?=L4WVuRy(2V*u3W1E4;yK)qC$0`*e40Z^Y; zpneembqmzz6{tU$lGW%GzLyVx`odtKek)Y?zl$^SbCha|1?q2t2tfTg_;GkLSjgEA zL&tN=)?&fr)4tP$r{95I$GN|!c;F=h{s#wMZbt0mxEdA*T^0|#qzs71&I2#M4*vi3 zz{{7R>zPkY9rEay-{9(+k8ur|DYzQ*0w=prrHf(hWwkT%WM*;nbZ%q)MYTx{IJ&tw#?lu zp?>&gW~0hwK6#+IwOM{2v^~?}j*#$_JUonULmD*2dZ6$ zU8&rP>Kn;jC0TL%syC3kTDjhuGZCFf4~#|fdHj!j6^v7JwG~f>Xv$7;?VAuU2D=LX ziR*Fs8~&?XX2RljO>G&Lop_^B(9&y=ju)!&B??dCzFQcq{!7cP4a#sJ9v4KdgQ9kW8RwNKo;4-%ZuhkJO~5uCkkl8CVLklm{t$p6upfmLE#V>L$)rvS)}{c?uWfC2v!*%dE=rzc9Y$nN5pytyUYgUSIb;U|OK|ZcX^v`h<^y2T9KzB$=3OT%$V=%ux#iWEAwDRM z%WBLJ9~Q@DwagG76~|?b%n%=km`*ikh`$!cWi@ArB3Co=BPd*sv>!s+wLa#p+A3TU zNzPzBby@zbsGG>2f%^NQyBOpZ(7y`*wFiT7>VIg(-+<_wJH-u0Bk(1#ui;;qKY;iE z|BVl!i@3 z%u}uWj^agc74esGZIkaPt^AJSm3>FVcjMa1XDT!BQ;>F^YUMMPS^gR&tD87awerc$ zto$=2I#0C*^Hi(OQ*lfMcAje0c`8MT&Qq;?veS90Rp+VQ8L0DAtIktdNLqECswJuO z)Dz62&QqU&%nq8TvV-QS?4Wt7UFWGAVZ?PiPQ{P2373$w35D_8?;PkjKYa#mjb1c7 zPkn*rsh?tixIG+}M;LjMVGFaRi}Tb5qfatAPgzdpsUwX($&9VW@IA^hNu8LEHZ&{~ z(=opGozXMat@tOD(7k62r1pU@snc!UIu1JjL&+@w45!MNk z(Q5fW9gI`QrzDD#5RKj`uAd9hOtACtk25!A7HXv492R$kahb(X60=ZDa+^dk%7v;q zVEsnS-i9;Js1|BhD4io+sr0U-tAut&Gp)gs&lpZVwC^<8$wv}P1*g_|k#≧Pv5} z3Qn!_q9=>^P+SL{TIZErD&jM6&FJKF6G%Jx$O$%P`Gb_`|pNvjE zuQTv@T>NlGC!dcf(a9$hOgG;6)1ajlaFfP_8(@I|xMI}g`{j=?)Y+A)~W2Y_!=qGK?jV~_*i zj=@AQ1`|34-(jGR!Gw;%&neL{mcXAK^Mvn``zaL$l1SmcJspnfd)Z;ZhO7>FTfO$*21lZW85@pIZb z!(;FZGzLduj&={_7(CsRhj5NRwsdg}p5}?lK=pcjgxqXLn)fg7Xp>;8)@#Of$Q^AT z5$}rYkUQF15%=P1?`RuA4!xs&iIO3Aw5ur5r^KKL*1XsZvTxt+B}RP*KN%3j&`Mtre|6?n(hWSlK{#GyL8_uWLHqYtPJ^03*c51V|dte2cb|VD(mH` za+Ex5CiP+Sei5^?C-q_TagcUsCiP+S1xj>iCiP*H=(HW0$>3o#sSleW^nN=ullrh( zLy10YCWD8~q&{qpXP^$vq&{pmLXy;n%_vEI*!(85s1KWe06BWl!{+Eg51XS0J#3EA zhfRKAbKRz+@Z;={OUOAT%c1#|LmlTM+i1f>^9wXIJJCPfb2(lLVV4YtC0n{UG{=Vv zRM8vVgs^^KiphAK7}nQ1-zjD9_q|dM3(p(!KDPj|YrUzs4!QfussoSXc*x!FMA1GN zS9|w6ALP)x-?fwsx%=Hi$$xeC`!NHD-2Gmme^Ty^P&O`RWg>NwJz-2upkoD`NkcB$+FFLNpt=?=ta2!;c4&^k-3Yxl4Xn1OLQg6R^dY1 zvbvPzQkTzOxKGJamM`nW-?nC5%VJlyEY-CvSL*7OeqGCASGM%lY(@N+@$Wy6R}lP< zdBx!)4|Tcf8q*U=Dtu|%kr2c?hakc;)m-QMIedGGyy>-yi|#%&EjB9?f~-s&l9eJ?F?2OcJF->hF>^y!v&8S(b=+F0OVp%ON1`G-_9~ zoJ7g$CO*X2)hriLqSL6Heluh>%N-2VY1FP}d6W{JM*n#=%S#N@X;fFUT>Ug8x|-!0 zE=kqZEY}`MQl`Atoiy{vX?6I$bd2A~$g)T^w#k@^AeDZ{~c1tX+>w;#geVrFHaraQo^m z-|XZh1t_lkzSg&&|*bsxxYbDabGh#BJ#USo=jWE#NB zBAJCDm!+3QGJ8u!aEjeWDfv{fuh6RQd(dcL|L-h!1#J z3Co8&tj}SM4!$38ea@vUqg|hKt`>O6`kXcYAA4T{7)NoX-K`qomL*HFBugV{G#bs} zOFbj`mPV3o4qGGn;IK9F8L&075%?U*7Xd8UTp=Laz$O6%A$Kq&A;*GA*xUg&*-bVH z5dK_C2st;&5|UlABq9Iz>UB@`ShnMXBw*Swt*Yv(>N?)5dR5=6dPw8*T!d$qe$H+g zyb;eV{hR|b_*y(I{ha&Yv_@V_KZo@CtdZB!&mnbvYvdiRpYtPn$s@0&pYuBk;gNT= zeoisQLTlt@{hT{<5yJX8cfEp?teZcohBY=w+YHw4z$}XWt~Pj(AvJq6MlpU3-Ptx_*(hz;3@wz9u;H2zWT)#rSxZ6 zMJ@g5svs2`z1vGb0Bt)^vc>q7cfg~0Nq?Jymm?^d39ckHm}}v^0l$p04#ktoI^%>+ zMU=`q`LeV=jD`i$#mYK`4rLunaYriaSc*GRS%(#OG(UaIITDew&TW*xrL1!!e=JK` zhqMc;JeT2_rL1$44Bmxjma@*fW$-Ybma@)6a9SggrL6Ns3Sk-0Qr3BjLRbbIt*rA~ zddVY^rK}^s{?IQ?}vQF{tDqe(p$gmX1WU?V|r5jYJh5ojlar)a&+0RPJ$( zM3zsEM10@^hr>w(w6%Bwa`36jQW~&*#WvWIwb8o^A1(K6z%y&3mo|*bJ=frwwbANp18pKi-T?0CV=@kHwE)nNIwezg^QV`Y!j5%a3O> zKk7JArkl)<#EaDHHb2&9@uTIF{1~+WP|1%m%ftNGkj0O-&*jIzqQrANew;Cr`0>}^ z$A{1})H^Oep3VH2NBlUS`BC<^gCFN*@uTIF{CKXDA8idg=Ew81_|f*c{CLXzNN1dK zwD-&+e*8uniml%RFS`6F&n%yndzOS4>f?zYul2~4Gxaw0x;;N$oS(2wz z1L8fY(URwjlzW!sNjgH729i8!Lo`P#nnRrR(SEeZ z_qmAFBGdJS>bmpwXph^wgAZO;0VHPg}l|5q%=DrRN7$32ulF8!X!DBG<; z(0h@``zfEz@PK?RWjk8)NoBkD>4ONC%69Liz+)-f(MqsVt^~7`?Pw)f>7kWima-jb znpS!qz|&H;Be2q9Q%l+IKPiOS)Ka$lErl?fj#joS1SePvL`&H&Kq1Vgqm}L2=q0l$ zE8E>U9U-i2ch@9x@&fTGDk5(k3xuAOvKzP>u2{0>SX=L|j50Y7X%^!*Aqfx0 z_sj67k@7vP=Tu-H^?nMlZq=xix=2;5i$r|tl^ZsdQWvS3b&-foy^>9RQWvS3b&-fo zy^>9Jfwab zA^}L&+~{Rq%mo8j zbE8-BqL+CwNH2MA^fE72AjHeOSU^tZ#Yd5?mwEB$a8@~ZvC6@VRSsUPW?sAjndrK2 z9sXFS9>0StCOrC*ofzVN0DS@UjLVB>DK9Pnt>_mKV|C@~|)(?n+I7FB8vyFM6wEb@;HkJ>5NE)JR_3DgLlec zI(cmIpyTAR#e*cmX7k|JDdc!ONa}{!JV=P{ae2^j^4Q`*(k8cfkPabRJos^BV)5W} zaGnAW^2uYLJb6suNRGC=jd(D!3pt`U=;!j_S;~V>t#uuAQ|fsUQ(TtTx>p8|!81#1 zy+H>1@wBwo=fi2uPL|gCB^1K5lclwuq7dec(OT<6^pZDNEUoq1DTG&UqqWu_qL(~7 zvDW&XB)qcL`dxRClV>N|8e*;Wk)3d!l-9bOovx__H$ZEBGHI>^ZyO~ zuV0M>;v+h_iT$ab`dbRtY2rcodR4)C+qrt&T8jHo%0|Dq@M5Hxjuc7!ib!2f92ulH zYl~YEG8ez`yD0v@P^hMrd>ip8?p63g=?nDfRi(eCKda0Bm;PK*MpUV;tWc>QY&7A?CBF_M5L4wq>~Q~3eTAG zB?vh{MN04;krk+AJJqrRb(D_rvWA^h!}0qm=AuD3y){T!neH9X#DydzYTg(ExOS^4 zg65rfR6rF+f2WMDRZHIUNy#veHY#g8RF-Nf8TzGUn7=~?6W7#A$5ZkhW=h^`S0n}3sgUV1K;{W|m=>GqOa$QwypaJ#OHF? zhP3}FxF5!^jJB$g%Ut}S_b*W{7gC&6#k32JT-MQ_OU7@aKWj=pj?A7x#NXgIp3c$a z94gjIXgn)G(n9>oZbhh8^8XM--eUa5-%E*CYNb!XL!TH=yJM6R|0c|V+hR^~=9Cjp zlB=9Jk{pGKA1l0y11k!hd}mYtgd<4dq<+e;-Of)sI6q1Kg^KzsrAXwU{z{UR_!~_9 zl_V)S11h{Sx<&oY1G;(til{yhm4){VYnb|(=VyNhN=H$8B8}PPit>VHMPUP}WqJ6Dfeh)5F=X+D01 zk^*w%zOBBp$V5;KzhX%YV`MM}ttXL!VsAjUk{Gf6eV#tMy7a&3&&8#3FkUn6diXjK zaXo&e=TPGxGPH4bA#@NS`zUlWLP5UcK7v3BxDLOv3hJz)1hS`3l+LnJW=7!&=OJVi z9a7bZuG`5`p+?~fMTcHGHkUOD(`mX2Sv_kMo_SQj2}WUBQq*{;ELo%Q6*71wo>`+X z$tyLUZFp+mt0X!sIG^aS^{tvVf?84^xmJ_WIIh)X*J`qBHCZ!O+5|I-sGcKZBt|D6-IU%n>TbRaM z6Vm51#^k}bm-7r5A&i>FAp63`halb?L+qPu5bR~_W1neslka-=H5xN1mmA5hLr!QW z?$xKm7zJ;^XQ!c%VPl>__YWGwSIfd`Mvw}0fPEgLihQ?oR)+C774MzwD=S<4e;SmlltmsP<)ig>vO(~dY;0!wJ(ZG~7% zicd_!B0@ZbBhSU+nE=);TFHlsAaWO_aUn>;?Q^yo%j|ppx8WvKKgOoMUgL#Acq3+0`|$qiN|1OrBGa3MjxGl_{AcP zP8u(MHWf>D@zy%*mWtowSte${jNAm#6vJ{wywHgChxh=#Ibhv24d651|dqscQUNMA*El4p6~#Qsv<4%pS0%^nQMa@RaayXK{1-ijDS9?Fr; zafWE$ur%*B89aoi<8Wwc{{1reU3i9+InEH9<0SL1mO0Ld!yIR5X$401`XA%%I8TVp zaXw2K+=wNR2=rmG6QcW!L>smk#bdNAq|9-KFkxt77A+$}Y>rcYkj-&Y)*%8DM6>)Lo8x>R zLW?|;=pCEm^pTUzah^lYi%@zoPdYzDiRX`}P&UUYL)jdsbSiV4q03M`ae>U2j`4~G zvQQUcRUzIYi$fPvh+gSb<~T#EsJxrxCzLtP5S!zabz^g! zvKDNPlWRfA_Q+5+$0V?)ik3h1eXYOx#C_mw6B^q|9-Kehv!EqQ51IQd_h|O`%k^$dDVM1(JNuo8zSB4h7IoQUx6L+hxoFQe7Gh&(Jd>L63dH#%NX$clGOnu}kqX%Aj@n>>~&2i2GDTUY^=X`RqInL|x z5jMv;Wjzk17kV*!>!Dv>h~?G!K#jD}FUWa;oMlP7v1Ea4M$%j?Sty&FG#pDhwYV?X&0Qyv5qN;vKTik%ZOw7k3EAVjX> z8Kl+5kc4WEX)@l0EXT|y(Uo$bG-KvaG)hxU)2%tCdAy7?gCdP5^U-6PC^M~K!Wd1P z5rHG`qsBLoGVfy)Lis$1MQh$eAH`fuC0U2qd7q-$mU1of$XT3TlAwFX*jc$BXhH;! zYyzat{RjlfygZ$8Oi%8lS@4dvyhiQ^0`TTr-h$kpL+Z*au)M{&b(od&##!F7-0xsB zIIqz1dUGGbmTF#+<@M$6^TAtec>}rgv1rdLvAp5jtER(SYI!H;{un}HUYX@JbC*tr zw_N8MH|D-fZ@oHKd1kJE4!l)Xjhb@rB5$?jZOz?Ah4krk9x*30KleM374iZ)NhUd= z3v%zF`qt?r$>f9<<{CkGgZj^;w>|g$XyUwy`peRr$bCOWZqREWWafkx=axb=%A2J# z2)jJDioCNe?~2^UR(PANVywyiBb6$y|DVk2GIUHe^7c|O-VWV2Pu`crL~KfH;)_^f z>*5d=IXU7o(u&jaS-Cdcig`XSL)gfn5{*Vr()Ut9~F{lntFF`+ylS}>tMC?0`G z@DY(eP18OqqLVc3V_NkiNZ={{tS){!1M`zs@F)0RSqkKK{4(RQVn{t*w0}l|O%%HY z<5#mN<1y#}@c1m0g*tnKrUdOeXtQCB-SkwNSDqL{D_}sa8b#M+^j4IsM3g0328Jg$Mi1;I< zHA?(?71{g7UkXFi+*c5u@p`m;+GO$M)(|pdU`NE?ua!*F=}Z1io3xV262;N-Y175X zt-TYm^sg<)Fg7#+o`}MRA_^Od)IqKi zLCPzlu%U>;h9Zm&ZKaR#A*hJLh9U|ZiZC|xPKw9aP()!vk;$M{#)cw{4apBOHbhxR z6gCuLY>0MJi##cM$Jo$Haxyk_J~;h9U|ZiZC`L>&DoStOa93Tnnt=#2y*S*pLimY)Cp88=3*JKBBOph{A><3LA;h9Zm&$;5qVBgTdz3LAC@ljB8;USCv|k1g zHWXoOh~S+f&s}(yehLq{5R&*#8F_7Nh~XU?8zYPjF}(9lO7_!CGIBYwp$KC`FC)0f zL)cJ+u^|JC*&+|Eog?R?B8&}17#kvHj3Cg$h9U|ZiZC`rEymc;WX6UjjlzZ|S=i7v ze5dqgJoFAwhXWgW8H1BH$-;)-L9rgnjwP`nj%8s(k5Q~=C>G5uoELd*Z0KST(j*HT z`Z>k@LsncZ!q|`>Z83$hp<*np2^;z?QchuPh=U@G4MnLX7#nILCu2jBof#XFJi*wI z3i_j15WZQP@y~u^~BHD{LsDu%QTJLozdk4Mh|-6j9hvL}5b_#)du(F)O05 zp@_nUB8(0F2Ss3P$b(*vFg8?0PR52B$*HiRh{A>@S=i7_?28n6;&_%`hzC<2xytB) zS6%osHNx0XnzCbT=o)e|HuOcbC1XSN3LA}uDR?HJ;F*Ae zX95bI2{1e(E34p{fP!ZN3Z4llcqX9WnSg?40t%i9D0n8I;F$o!GqP?B&&XOZJj1n+ z@Qe&)ct(aYJR_Y9&peE_4=8vhpx~K+f@cB@&&awlJX4NcOonFy3Z4llcqX9WnE=Bx zGO>bZ0t%i9D0n8I;F*AeX95bI30m-s%uT^F0R_(l6g(4Pc;<_;taNlIFdh4KM(4L> z0Kqc>hG$-o0R+zk7@qkb89?w%fZ>^QBveB1On~8;3K>v?XXzX~9PkWzZFr_l#v;%n z!0^mc8L%AB(mp&m8M&PBOn~8;t7Ke)X95h*yj=zmJQGmxOn~7TVn*!Y+VD(3!7~Ad zXQ;&(o(VBL6C4H41TA>xclb`}ID$$34Y@ktnX8b87PR1*N&-{pl#e5pgl9OG1<%Z* zSaizA0nd=vhG(9_9(d4#XRf5UZ_SFU1sI-r4>}~w@XYNL0r1QK1u;CsK>>zm9-^^< z;hE2nli?Z3&J52;o?v)J@(;r^k|!9R`2)2j!!wdS7@oPALK&XvBPYW%d&$Z0%s-Kn z;hFo$$?(hoIT@aLfSe4^e1V({&-|L449`$=2dEdzw+ggNfZ>@!axy%#ft(D_RFae7 znTyED@XTs*DtIQ~nTE{d(VYOpGm>!>JQHAeMpBQ0X95h*$kAHCGXVw91Q?!?nJIWC zpx~K+f@cB>o(V8K(+2b9_D;>LXVfJ@D#T{D}k@p7|fjj^P;%R25)&W&uJOo|&lNnSg?40t%i9 zFgzohQNc3-1Mh75BSNxEF5i=Xm63KTQypbJMMw_WS2uEC(ZMZVf9YK^N#d z81_B61*EBdBNSS~xl@f8b}@46IfiC@!+_7U;u|@LmmB>7nih&x#;Zt?8{>BcMh(Sm zU|+G(N#AK?4frwxDok4LG=AqbR#438tPAZk9;0_NIA%c0Cm|5Fvpi$ytZYGUtMLfs z6#s+#re?ekQ$%jd&+v|P)(a0qB_87=#T`SZWIeg(8y}-$oyQ+TFkJ%Z&0S`^jHtOw ztzhFGRNTdKTr9`Ma$GFO#d4akW9y#t!L;O_^TFinp7U|B91#M5VYpZhR!HtOZo-T6 zneI6s7t48%aIu`T63eM2L`HvlIUaWldC-S+UTMDs2Yq15@-87Gbk*Uc&xmvfcWU}Q zVjCq}rsdQAjp50sJsx8W14AJOhHgTPBF`>785jyPF!XL2Jd9^V0z+X2h8~u|AHXxL zfT1u0L*GKE1q@Ae07GF0hUgZfah@;(LqDMm6fhK4z)+ZhA<8SPfT6GghQbUC&BOMj z1q_81Fcen6P?&+CjTDd1?SvID6rPOj3O=_JW?)Eukbxn}I;?=9FatvmA+*Rdlio2f zG=-cD43(0Tfg$N+V8~CQ3=GLo28N_l0YhO1hGf197z!(3D9pf+%#48{`C$fzWM&E& z3M*hJtbn1g0*1m*QoWbU$|_(etbn1g0*1m07z!(3D6D{?umXm{3K$A2U?|MMkgOX6 zL$VeO3~?>6FC_NJPzHu%C<8;%$-oe8K!+7D6js1cSOG&}28Lwa7#Qlo{weQ0g%vOq zR=`kL0YhO1hGb#|422ai6js1cSOG&}1q_81Ff`EuhGcFE7z!(3D6D{?FatwH5>Fvu zC_Ei~WON2(00Bc`28O1|00M@>3=Ewo0|*!jGcdGF1`se5W?(2K1Fpcc^g28ozz}(D zVCZHUi{O$l14DPq0NTeceHaf;MlL5X6lP%P2^p7wp)dnO&&mJ-hQbOM3NtW7%os-P ztaCeI1q_857@`(qU}zEpLlZ{{O;-a+Lx%K!wMJ*D_|(hz|hUWWWov<3M*hJ%)ron6oG*u0uI9r z4E>Uv3=9!`6IQ@bSOG&5Envt4{G-S-7SGaJJec~(RYniIir~+bFaty9QFaUrEg>fZ zL$~333=BVuj3w*7Ib+795Lhfq_1xPbsfj$cjfcbG(zM!GonGT`Pp)Sf-sbCr$QSrZ?)#}2 zB|4QeCj@J(oaeZYA+|?E^g{W*PL{}1p`R1_3;q=qkvU}%lzDm#9Y@d$olfU@a^gXZ4ulT%rxFhkK|{t(waO+~zmoY&_gwDv3HWTWl1yUAUuQ!CXzOzyZ&{Sh$X)(1a@ z=(=8a0DrW8JaV)TEJhFO|9S_Ez`bB-ze0<?Ovo1X1hwoc9qO_w9vBHu9De~Oe0n@+mSF= z$!vEUIhpOAgtOYgcGV8Ht9G!RkJ)a!WV@Qh#CA7Jwu=Iq_vqjICuk~TZA+cvvfWw4 zcISgW^gj{Xy-i4Fp&q852J2y4=O!T|tSZ5_j^$om+JH12_)*jw@GDydk2ZmVZh?0= z6J)a-aguWq^wK0q8Eci28>^Tb728!xZmec*RBY#y+*r-r_&%gB_YkR9GdF$;PKz6> znH$L(nZ=FO%#F`d2yK#`#{Z$0%#GE|jbn)6m>a7VH&!z@hUq0wg4N88g$Su; zZu}GSs%CDag;6zgn!Xu3a_#H^e{u=-8B;_-|nYW9qoAla{+*>3~lS9rScoFLiH z%j|cJ3?>W5m6H9u%zk&s;Qe@dnf*Qhr^S9=X1_-$geOBUv){i`2(zD8v7eXO@2B*V z+0V=D_Xi4L_VX(C^D_HQ07F>p=VkW$3!;0O{eDeOW+qF>{sPrzbXg& zRWtkTk?iMNPVD!rWWNM8p8n)JG0@>!&j-;l4`Ds@5JG>C{U$x92Qd#&%jQ%F@muh! zCdT5WE^a_zj`%+kp2Zl-M0^n;xndKZ=ZGeRkI_7Xh`&RozS@)f{TNbQEyHLzbWY!v z0VuEKQ1^d8#;F)1#>+1x@YKa*JafcNcnWa=MbO5a!s^k$BJKpMN8^O6M`+^_9hSY8 zt4HIg)uS=fbF9^4K30#OQL9HRiGP6t8CX)-t4H!@tsd`1$BAmWLLR-6G(6)EfmZZ# zV#QDDl$bi3I^7mYKOrMnE6Gohe3^5|$4kk7mP^THyp(*HdR0#{i#{SfT@z?Rd?$X7 zA=A&|SN>smvM=RZ3~L>JvyPr`FqfeOZmE z^)@P+=99c#!@T_^gj9McvQP3ho14%3t_&uwbQ(I&|E&zBMWvs4I|tNn@wT6NyNp6E z3()$~&%8a6LYTMxinsmD+vn3u=50Uob{B;(Z~GN*`M^#k|&>&1=oI zyw>EECq&ZYtToA~c)5p+if64ghh*?JJhRrCbaQvPhg7buwI)fC*=x~T8NV`;ShWchbQ`>PWP-psB=1%bS2-s~T6f+?8E3CM6$@sqI~5CN ztvf%4^yQv=@wC>RpNBJh-T5sFVa~MHoi9+x@z$L>h(CMXSxO;1IgVa;HquMyy7SHm zLU`SIR~0##GoPR$^5poxaGun)?1E}iaPccy9X5t*~q6b>C((a)tltwLQMk)eGO+Am>SIOAlPE{)-g(`9674W~%j z9L_n!=5UJn4co&RZ@nrGeihlgfFB#g3FsfBZ>@pS>+ucZd=^oPJRiX`%ODQfyeaa0 z8P6<(IKPs?-@|jXK^)Q$KfXbniFlhah*J$uL>;UdZ4ig@I-xu9 zZ>gQoAddVXAFQFQM;pZXDME`pSI|2?SaT^k`Cv^4Ir(6XbbbgMX=46z3gv?}GL#S2 zNT)hjV;RJe`Kp68qYdK7%=lo9{4gJ^k(sH3H79EjM^;uHtoa)o#F2I5gEg`ie6WUV zf&EvpM~3pj8X3w5YowD8)-;!*CHtsRrG={#8pM%xW$-I4SDT@HJ_KU=(vex5a*jR;5&Gh{t6FHMlR>U8p|NgpJiN! zL7YMyDLI}&9Ad@@HbjqW5QkdqBn{&1#CJ*$;-Oy%>Tn#ap))HPgE%7;>*4HJ@?Z_e zvJTdKkz#$HVqJ~2oELfRgEieCq)FDnn%_{|SF_^U264h@3(Fu*xn&UNWu&wW;&6~< z5N8Ip1Rt!KOU@AJqdX+pnGe=Tp5TKul7IMMjpPYFSo2om2|idO*@KY3^4K^E<%2c9 zqI~&aO%8?f!5S|)`Cv_moP4n6Ws1uOYho122Wu`MCm*cYMovChL(LrtpqAdX}l;51tK5i*l&8N`v)qYl263LD2z;<+EPB~8h!Y?uAFP>8PIa*67zT03 z6i$(6KAxpy`i7~GTxImYtJU~p8^qa7+3~@e{p93>HBX`~Pt72XY(~L_{Ta}b3B7M-$J4sZNUmch-%)WY0H0! zgEbIUT!aWc?IJ`jLgXSuE<)rYL@q+)B1A4iSEt{QG3^0X&21y0jo)m-ZM! zEmSA$xGpWo*QI?IZ^wCpd|lc%Ckn#$u>(YYiy0jpjsudHb zU?0*#b%N@;v>?ttX<~XGcBq4VUE0MIk5QeVx-Knd@|3kWn2O%BYTXDpV(USsrq~ zK<2AZouIldEy&lU$;=qlksoGMM`or_ouIldEvT+b3##kVf=^Ptm&?j3R41seOAD&& z(t;^!%hj~c9aPt)1=V$FL3LePP+gZ6RM({i`MNY&H%4`2Eg03|S^#kodt@l1Ix>_| z9qD9Lhc0#sDpV(^u1gE5>(YXJU7D;LqdIh}5TiOlbzNGp1U;ME`WU_(RM({ie~M1d zT__VPR3}Jl%-mIUVkfAsOAD&&(t_%`w4k~!Eo@zvCUaA$PEcK!7F5@z1^K$P|C41U zR3|tcEpBv8Ni7>lZ90HHcTzAnv_0fg!VZ$MWWE7>3pp*lgnF3n*OXA2@b zP#yBxsLp`Qhp>(yUzc{h3?PFzrGyA^GIBXlogiPA_Hh}PP@N!Om-a;&K-Z-O&qqbZ zG=Gkqd|etbV-SHBsuNV#r3LxAG-@$Mbs~IST6olTX<_TSw5f!yTtMgw-4^CRbv}+f zw6Jwu+C>!WitJbt)!|qcs-qAhh3XJsWTQIy=$x>H>b#e7`~>BgiHorYCM?FTcoxwn zerF<_w|R9mzk8>PVhoRHp&8 z4l=4E*@ICXy7w%|s1BLQ2{NklFgY33p_|i!jOx(UYC%SI$aqeWQ60KZEy$?OAIQn5 zPME&Ns17xEFn~5L-%6LL1sT<$+uMSS>d?h#K}L1xKD8jDI%I1m$fyoo@fB34PEcK! z7Ub*FB;zPlC&<^ON$OFkPH-LAvivi0v{tB2P+gZ6bkU` zx-Koq*QE^rv;!XM)#=&8P)kLRfw-klO~rK)uEfyf(q3Ms_W9i)^%yW zK^8@x-{V=DhxH3n6uHXifmcQNGbzZ|rI{e5Afq~S$jPYA)%XabI+NGqPK`n@rfEI+ zO9EofCqyjx3vyl{XGA(zTe3hlqe69pbhfsnLk{yKC6si^24hr5Hm*W-f^>SfWaS4? zDht&K(&^ojRgX}}WgrT}6I9owg?0Mi6sdEfrBR_AEw+kKoz@R&TEpdAH}^Jdy0mBO z=FMBTG_2d**Wb{S?(2`H`uYc=(_*t{HVkaumg-A4^lj-MShs0YRK6Y9x^+{3Z2HVu zb7nMb+|;+e2iI`1qoJpNht|HdD{$_z!1UNO{Eus&^znM}IVE_C!s^0EVJW7f}>peQ&b)ZRe>$Hy221Ga~j0pMpbKx8Vr@>Bx@}O|eC9g=! zM})DZh}&9#rXW9MQ&8df);RSo^cg;tDMis_B=jMN;t2?yR6t3`=b{8?zKQZrDZc<^ zP{D9Wtvpk1Q1dJqR$+zZQUveJOoVv_IjEYZkJpONsWu`;DF$o!{;>^1)mIHT&TfEX zGz&^w%#|LWX)}bCIJyAdQZ%lC-azH4Bg?F|w!9OZ{ZQ`ghYI;+j8X%@4td3GU zUI_6l(xiA{)uH5#z)SVDa+&C)he=LCm@Fw7C7*&&D+QopJHDpXtBmIr5cQhQ0Qy!G zQ`)g9#?dxtIbpY@M>-Iao9Qul&aqo~jFSTm)f?1tdD*Q$R`FcE;=}@*zs5NVfGQTs z@4~?hga%KO(Oyla4Nx$D zHr3WzwY8!iMKOvNj;5Jx(g>*zvnjf%k>#~%$np{eS_p6Ka_g0?Y|@HYc3Qpyni1)wR^I z6Z0{Ec7cntNi-jGR|%GHQ&emaq=Rtt)nHri2nIdd)NEQ~utl%YY~qd~;|%#WWapqb zqS5-imB%!dh{`_QreLCN81j@uxnzNvHsj55Qv7Tp;yHFAO>0t>W3q2{2GAFdIfZ9a zp*tW;!RY7#IeQHDXOF?P&f)s_1G3fI_9TAX0T~mwMQc`6$HWZ^cMuoe+vG{~?wI;d zI4E0$N)$0Qn~aY?C{tt_mNP^ibCd%_YL}xSrdjffBhW$jnl??vaLyJs^-F@csUH=@ zV0~=rSA;)D)tw2yi8x~v^~Y5QWaQg_tVHV+F<(Bd zDj6|`gUX$9N|xv`F`KOI$pCet>?d0vx4ibG053CygFlENG9+(0iiOBF$wzHUr1Zy@ zRv@dW3NwvPBO0AAH+|H)CAiP#jNm5mPMPA2} zYxIK4q9xhKlbp2VB=O1Fq)S4ygC0*?h|bqZDzYULnWOWojn3jI(zb`hKZgkZn3VkYl)2w6RRIjHmBxh z&tSBrX6>V$a3{cCx{sCAiEN!a0FE!va*J2-uE1C)_1m;&qjgiitUy&otzE##_j0Preb>djk*HJO6Z zOsmpCf5p+;S@U2Zd-R}L*BVT?YpsC{Gp^mWRN`=j)g}>V?`QUlcyVP-!`%CmsrRR# zDGk~Uax%Hw>vGfhAKL5a#Y{)r3@r&dWOsDf+0k~dgIKc|n!0upb@XJnqtO(vL-wX& zfOidOZV#XXZE1zaZzubQX{Ur`6k=r=0lO#YV#;M&W;%d8GEGX&5R=(4l~U4dAvc1j zArsTyb&1*=EhGkKXfAux&ZfCz%NE%Aa84pbb8@q8mQ8cB>p+3_iVvmc0mvP4Uau1k zNh5M^FPkt4s>n=5BsFI|5hhG~=#hjui3n5fX(+;kWNgu+O_=qHFtMFXgb8}&?ZB8# zm_&;i!lVskYaY|IX*OZna<2SxW+wu4cr;vOEJT)_kPr)qL_07_Szt>><1$h=icqM;EwyJ`q(lrASgc|KaLgWXYzeYN z^)2;&snu>M6M4&OGUE$CN$N!GP}JZL4=ELPPkC*DtTOWzDFD;3R;A=v$V@S-OYK3= zM+xj*DCa5%s2fuum&C8gjtW+*yx6xuw@P4^#NiCVoXqTbG?h$bvCug}ot=bmtQIFy zu%;KA6f8!Uq~L7v2{pP+1LaH=6*h+hnPyh6bka_hBARMm-ui5ksmYLx6o-jq{E8^K zt247+fCiVkOo|MV*>fk0N=FkJ)LWQ9NLT9wzvuU%$Nt;r2jRcG`Cy`FDiL~5Fq!msg zCE3jTW|=K{C~__w-4!ik(>z+aD_Y(#J&gs6yP`d-_P$O-()%m2hr6OZ6)gDmv=4e3 zv|!KC?uyo3V@demspsI*_EC!@cem#FVuw4Dxcdk0wz0$)32t<58!K4J1{->7rmda~WbCsS&Na@3Gr@{kyF0aSmWA`lh(HQ;ISK(J?*zNeX(uAH z$6sM@xOtt8Uuic!^-l)Ot3JB%eQx6)caPs{D+`!+8$UxwrzDQrH2VhGY0FlF{p)9G zZ4D9{H7y3uQbaCLqbITOIK_bEEmS%=MR;TJG`%Ud6+OnQ6gZ=;hHD%;XVkyUUKCFt z2ed_;132rsWe?%>O=#Mx??GdPK>ljGt7wltGrZK;!;8H~FL&;1?cwEbvnl^~?geKP z7pW#LwwoAzz-?Wk`m5CLAld#HoJTi16g5;kLURY3#Lh;qHFPGUE^J$cGz_rI~5 zUA11J)ezR;T4Xn7vDFn)(_p;n3T!cR4?uo#ko`$CyR&b-e>2i|6}kT|iriU4tF68d z&Y%&~R^PY0r>tyZOHZx>zq~Hxb#-jxRQlZ>O6*GatWUM6;%_6_z7F@T zvj$fi%eQ7xd%MW;Le{l6Z>aI1lx!b{!McM)G;9~y+U(fv^K z=IaM_LfGaYG!5}csgp+_R1uFjmHF*;Ud3oG$=0j0d&k{y)m}qQQ+LBvUeEa2AACC2 zW|++yufgP^h8%2V**sJ=nun^LdoVtmhiFqJGr}EvW6PE>Y8h4}Y@3K*LlJ{JYfD*I?c6Y<%O?vN%b27BIP^7s38r*>4 zydwEZARswfFFo}?7LL_$>KblM*ZQ{f4a9oj)MBxQ{yqJv-fjI2JGS)gCeO}>O?_K- z>~2`!H_+cOuxDFuf9&#;iQ3FDn(T5e!oBG z9P}?jX67MeTqfl0xY$2OTTajHLiP8iclM^43L19wryDkH?OC@;-eAtxnA3&kQQ3{r zjazn5A4ctJA59vkmEJ)wrRQN8i>nD186co-0qc-DL64ApMr!fj<1ehG$TL(@mV-*3*EGr`Dgrx6dH` z86=gxPJ`u^bvE7hZ|c7^-P_aKhq2&N3}x0>pB21e$Ce&Pc&c{*bhq{B=$T+gbTW;A zX{Be~K;PCampWdYDyKT;gHug<)ckO&$(_^4DUJ>>?r=N~!z-FcFublm=3qM`2I~*b zS>|{dNs|&M7^yKq;Ty-M)Ke}*W~w{YMkIcB%=4$3T+%I#H|tUpTaGhW zo^m^^OIyMQ&A>CqVZJTU+pcJtYHl;*M-nlgx!z1Y9($~_yEApTVgAw`@kKYJANA*W zFhRdmNYn8v$D58V9+9G177xDWta+*p$P<>522U&fKYq%02a+?I^Ici#^yvN!WF1#l zI(=E|wUw1#Gil~Tlk#7i(B(M1p=Zm$reja)CzT%NsI0kgbI4 z2IEKkiys_GB;~(&QzCJOzooIxrs}{#Gd?)jy`sbCU*y==>)TcW(6QTg-UNpnpA{4?O);DEh|> zqu*Te#Iw6H? zCEL}@C38eyl|X`)B`%gxq=7~7NlNQx`IMqJf1 zZEosZbI?Qq&G@1Os=Pwv8QTxbR$QgZx~F;iO4$o$G+_?MI@&r`ck~aV{)62IMBerl zYsFa9zXkzfOMS2bm2W%O95&<06gA@t<6lN%DB;dtk>8HW1!jP9T1-=BHJ>sXYh{#N zIjb(w5uaBTYl(LZx5T?MzgB9{-8JWmJvGzCo_cdys~FpC4xx1uowD4&KRg|u=uetv zbkXHvT)XIR4j^AJK}=>v+3{~wR#Y0)>rj;$#aF2E2X-PKQBa>E609Xcr_bkg9gYnq z4_w&IyGWao4Xs8zyth6*yePHfh?rX=7Ss~BL2~l9f!q~ z8nLQA9zSs1tVK_4Oo*#$Le_5&#cDz>iNmSjNcwOcI(dZ{x4mV_(@pVhwN3FvQdHH5 zE9=n`O9Rmh#qQ<^xEX}onv5q}6T7;NUR31i!%^pd{%g&)#7HWZI6Qnfk&Hh%n7n;4 zT20F8oJXOZ@|?&TAgb|*PCs|qI8ED-4WeCEt!Z#Q*9~yOB|M+ ze4ukR8mcGKkMVKZoZ9YTFzaAz3gsVcji#bBve=_XYvRFFO#avSczRx9IB5`o02wm#hpR`0~f_HL9r z(SqI!cPFB$czPokpTsbh(O?QvLioCl{;U_rgSUj`rN>RqwGxD!KSQ z)rtEoS)TGvhr7x;t?qYsq|abUa0W}IGe|1w{SCPzjY>-hVxVW+>9zWqECStKtkc}Z zlIy$UqHcf3)$UomA%4+9tZjq3DCtVg>x(~w#nxPi4mH!gK`+*BHD+V)qtX7<{v%EP zmRk}Dh}8GjUf3wcb&+fu?L5-50CHAG{P~er7rpqeD~>$BA!qaWBP~b$7d?{s@3Gjs zk(K!L-X4g78f)rmv1>crUX9Y^IX2v9H8ed65bf4<)PNb*$d*ST{_7Ip< zSKXRSd^Vm;d@k;f)8CIld{4#aP@eZLNhcT7CX$K!I&9a$#C=xSbbpS3l=iHY(k?n@ zl&ZjnzVzl@>(ae0I&ngUh%;A6aL4u29oJ6)bDrFe=$lsNKGVJAZ0YUv1oxBOjy|cb z?Az9JdJ-8gzAoQd6b0BMtv9b-oJjZ^8al8M*_|5P5Z%$8I(#sCUq^K?KAb$< z@l15M0U;ZrJ2@PiX7%B=_!?uwVBherbZ-)SOe;D!tf&gy=3jyBBQbt^+se-Fd#C#Q z<1f}7s1>EnYY&saF{y2+BmMY--5m++jilq^s&-Mh-Qg+dxvO(d3#MI6o!Hkwi4zHU zQqnWNJ&`z!oz_8!H=>|DZSsFN&TWXV+OT?Md@$aNCwR`ySg@!Gi3sO z1hT{6V4`I$HhEeRCvoq;yt>FtFPXb~Lko7O(tfi8@|&5AtrVqQ4RPA_UJ~yf>~F+o zS1Nf$|p1Ov3OCsJKf2!`t15NQ2i#E1( zrjv;dY}rMZ^ojZ!acTWfe6deICHv;)D0#KyRPNlWKTi9}+-mB~cn z3En;w{avC0G$Q?w+PXwl`+-A=$DdQsnljaf0VM|9Q;Uo*WeuMwN- zMcHiNr|!8<7?G_7~_W zJ!nxW+ubeoPVz>}b_xJ|Gw-{(f|o0Jor3KYpG7jx72W)qt@Kw#-#97+lM(qjDHd5P%4L`Q5<`f-VI*ZXPv z!W>@M=?AV2{JI99ZCmZ4X!?kV*N8+t{?4uui|Y|zPK)>pQJ|-OlHXrzHawmh*_cku zSu||@M)21^J(+GY<8e{Y+|-eXwj_s>ZK-%7+S<**W19i$#ah_cmh>Z1ZA-Tmi5zof zvhK8hp}(nRM-s84h;8{ex}9fBZz7RwYD0n;J7wB7iTy&Zs-b2T2N9WhTWyvzXA1!jhu^7;GYXaEXZRO$>_Z?P6&SReMRjn1N@rXzJ-8gte~0 znYyGs9bXohjlHUtj^~>a&tF>iZuCywx@d#ZI4Jj@2qn%56?f;%FTr-vV8@P* z&}@jWJpg%E?5w|CT=j@3?&)nwJl- z@2qVLdm%MVn>&(vzCS$_r+7o%aHNM?p3e!D1;y%m5vdWYo5keqZ4glwuky}q!6sQ# zTPo3kHj8)6@AdnA@n~B&N*h6~<^Z;j`xn+Om^ZiM$jD;v`AD@P9z9qM^l^%5#zkTK zAVg~tc3Mq-jRT;`Arrf9fqv8MB}ZL< zliz$#YsxfI#$D@0aeHc{6}x!p6^X%Q_h51^Rwno}?*xC^IOcqgV)@z*CqM<=paMXz z1z006nO$Dnx-niA^-qalu`=C^_qL#+67g&OJF5Lvb+xEMxVp;kuL@Pyid}n2{@c|B zuzwJO-vzOF>ToLYwMD|;Bi6TzFjP`%<`X3kfd{eM2TGX>(7pve`!_ExOW(Q+d;vK< z?T`8VvceC*5l9Vw8JyYDN((2_y=aW?BOy7G!XD@@DvGZ~W}h5PtEzPMo*=K*3pcc- zh(%lCmnY+^`s0a)4m9tGKNd@k_@?`#qM%C*K-#ZwGF#%agNbOzLNjrX&+PP>q$?6n zBtQ!oYY+olo_Hc;hcDhTe9RWwxfkRwc6NcshEig4yQsKzDE02mb+eY5zC?U~wV&^j-#y}zZc*G}JSr{B=JGTA*bcy2oB zYZ-(dfj>U$0+GKxCAPQAfuUWLG>>%9c#~{t?Tzo7Jtz279BmShcgv?pH;eII>G+P0 zWwr6aS8LOTNo&Xac2uERlwlEoKe_Wq8Vv7JkV4Xz~YlTZa4Ifx>DxO>@OCzi$1g&R-4VD5+B66 za&TK>dEkP8|48CU+Qb5PXFFOrkyw$8AE|l^_UGdr@tqqVNOUwMQc3V2Uiz`>nq7DC zyu|8wa^tKzsDs_&pS>LP8eg;fNHRHbZmV3HnPwd(ilH#{%B*%Zn0-?7|CfNm&vZ1{9PeGbUl(_??`Ge z-ZrZasvYt8s>#ERet+wiFkPV=^O0Bj+qLWcqOd1^B-z-x@o>j^L5xRWoq;5e{zTy` zm|4fQ4=1rA1YMl#?=`0n$LChX=AIWs^G6$6#10Jf?ZfewRs@PY_t#Rm`C>!-MS4?) zH?7BfGahf^u?xWUw`M273-Ri;U1GmpBmR7Cv$#QTKO*vbRyM_<)itV=sbiM11H4ny zlujmhA6%L=RWakDw@dhHL<&0q&8-+e#KP^O1qwpj#oXp2qOfb#%*7a2d;Lj&@=LYx z3l=PZ`p*OYsUVtU@>4)UX3fI{ZziL1L0Us}TikB?;wi(A7;p2(E^ZQ=wu_p*k9Mz` zIhS%mM*d{tgMmvHTp$XzC;Cw)na>=6AmC&y&XY*r`xJ(#x7JN+m^DXiM*5xyq=LvD z1}TUXj$WP)r295+?%T5Q?*~1o1+hH!da5GUS)z#IE{NR)@!xwve5R|$Gh0ye?tcb} zI90w^>+z#gp7P4_&8MgHDY zix_9rw_ztaooIzT77cvuo~S6_OB$>b>RTabVkKK=R7cGurf5t^{;ALnhWex5XTDI? znrIn>C^rN(Z%7@O|1g=w<4=twM=tp?W<9a2Mnr4GvS!iPe&~U#Y6F!JXPz4L`A56} z?c;}yp~K0;^IuIseSf(>UX5M$oN2{5ON#psS4U&w;&w6n?qs~J@5Y;BZ7X^glDOMo zn1}C;#}5apr^cq5P0=P4#h8H))2F-R@#l?{Kb7!zL%LfiCUl95n#ByGKGoq%zKSKo zU~AlbVYS$Pt0=00D(5;;S_9$nGEv#JsBe+!U6e=-RGTJb#HS2@oT})rji(;n1uW#r zMEv>W7nX{#cSF8S_-cp$)Y=MRziUYftt(gQSaV=$(cBn?mIN(8>KhwcxLg}zvs)4^ zoj*Q26$`gS5^E{3=WghAV1?5)GLmYAX0BC%6-|gYQf|%zs0|Q-~RpbuAEw0ZECNM9@|gix*lAJ6UCK4n|kStz^ zTNATOW(mv>ba<-*Bs+%M`KcbC@C?8KVzQHPcT|P37cZcj%jPdYC&JwK@qI z@Tet#yMn-Ns&Wi+R}d#bJ*O?!xzod`4)N{^;xrelZ<-avN$~5@qy5$`8#m#nj>kMl z)64DW=)>YC*W3zqwW*2N)Tk*U^&M@-J=3=N{ehfC#cR!8;~oGbP5vuuD`WmZr9V~` zs|s8lFy_?e%qh!RRMs6gKie4VHqFl(BZ#@ zmY>{7?YJlgO=#JZ+Td3(soi*vesG`o)iuy)KGv+(`B!JP&Xb+hnolsRy+xYB_&k>Q zM*;bu1YUbxx?$U;Sb)677|vfG^^Ot^EG%flwkQ>5^qwyvT7j>jT@MLe?7y~0{2AJ# z`>w5t`{s*nkBD1EyV!pXDbtJLoUY-7Py9ry7x(V17tiCaxLfe%-kf@~A?n3td!5Vu zEv?J_t78rRVDFM>t2rgwPz%+OhJI*`+(xcwLvMVlzqYnPjNMxmGkw)j==!%D*qP<+ zJ&-d7a>L@Ysf925ceLw()%W|v<8XZ8YRGH#Vq>#- z3T^+`)w1n3){7rlzORXT@y}P^E&c<4!+S-rCxK(7qOPW;I@-_;JhG*>yEX1#(T_~# z#oC|?KcPNn0@`!R+0>rTeI4!j>vMFB0idI*C}d7?&sEJh*dgAQ+bmwas*CPo{IjQ7 z{1RH*@5pTzuUu6xZq2PX#UF7b`{rD_i7;VC+en$IuEk&LkM&QV7Hbm|nkDi5f*4yn zOW6BAzJbPir=j1NVL9+^(_7->iOk7{dx>%-`%y{C$=@u7e|cx108Yb|4SnN z-q}>&cTs&mK2|?u_8YxYx#aP)rh1)n9(tJSldS@oViAR}4LDsnhfp)A_;S*S_G!pV zf1vI;DCMQSmb}!Q@GTYTubhXAKxpQHtn~O`i}=ko&5)0p&8dyG-o%p5eP8zXc0d+d zX#T9T4fmGq>h3lZQ=*GZ6SC3%-Vq}ht@fJ>OtWRtqtCZQaY7Wc+k%BL%x>KWQno2ie-nZzL?iKOQ6s(r5r`$EyR#%DoHYBEl!?&d z^`fs{e9!W+gmk}@kQ#3_C*x{t9H6WU%}#YDQ~qS~!64o4g5Q-5P!C?)HfdVaY#Hn| zpiGSGYZv0wkr5k$WU;!l&6j}ql*-A6{51KE-_qK%Xz5=`scCi$%~BnOY69e@t|rL! zZ-bEJkehx55$X<0ZW_+5pPEpDQy1W6Z) zdPDR0!T*Q0dWV!FW;0FxZg-cGna+Y5zDPBEz*)l|qJ|%|1*Nl~h8KMoHT;~jhF?Vu zGom1i3~y*EeTZuKXBGe#CEB{X5B5JW{OLi-ge>X4p{uw1d#K)*q}(@^B)^_4$?q^r ze&2oL4>sQKqnTmGlaC}XmHGU|5Z9^2&cmj8Tv;|sy{)X1Y zaL%gB36Gc8(IgT}=)PW4d<=I1->lcmb#;wwo=1<-Ja4Slx#@>!o$u=U4BQ#lxc@b1 zpnK6k2I#-^`1G@RYw8U|KgM%tp;vT08t-pw4Rk9Cr*B33Oz+`yb-P^MuHB=o+aG-c!L}b^Vws`WwZN`# zOzz@^+{wY!k#cpUGMo3&6IdWW{n1^D9H*b$og6afl1HnNxH?k(7UFb@=cJCF97bqz z_zhOAbLVunE;JW);?{CAmXK=*k2_7c(}X)sxYNW5mp|_D!N0CNaN7F1uZ!b@5qBPN z=K*&faOVMc9@w&D_tBTyylIY9km~*)Xt{9L7=8bwhIH$_iIyC*6t3Tnm=dfilUU5> zM}t*w#8V2te;!r+q^^r~r0#Btwe@0hb4;x15>uK@(t)2?ADz}mdfn%R`_095-L=sU zvjJB_cbJQ7yZyD1bV?L;$%Rzm+0-t-`Z3z&<2f*pT0gaRs;}1Pg9f76I-RUREU%AM z`x?9b8$?~bSYO}SD!lb#vpiBTwth-=bdKqd%Bu(R&ZZW*?gg~S9lDO=0Q1ES=Ro;? zPmg%}InCmK_S`BCoKp|~tz!6`?cyc;z3rU(gBw=#_eNLrUom;5Y>e*{!)Rv-+wA@c z8e?RvzOSJQx)&0n&6l11hSm&vkZSb_8VvSgFi6l~P~Ut3MuTP^4cajpboBMLb+$eJ z^icZpMF(o{=`h>sDjRy!mvxgEd*e69Ek8qZJcKb|e7!l<@1IiZ zYm$S&8Zo0D_E_Z2#Qy%;Zs>dZObiC?G#IR~2ZQY}-7yK;pbP!?Nctc9#&3}8evSsY zaf~i*xvJg=?bbnX|BW~b#G}FXlNb%2SaZorIa#>i%no<8<*v5e)t0;3db6*#-t`O2 zD!1kw6P$7Hc66tSta;MC=cMm=Bj)LY@Ggem+u&aRyA7HM$C!&=7vKyw<$h1o#GyQW zaG{z0i*>i-?Q&0HwOMi|I z9b^Pul82x?6;yzTf5AVz-dkKys2$5+j5ssL85&S0&5IxTLyA?kF@gI!}-&G!WO2c~JP$B15|we>)4y5MD4u`O^34-LrVNG>5-O{)r{{ z9{wimxcka7`CN;4Z#n9n4}MDbeZ2FboSlU)6yYP^FB*ETXx|G(nY4c>HMFZ_S}$G~ z50&lnYIfRmnV~hxI)?GiJLKCJ*dIn*Y6Hsqy%P-W-(*@J-j@w|_xUpKwv?m2WZHn8 zHuG+v!q7f^oOC{~q1~7Hrf(>)FPtgQW0i(>E!reem|Y&bym6nQ(avUPp=p0}fB3q| zneQfQ4DIowz8ip_>Qd-8v~S6@^N}_%6y7&^zj+sOzedhkg>t?_z`d|lb~-Wz;324r7Tp5;rpukCXAj`9aBKhXlkpA7%Ca5Il((=NUL zAl`Q#<9)zN|03R#W@Dm|+BU;8|G&Anfs*X1?tAZ`0a|!G7DC8E7PyTkvVx_a4-JEs zBIBvgAo*qTko$9XY?$T6OHT5wcG6rd8B#nWEF;*1e$O>jD7!#Sujvz!2 z%X$f5h3FB?(<6G0>}cs>N5+^Z6Jiq{vET2%&pEelRW~57@YZ^@rlxD(bM86&?6bel zK3{jK{D8yK95M$izEzpWfDc(;O0RhvaqgdD7ByBs~KFRYJhUy74eQ;?cs#;nWyl=Sk@R_XZcWC#rqprNrj?00& zmRB-)gOgSAy^rUQm`;=a9pIyc25-G(#PSEag)(pD`HYq6Y(jYcF`h4`o*U0nSM+lu z(H?kzX7{tQy`S1~=cjj^d1A-e&+It&UBZw%P^Rf9Gr(BanD z`Fb~+4YoEUxPOwgbpHihzR2^c$>H|$6WVgHf(-|k(Ds1SF`m2rAGDVt{eIHNj0S@^ zhcYjm`cJ>5TRz3}6a3yzcZd4MRtM!c;B}bi;?Drz=;82Q8Mr`ts53l&i04;s z^ZfHXf5SG9jpn}(m3{uIgzj%` zxc(U>ullqAtg+kl?(eS48XF_go5&yhj)3QVJb$CKQ%+WzKPuof1 zF!Cc&^qselMCS~Ll$|_xS>h8Y&mA4-tEqg!9|i96JI%kMh0?C*x^b2p!wu1bJmLf8 z`+Cpy^{_7!>KH%acrx9W;oT3AwrKSa%4JA@fpjNdgXy8{$&*{l4r%w1He+S?X&2I- zCr$b#-R_V!b1K;6!TwNNA0@r z_fxlzME6_yTX`&$RsH#q=po|)`4fdZ%V(C(-g55PUDdnS?`fRhO!{o(7e=BlT3NE+ zjDOD@KAQy|<*T}$A^m#-M`m?0FzS%x~^2|td#_BCoZ{kNLxIcMzB>D<diUY2Z9jk5d~UVn@prp;z>SvA;x1=L&+WPEs=KegXW#jQ z35_0nk8ATNb?Uv5_oA1-i*FQgxbl5LKCcD`#%*UVIeXc;EAAS-d(S;roxeJ1%eQ{X z(POx+p`2&mKN4L+T{rGNMmY!Xyza~mXAhst-Zg#q%sqwkWz*rp>BSE?-4S$u;QPyd zC5#`p%FE5)Bkh50(t_OoF=>alp?^q!!@Yrr2Kz_)UAW#$dfMIuTtCM1aVvK#u3y_G zZPb@H_Kz4p+k0DOFW@wC-$-OnG-W9*b zc-ZoZ@4kD!Z$CH^eckd&hiv7~Q11&L8i~HmxX_K+EjD!aigTlP?YaA^d#*meuiuV` z@Wo9gw&(Xy-o?K$620tu@N>v_$#0HC-!S}c0l$5B9z1j1*&EIszAJn8^gT1@3nrUs zJ1gGWgsF5Zd)luTZ|V6PdG74{Aa5ychO{dAhV6#Z9wF^|OY6TU-Kn&%k|zEN@GBm6 zV=J{m>2CmbdT5&%-!H z@W+8KA}yppJ_LVZ2>xSWv2fqv3_<_UkkUe^W|8%|9qP^4iQ-<@3 z_r6A6-IXHR6fM@~e(U+pCq|-U*rUQrjIF5d8(xP$_*oa{DBAed#SB%x(td}uoBs}F zs_);=dpe^11adXA`;vaVjI@w`-&4+CEbK0%c`-@F+`C&;gpk?*teB`cS0!9#uZ z0{L{Zuz1?>))jY-@_U#jD)W*biz1!ME5EsDe0ar{e8cal&u4f~$Hg|$odp~JY}Li0 ziSn&JJrXteT`-@aeCN`cTh1N>4(VSa{nR$;!}VT8p3hL84p#k;)q76ynd+VEXBuZW z&voxQb@w~&xnsw9jcbPA70y=SGb7RatpBULn)rj?Gp=|Yi0atPV-!)?J;QrmCjt-G zqc*McpAMmXsrm0Gzm9Z#srjEIzYa*$n6zMXV)U=(Y|dT11)s~v^DXl0#K8wGzwGs% zJ4MT3+?99F>xpYV>-2HKV(8oF74H$1(f8>0Z?CvZ4Y~=R1KSy32|MgD#SMhgmk+!r`xbGs6p@Xp2E$?MEBQ{+BMdUk3 zKAmfFHNVGqU$mtxwQq?$+TMOMzrR<#!{v{X|6bnJUYGCi`=#1}CwWJkM*hm`yC~?* zEx4(j-z2X#QrvHON0fIc zpEDT~uMOyhEoH-+(fz!mh2E|`mxcCd-egOD(fdi^$~tJxUuAdia`|~ajJNWBle}8p z_Wk-sc}GXdPu^qvF4+8*`KwVp71x{HYY)WTD2}zn$9}X=#>eZ;Dvzp_YPD_8`q^xe z6tC60@#+fiQ3U&!PgpK)GhaDw?{sP^vfZd}96CsnztS<@=yhwSEbG+7{M=%kpP9)` zWoF`Rt~6217s~TR-U>CWwp7H)xLvDMYwb?dYj)~u&02MIWxdiS$!hD=Z?EyY*QtR; zwPR(kw0g~MjVz(sYOS-PHw@wUM5V!R{_p8cyUcjA(ynX(a36bZv*YQq|B#ioQ8^Vi zYqe^v8n3on8%bMKU!~i1^l7cGTIP=Mv0uxLI@rQAqF<19w-=&aToE6uKZ#Z{R+ zG=f>{x;;>dDJW!hlxeh}M>TFO-&UgoI_s@=cQm059VPTvH(MQFkbB8`xLs*>;#!l2 zsOLo6lN`q=O2r#-qqTB;pmBy>PaHz}V1MQ33JYbP>K)H3-B#SJY>1-$3VOWjvFJkR zN~7YrscL0Yzf~G19cA=XqgTX!n;km3reF1D%igH=Ha1QJJ8b6W#YC2TqP0@#)?3Xu z>HB!I?rQ19Mk2CV8h_v3tGJ|kbG-%uj0JeU+VQUh!o(*l^=`enMw+W}a$#mBo?j@t z)~7h5D_)fZxdvK?ulB@eqJc?RV8-Q2yIuGBj@M3mDtn%Goh2^h)r|z>je0Zipw-la zaG>S--gQv5CK=S@QTxw5^__1W54Tp54pyJGdfnyTYU-T&J$+2lhUnu(>m=P^^tttDyxFd|=-$&wqg%}tC!8B7 zl}@dF!k8;fqdxDhHY#i4L`Ni^^LwSWv0O(3@iYBWUm2$KV$9i@ULd+ge)I*(&uh)t zJ@ayinlv_mBoy6QXLVS-UTIbv5~r0E7eb6puW>p9Dh~lML8AmOV~$~SvxV}}*okW( zVP~`6l-yaBUam{=Or|7>cG|`Z?P_NLq(vfMD94m}q5;=>l{SZknl^rWVmDAj39

" - "SLS Detector GUI version:   " + thisGUIVersion+"
" - "SLS Detector Client version: "+thisClientVersion+"

" - "Common GUI to control the SLS Detectors: " - "Mythen, Eiger, Gotthard, Jungfrau, Moench and Propix.

" - "It can be operated in parallel with the command line interface:
" - "sls_detector_put,
sls_detector_get,
sls_detector_acquire and
sls_detector_help.

" - "The GUI Software is still in progress. " - "Please report bugs to dhanya.maliakal@psi.ch or anna.bergamaschi@psi.ch.<\\p>","qDetectorMain::ExecuteHelp"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::Refresh(int index){ - myDet->setOnline(slsDetectorDefs::ONLINE_FLAG); - myDet->setReceiverOnline(slsDetectorDefs::ONLINE_FLAG); - qDefs::checkErrorMessage(myDet,"qDetectorMain::Refresh"); - if(!tabs->isTabEnabled(index)) - tabs->setCurrentIndex((index++)<(tabs->count()-1)?index:Measurement); - else{ - switch(tabs->currentIndex()){ - case Measurement: tab_measurement->Refresh(); break; - case Settings: tab_settings->Refresh(); break; - case DataOutput: tab_dataoutput->Refresh(); break; - case Plot: tab_plot->Refresh(); break; - case Actions: tab_actions->Refresh(); break; - case Advanced: tab_advanced->Refresh(); break; - case Debugging: tab_debugging->Refresh(); break; - case Developer: tab_developer->Refresh(); break; - case Messages: break; - } - } - for(int i=0;itabBar()->setTabTextColor(i,defaultTabColor); - tabs->tabBar()->setTabTextColor(index,QColor(0,0,200,255)); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::ResizeMainWindow(bool b){ -#ifdef VERBOSE - cout << "Resizing Main Window: height:" << height() << endl; -#endif - // undocked from the main window - if(b){ - // sets the main window height to a smaller maximum to get rid of space - setMaximumHeight(height()-heightPlotWindow-9); - dockWidgetPlot->setMinimumHeight(0); - cout << "undocking it from main window" << endl; - } - else{ - setMaximumHeight(QWIDGETSIZE_MAX); - // the minimum for plot will be set when the widget gets resized automatically - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::resizeEvent(QResizeEvent* event){ - if(!dockWidgetPlot->isFloating()){ - if(tabs->currentIndex()== Actions){ - dockWidgetPlot->setMinimumHeight(heightPlotWindow-100); - centralwidget->setMaximumHeight(QWIDGETSIZE_MAX); - - } - else{ - dockWidgetPlot->setMinimumHeight(height()-centralwidget->height()-50); - centralwidget->setMaximumHeight(heightCentralWidget); - } - } - - //adjusting tab width - if(width()>=800){ tabs->tabBar()->setFixedWidth(width()+61);} - else { tabs->tabBar()->setMinimumWidth(0); - tabs->tabBar()->setExpanding(true); - tabs->tabBar()->setUsesScrollButtons(true); - } - - event->accept(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::EnableTabs(){ -#ifdef VERBOSE - cout << "Entering EnableTabs function" << endl; -#endif - - - bool enable; - enable=!(tabs->isTabEnabled(DataOutput)); - - - // or use the Enable/Disable button - // normal tabs - tabs->setTabEnabled(DataOutput,enable); - tabs->setTabEnabled(Actions,enable); - tabs->setTabEnabled(Settings,enable); - tabs->setTabEnabled(Messages,enable); - - //actions check - actionOpenSetup->setEnabled(enable); - actionSaveSetup->setEnabled(enable); - actionOpenConfiguration->setEnabled(enable); - actionSaveConfiguration->setEnabled(enable); - actionMeasurementWizard->setEnabled(enable); - actionDebug->setEnabled(enable); - actionExpert->setEnabled(enable); - - - // special tabs - tabs->setTabEnabled(Debugging,enable && (actionDebug->isChecked())); - tabs->setTabEnabled(Developer,enable && isDeveloper); - //expert - bool expertTab = enable && (actionExpert->isChecked()); - tabs->setTabEnabled(Advanced,expertTab); - actionLoadTrimbits->setVisible(expertTab); - actionSaveTrimbits->setVisible(expertTab); - actionLoadCalibration->setVisible(expertTab); - actionSaveCalibration->setVisible(expertTab); - - - //moved to here, so that its all in order, instead of signals and different threads - if(!enable) { - myDet->setOnline(slsDetectorDefs::ONLINE_FLAG); - myDet->setReceiverOnline(slsDetectorDefs::ONLINE_FLAG); - qDefs::checkErrorMessage(myDet,"qDetectorMain::EnableTabs"); - //refresh all the required tabs - tab_actions->Refresh();// angular, positions, - - //too slow to refresh - /*tab_measurement->Refresh();*/ - - tab_settings->Refresh(); - tab_dataoutput->Refresh(); - if(tab_advanced->isEnabled()) tab_advanced->Refresh(); - if(tab_debugging->isEnabled()) tab_debugging->Refresh(); - if(tab_developer->isEnabled()) tab_developer->Refresh(); - - tab_plot->Refresh(); - - //stop the adc timer in gotthard - if(isDeveloper) - tab_developer->StopADCTimer(); - //set the plot type first(acccss shared memory) - tab_plot->SetScanArgument(); - //sets running to true - myPlot->StartStopDaqToggle(); - } - else{//to enable scan box - tab_plot->Refresh(); - //to start adc timer - if(tab_developer->isEnabled()) - tab_developer->Refresh(); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::SetZoomToolTip(bool disable){ - if(disable) - dockWidgetPlot->setToolTip("To Enable mouse-controlled zooming capabilities,\ndisable min and max for all axes. "); - else - dockWidgetPlot->setToolTip(zoomToolTip); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDetectorMain::StartStopAcquisitionFromClient(bool start){ -#ifdef VERBOSE - cout << "Start/Stop Acquisition From Client:" << start << endl; -#endif - - if (tab_measurement->GetStartStatus() != start){ - if(start){ - if(!myPlot->isRunning()){ - //refresh all the required tabs - all these are done in button click anyway - /* tab_actions->Refresh(); - //too slow to refresh - //tab_measurement->Refresh(); - tab_settings->Refresh(); - tab_dataoutput->Refresh(); - if(tab_advanced->isEnabled()) tab_advanced->Refresh(); - if(tab_debugging->isEnabled()) tab_debugging->Refresh(); - if(tab_developer->isEnabled()) tab_developer->Refresh(); - - tab_plot->Refresh();*/ - } - } - //click start/stop - tab_measurement->ClickStartStop(); - while(myPlot->GetClientInitiated()); - } - - return slsDetectorDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDetectorMain::UncheckServer(){ -#ifdef VERBOSE - cout << "Unchecking Mode : Listen to Gui Client" << endl; -#endif - disconnect(menuModes, SIGNAL(triggered(QAction*)), this,SLOT(EnableModes(QAction*))); - actionListenGuiClient->setChecked(false); - connect(menuModes, SIGNAL(triggered(QAction*)), this,SLOT(EnableModes(QAction*))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -bool qDetectorMain::isCurrentlyTabDeveloper(){ - return (tabs->currentIndex()==Developer); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorGui/src/qDrawPlot.cpp b/slsDetectorGui/src/qDrawPlot.cpp deleted file mode 100644 index 87492eeea..000000000 --- a/slsDetectorGui/src/qDrawPlot.cpp +++ /dev/null @@ -1,2275 +0,0 @@ -/* - * qDrawPlot.cpp - * - * Created on: May 7, 2012 - * Author: Dhanya Maliakal - */ -// Qt Project Class Headers -#include "qDrawPlot.h" -#include "qCloneWidget.h" -#include "slsDetector.h" -#include"fileIOStatic.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -#include "postProcessing.h" -// Qt Include Headers -#include -#include -#include -#include -//#include "qwt_double_interval.h" -#include "qwt_series_data.h" -// C++ Include Headers -#include -#include -#include -using namespace std; - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -const double qDrawPlot::PLOT_TIMER_MS = DEFAULT_STREAMING_TIMER_IN_MS; - -qDrawPlot::qDrawPlot(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent),myDet(detector),plot1D_hists(0){ - SetupWidgetWindow(); - Initialization(); - StartStopDaqToggle(); //as default -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qDrawPlot::~qDrawPlot(){ - // Clear plot - Clear1DPlot(); - for(QVector::iterator h = plot1D_hists.begin();h!=plot1D_hists.end();h++) delete *h; - plot1D_hists.clear(); - if(lastImageArray) delete[] lastImageArray; lastImageArray=0; - if(gainImageArray) delete[] gainImageArray; gainImageArray=0; - StartOrStopThread(0); - delete myDet; myDet = 0; - for(int i=0;igetDetectorsType(); - switch(detType){ - case slsDetectorDefs::MYTHEN: - case slsDetectorDefs::GOTTHARD: - originally2D = false; - break; - case slsDetectorDefs::EIGER: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - originally2D = true; - break; - default: - cout << "ERROR: Detector Type is Generic" << endl; - exit(-1); - } - - -//initialization - data_pause_over = true; - - currentMeasurement = 0; - currentFrame = 0; - numFactor = 0; - currentScanDivLevel = 0; - currentScanValue = 0; - number_of_exposures = 0; - number_of_frames = 0; - acquisitionPeriod = 0; - exposureTime = 0; - currentFileIndex = 0; - currentFrameIndex = 0; - - stop_signal = 0; - pthread_mutex_init(&last_image_complete_mutex,NULL); - - // Default titles- only for the initial picture - imageXAxisTitle="Pixel"; - imageYAxisTitle="Pixel"; - imageZAxisTitle="Intensity"; - histXAxisTitle="Channel Number"; - histYAxisTitle="Counts"; - for(int i=0;igetTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X); - nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y); - if (detType == slsDetectorDefs::JUNGFRAUCTB) { - npixelsy_jctb = (myDet->setTimer(slsDetectorDefs::SAMPLES_JCTB, -1) * 2)/25;// for moench 03 - nPixelsX = npixelsx_jctb; - nPixelsY = npixelsy_jctb; - } - - cout<<"nPixelsX:"<setStyle(QwtSymbol::Cross); - marker->setSize(5,5); - noMarker = new QwtSymbol(); - - //for save automatically, - saveAll = false; - saveError = false; - lastSavedFrame = -1; - lastSavedMeasurement = -1; - - // This is so that it initially stop and plots - running = 1; - - XYRangeChanged = false; - XYRangeValues[0] = 0; - XYRangeValues[1] = 0; - XYRangeValues[2] = 0; - XYRangeValues[3] = 0; - IsXYRange[0] = false; - IsXYRange[1] = false; - IsXYRange[2] = false; - IsXYRange[3] = false; - - timerValue = PLOT_TIMER_MS; - frameFactor=0; - isFrameEnabled = false; - isTriggerEnabled = false; - - scanArgument = qDefs::None; - histogramArgument = qDefs::Intensity; - anglePlot = false; - alreadyDisplayed = false; - - //filepath and file name - filePath = QString(myDet->getFilePath().c_str()); - fileName = QString(myDet->getFileName().c_str()); - - backwardScanPlot = false; - fileSaveEnable= myDet->enableWriteToFile(); - - //pedestal - pedestal = false; - pedestalVals = 0; - tempPedestalVals = 0; - pedestalCount = 0; - startPedestalCal = false; - - //accumulate - accumulate = false; - resetAccumulate = false; - - clientInitiated = false; - - //binary plot output - binary = false; - binaryFrom = 0; - binaryTo = 0; - - //histogram - histogram = false; - histFrom = 0; - histTo = 0; - histSize = 0; - /* - grid = new QwtPlotGrid; - grid->enableXMin(true); - grid->enableYMin(true); - grid->setMajPen(QPen(Qt::black, 0, Qt::DotLine)); - grid->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine)); - */ - plotHistogram = new QwtPlotHistogram(); - plotHistogram->setStyle(QwtPlotHistogram::Columns);//Options:Outline,Columns, Lines - - - plotRequired = false; - -//widget related initialization - - // clone - for(int i=0;isetLayout(layout); - - histFrameIndexTitle = new QLabel(""); - histFrameIndexTitle->setFixedHeight(10); - boxPlot = new QGroupBox(""); - layout->addWidget(boxPlot,1,0); - boxPlot->setAlignment(Qt::AlignHCenter); - boxPlot->setFont(QFont("Sans Serif",11,QFont::Normal)); - boxPlot->setTitle("Sample Plot"); - data_pause_timer = new QTimer(this); - connect(data_pause_timer, SIGNAL(timeout()), this, SLOT(UpdatePause())); - - - //display statistics - displayStatistics = false; - widgetStatistics = new QWidget(this); - widgetStatistics->setFixedHeight(15); - QHBoxLayout *hl1 = new QHBoxLayout; - hl1->setSpacing(0); - hl1->setContentsMargins(0, 0, 0, 0); - QLabel *lblMin = new QLabel("Min: "); - lblMin->setFixedWidth(40); - lblMin->setAlignment(Qt::AlignRight); - QLabel *lblMax = new QLabel("Max: "); - lblMax->setFixedWidth(40); - lblMax->setAlignment(Qt::AlignRight); - QLabel *lblSum = new QLabel("Sum: "); - lblSum->setFixedWidth(40); - lblSum->setAlignment(Qt::AlignRight); - lblMinDisp = new QLabel("-"); - lblMinDisp->setAlignment(Qt::AlignLeft); - lblMaxDisp = new QLabel("-"); - lblMaxDisp->setAlignment(Qt::AlignLeft); - lblSumDisp = new QLabel("-"); - lblSumDisp->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); - lblSumDisp->setAlignment(Qt::AlignLeft); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - hl1->addWidget(lblMin); - hl1->addWidget(lblMinDisp); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Expanding,QSizePolicy::Fixed)); - hl1->addWidget(lblMax); - hl1->addWidget(lblMaxDisp); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Expanding,QSizePolicy::Fixed)); - hl1->addWidget(lblSum); - hl1->addWidget(lblSumDisp); - hl1->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - widgetStatistics->setLayout(hl1); - layout->addWidget(widgetStatistics,2,0); - widgetStatistics->hide(); - - - // setting default plot titles and settings - plot1D = new SlsQt1DPlot(boxPlot); - - plot1D->setFont(QFont("Sans Serif",9,QFont::Normal)); - plot1D->SetXTitle(histXAxisTitle.toAscii().constData()); - plot1D->SetYTitle(histYAxisTitle.toAscii().constData()); - plot1D->hide(); - - SlsQtH1D* h; - histNBins = nPixelsX; - nHists = 1; - if(histXAxis) delete [] histXAxis; histXAxis = new double [nPixelsX]; - if(histYAxis[0]) delete [] histYAxis[0];histYAxis[0] = new double [nPixelsX]; - for(unsigned int px=0;pxSetXTitle("X Axis"); - plot1D->SetYTitle("Y Axis"); - plot1D_hists.append(h=new SlsQtH1D("",histNBins,histXAxis,histYAxis[0])); - h->SetLineColor(0); - SetStyle(h); - h->Attach(plot1D); - Clear1DPlot(); - - plot2D = new SlsQt2DPlotLayout(boxPlot); - //default plot - lastImageArray = new double[nPixelsY*nPixelsX]; - for(unsigned int px=0;pxsetFont(QFont("Sans Serif",9,QFont::Normal)); - plot2D->GetPlot()->SetData(nPixelsX,-0.5,nPixelsX-0.5,nPixelsY,startPixel,endPixel,lastImageArray); - plot2D->setTitle(GetImageTitle()); - plot2D->SetXTitle(imageXAxisTitle); - plot2D->SetYTitle(imageYAxisTitle); - plot2D->SetZTitle(imageZAxisTitle); - plot2D->setAlignment(Qt::AlignLeft); - boxPlot->setFlat(true); - boxPlot->setContentsMargins(0,15,0,0); - - plotLayout = new QGridLayout(boxPlot); - plotLayout->setContentsMargins(0,0,0,0); - plotLayout->addWidget(plot1D,0,0,4,4); - plotLayout->addWidget(plot2D,0,0,4,4); - - - //gainplot - gainplot2D = new SlsQt2DPlotLayout(boxPlot); - gainImageArray = new double[nPixelsY*nPixelsX]; - for(unsigned int px=0;pxsetFont(QFont("Sans Serif",9,QFont::Normal)); - gainplot2D->GetPlot()->SetData(nPixelsX,-0.5,nPixelsX-0.5,nPixelsY,startPixel,endPixel,gainImageArray); - gainplot2D->setTitle(GetImageTitle()); - gainplot2D->setAlignment(Qt::AlignLeft); - gainplot2D->GetPlot()->enableAxis(0,false); - gainplot2D->GetPlot()->enableAxis(1,false); - gainplot2D->GetPlot()->enableAxis(2,false); - plotLayout->addWidget(gainplot2D,0,4,1,1); - gainplot2D->hide(); - gainPlotEnable = false; - gainDataEnable = false; - - - - // callbacks - // Setting the callback function to get data from detector class - myDet->registerDataCallback(&(GetDataCallBack),this); // also enables data streaming in client and receiver (if receiver exists) - //Setting the callback function to alert when acquisition finished from detector class - myDet->registerAcquisitionFinishedCallback(&(GetAcquisitionFinishedCallBack),this); - //Setting the callback function to alert when each measurement finished from detector class - myDet->registerMeasurementFinishedCallback(&(GetMeasurementFinishedCallBack),this); - //Setting the callback function to get progress from detector class(using receivers) - myDet->registerProgressCallback(&(GetProgressCallBack),this); - - qDefs::checkErrorMessage(myDet,"qDrawPlot::SetupWidgetWindow"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::Initialization(){ - connect(this, SIGNAL(UpdatePlotSignal()), this, SLOT(UpdatePlot())); - connect(this, SIGNAL(InterpolateSignal(bool)),plot2D, SIGNAL(InterpolateSignal(bool))); - connect(this, SIGNAL(ContourSignal(bool)), plot2D, SIGNAL(ContourSignal(bool))); - connect(this, SIGNAL(LogzSignal(bool)), plot2D, SLOT(SetZScaleToLog(bool))); - connect(this, SIGNAL(LogySignal(bool)), plot1D, SLOT(SetLogY(bool))); - connect(this, SIGNAL(ResetZMinZMaxSignal(bool,bool,double,double)),plot2D, SLOT(ResetZMinZMax(bool,bool,double,double))); - - connect(this, SIGNAL(AcquisitionErrorSignal(QString)), this, SLOT(ShowAcquisitionErrorMessage(QString))); - - - connect(this, SIGNAL(GainPlotSignal(bool)), this, SLOT(EnableGainPlot(bool))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::StartStopDaqToggle(bool stop_if_running){ -#ifdef VERYVERBOSE - cout << "Entering StartStopDaqToggle(" << stop_if_running << ")" <setTimer(slsDetectorDefs::FRAME_NUMBER,-1)); - int numTriggers = (isTriggerEnabled)*((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,-1)); - numFrames = ((numFrames==0)?1:numFrames); - numTriggers = ((numTriggers==0)?1:numTriggers); - number_of_frames = numFrames * numTriggers; - cout << "\tNumber of Frames per Scan/Measurement:" << number_of_frames << endl; - //get #scansets for level 0 and level 1 - int numScan0 = myDet->getScanSteps(0); numScan0 = ((numScan0==0)?1:numScan0); - int numScan1 = myDet->getScanSteps(1); numScan1 = ((numScan1==0)?1:numScan1); - int numPos=myDet->getPositions(); - - number_of_exposures = number_of_frames * numScan0 * numScan1; - if(anglePlot) number_of_exposures = numScan0 * numScan1;// * numPos; - cout << "\tNumber of Exposures Per Measurement:" << number_of_exposures << endl; - */ - - // ExposureTime - exposureTime= ((double)(myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,-1))*1E-9); - cout << "\tExposure Time:" << setprecision (10) << exposureTime << endl; - // Acquisition Period - acquisitionPeriod= ((double)(myDet->setTimer(slsDetectorDefs::FRAME_PERIOD,-1))*1E-9); - cout << "\tAcquisition Period:" << setprecision (10) << acquisitionPeriod << endl; - cout << "\tFile Index:" << myDet->getFileIndex() << endl; - //to take the first data if frameFactor - numFactor = 0; - - //for save automatically, - saveError = false; - lastSavedFrame = -1; - lastSavedMeasurement = -1; - - //update file path and file name - filePath = QString(myDet->getFilePath().c_str()); - fileName = QString(myDet->getFileName().c_str()); - //update index - currentFileIndex = myDet->getFileIndex(); - currentFrameIndex = 0; - - StartDaq(true); - running=!running; - - qDefs::checkErrorMessage(myDet,"qDrawPlot::StartStopDaqToggle"); - } - - /** if this is set during client initation */ - clientInitiated = false; - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::StartDaq(bool start){ - if(start){ -#ifdef VERBOSE - cout << "Start Daq(true) function" << endl; -#endif - ResetDaqForGui(); - StartDaqForGui(); - }else{ -#ifdef VERBOSE - cout << "Start Daq(false) function" << endl; -#endif - StopDaqForGui(); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::ResetDaqForGui(){ - if(!StopDaqForGui()) return 0; - cout << "Resetting image number" << endl; - lastImageNumber = 0; - return 1; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -bool qDrawPlot::StartOrStopThread(bool start){ -#ifdef VERYVERBOSE - cout << "StartOrStopThread:" << start << endl; -#endif - static bool firstTime = true; - static bool gui_acquisition_thread_running = 0; - static pthread_t gui_acquisition_thread; - static pthread_mutex_t gui_acquisition_start_stop_mutex = PTHREAD_MUTEX_INITIALIZER; - - pthread_mutex_lock(&gui_acquisition_start_stop_mutex); - //stop part, before start or restart - if(gui_acquisition_thread_running){ - cout << "Stopping current acquisition thread ...." << endl; - stop_signal = 1;//sorta useless right now - gui_acquisition_thread_running = 0; - } - - //start part - if(start){ - progress = 0; - //sets up the measurement parameters - SetupMeasurement(); - - //refixing all the zooming - plot2D->GetPlot()->SetXMinMax(-0.5,nPixelsX+0.5); - plot2D->GetPlot()->SetYMinMax(startPixel,endPixel); - plot2D->GetPlot()->SetZoom(-0.5,startPixel,nPixelsX,endPixel-startPixel); - if (boxPlot->title() == "Sample Plot") - plot2D->GetPlot()->UnZoom(); - else - plot2D->GetPlot()->UnZoom(false); - /*XYRangeChanged = true;*/ - boxPlot->setTitle("Old_Plot.raw"); - - cprintf(BLUE, "Starting new acquisition thread ....\n"); - // Start acquiring data from server - if(!firstTime) pthread_join(gui_acquisition_thread,NULL);//wait until he's finished, ie. exits - pthread_create(&gui_acquisition_thread, NULL,DataStartAcquireThread, (void*) this); - // This is set here and later reset to zero when all the plotting is done - // This is manually done instead of keeping track of thread because - // this thread returns immediately after executing the acquire command - gui_acquisition_thread_running=1; -#ifdef VERYVERBOSE - cout << "Started acquiring thread" << endl; -#endif - } - pthread_mutex_unlock(&gui_acquisition_start_stop_mutex); - return gui_acquisition_thread_running; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetScanArgument(int scanArg){ -#ifdef VERYVERBOSE - cout << "SetScanArgument function:" << scanArg << " running:" << running << endl; -#endif - scanArgument = scanArg; - - LockLastImageArray(); - - if(plot_in_scope==1) Clear1DPlot(); - - - // Number of Exposures - must be calculated here to get npixelsy for allframes/frameindex scans - int numFrames = (isFrameEnabled)*((int)myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,-1)); - int numTriggers = (isTriggerEnabled)*((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,-1)); - int numStoragecells = 0; - if (detType == slsDetectorDefs::JUNGFRAU) - numStoragecells = (int)myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER, -1); - numFrames = ((numFrames==0)?1:numFrames); - numTriggers = ((numTriggers==0)?1:numTriggers); - numStoragecells = ((numStoragecells<=0)?1:numStoragecells+1); - number_of_frames = numFrames * numTriggers * numStoragecells; - cout << "\tNumber of Frames per Scan/Measurement:" << number_of_frames << endl; - //get #scansets for level 0 and level 1 - int numScan0 = myDet->getScanSteps(0); numScan0 = ((numScan0==0)?1:numScan0); - int numScan1 = myDet->getScanSteps(1); numScan1 = ((numScan1==0)?1:numScan1); - //int numPos=myDet->getPositions(); - - number_of_exposures = number_of_frames * numScan0 * numScan1; - if(anglePlot) number_of_exposures = numScan0 * numScan1;// * numPos; - cout << "\tNumber of Exposures Per Measurement:" << number_of_exposures << endl; - - - maxPixelsY = 0; - minPixelsY = 0; - nPixelsX = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::X); - nPixelsY = myDet->getTotalNumberOfChannelsInclGapPixels(slsDetectorDefs::Y); - if (detType == slsDetectorDefs::JUNGFRAUCTB) { - npixelsy_jctb = (myDet->setTimer(slsDetectorDefs::SAMPLES_JCTB, -1) * 2)/25; // for moench 03 - nPixelsX = npixelsx_jctb; - nPixelsY = npixelsy_jctb; - } - - //cannot do this in between measurements , so update instantly - if(scanArgument==qDefs::Level0){ - //no need to check if numsteps=0,cuz otherwise this mode wont be set in plot tab - int numSteps = myDet->getScanSteps(0); - double *values = new double[numSteps]; - myDet->getScanSteps(0,values); - - maxPixelsY = values[numSteps-1]; - minPixelsY = values[0]; - nPixelsY = numSteps; - }else if(scanArgument==qDefs::Level1) { - //no need to check if numsteps=0,cuz otherwise this mode wont be set in plot tab - int numSteps = myDet->getScanSteps(1); - double *values = new double[numSteps]; - myDet->getScanSteps(1,values); - - maxPixelsY = values[numSteps-1]; - minPixelsY = values[0]; - nPixelsY = numSteps; - }else if(scanArgument==qDefs::AllFrames) - nPixelsY = number_of_exposures; - else if(scanArgument==qDefs::FileIndex) - nPixelsY = number_of_frames; - - - if(minPixelsY>maxPixelsY){ - double temp = minPixelsY; - minPixelsY = maxPixelsY; - maxPixelsY = temp; - backwardScanPlot = true; - }else backwardScanPlot = false; - - - //1d - if(histXAxis) delete [] histXAxis; histXAxis = new double [nPixelsX]; - - if(histYAxis[0]) delete [] histYAxis[0]; histYAxis[0] = new double [nPixelsX]; - - //2d - if(lastImageArray) delete [] lastImageArray; lastImageArray = new double[nPixelsY*nPixelsX]; - if(gainImageArray) delete [] gainImageArray; gainImageArray = new double[nPixelsY*nPixelsX]; - - //initializing 1d x axis - for(unsigned int px=0;pxmyDet->setReceiverOnline() == slsDetectorDefs::ONLINE_FLAG) { - - // if receiver data up streaming not on, switch it on - if (((qDrawPlot*)this_pointer)->myDet->enableDataStreamingFromReceiver() != 1) { - // switch on receiver - if (((qDrawPlot*)this_pointer)->myDet->enableDataStreamingFromReceiver(1) != 1) { - qDefs::checkErrorMessage(((qDrawPlot*)this_pointer)->myDet,"qDrawPlot::DataStartAcquireThread"); - return this_pointer; - } - } - } - - if (((qDrawPlot*)this_pointer)->myDet->getAcquiringFlag() == true) { - ((qDrawPlot*)this_pointer)->myDet->setAcquiringFlag(false); - } - ((qDrawPlot*)this_pointer)->myDet->acquire(1); - - return this_pointer; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::GetDataCallBack(detectorData *data, int fIndex, int subIndex, void *this_pointer){ - ((qDrawPlot*)this_pointer)->GetData(data,fIndex, subIndex); - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::GetData(detectorData *data,int fIndex, int subIndex){ -#ifdef VERYVERBOSE - cout << "******Entering GetDatafunction********" << endl; - cout << "fIndex " << fIndex << endl; - cout << "subIndex " << subIndex << endl; - cout << "fname " << data->fileName << endl; - cout << "npoints " << data->npoints << endl; - cout << "npy " << data->npy << endl; - cout << "progress " << data->progressIndex << endl; - if (data->values != NULL) cout << "values " << data->values << endl; - cout << "errors " << data->errors << endl; - cout << "angle " << data->angles << endl; - cout << "databytes " << data->databytes << endl; - cout << "dynamicRange " << data->dynamicRange << endl; - cout << "fileIndex " << data->fileIndex << endl; -#endif - if(!stop_signal){ - - //set progress - progress=(int)data->progressIndex; - currentFrameIndex = fileIOStatic::getIndicesFromFileName(string(data->fileName),currentFileIndex); - currentFileIndex = data->fileIndex; - //happens if receiver sends a null and empty file name - /*if(string(data->fileName).empty()){ - cout << "Received empty file name. Exiting function without updating data for plot." << endl; - return -1; - }*/ -#ifdef VERYVERBOSE - cout << "progress:" << progress << endl; -#endif - // secondary title necessary to differentiate between frames when not saving data - char temp_title[2000]; - //findex is the frame index given by receiver, cannot be derived from file name - if(fIndex!=-1){ - currentFrameIndex=fIndex; - sprintf(temp_title,"#%d",fIndex); - if((detType==slsDetectorDefs::EIGER) && (subIndex != -1)) - sprintf(temp_title,"#%d %d",fIndex,subIndex); - }else{ - if(fileSaveEnable) strcpy(temp_title,"#%d"); - else sprintf(temp_title,"#%d",currentFrame); - } - if(subIndex != -1) - sprintf(temp_title,"#%d %d",fIndex,subIndex); - - //Plot Disabled - if(!plotEnable) - return 0; - - - - //angle plotting - if(anglePlot){ - - // convert char* to double - if(data->values==NULL) { - data->values = new double[nPixelsX*nPixelsY]; - toDoublePixelData(data->values, data->cvalues, nPixelsX*nPixelsY, data->databytes, data->dynamicRange); - } - - LockLastImageArray(); - //set title - plotTitle=QString(plotTitle_prefix)+QString(data->fileName).section('/',-1); - // Title - histTitle[0] = temp_title; - - if(data->angles==NULL){ - cout<<"\n\nWARNING:RETURNED NULL instead of angles."<values,nAnglePixelsX*sizeof(double)); - SetHistXAxisTitle("Channel Number"); - - } - else{ - lastImageNumber= currentFrame+1; - nAnglePixelsX = data->npoints; - histNBins = nAnglePixelsX; - nHists=1; - if(histXAngleAxis) delete [] histXAngleAxis; histXAngleAxis = new double[nAnglePixelsX]; - if(histYAngleAxis) delete [] histYAngleAxis; histYAngleAxis = new double[nAnglePixelsX]; -#ifdef CHECKINFERROR - int k = 0; - for(int i = 0; i < data->npoints; i++){ - if(isinf(data->values[i])){ - //cout << "*** ERROR: value at " << i << " infinity" << endl; - k++; - data->values[i] = -1; - } - } - if (k>0) { - cout << "*** ERROR: value at " << k << " places have infinity values!" << endl; - double m1,m2,s1; - GetStatistics(m1,m2,s1,data->angles,nAnglePixelsX); - cout << "angle min:" << m1 << endl; - cout << "angle max:" << m2 << endl; - cout << "angle sum:" << s1 << endl; - GetStatistics(m1,m2,s1,data->values,nAnglePixelsX); - cout << "value min:" << m1 << endl; - cout << "value max:" << m2 << endl; - cout << "value sum:" << s1 << endl; - } -#endif - memcpy(histXAngleAxis,data->angles,nAnglePixelsX*sizeof(double)); - memcpy(histYAngleAxis,data->values,nAnglePixelsX*sizeof(double)); - SetHistXAxisTitle("Angles"); - } - plotRequired = true; - UnlockLastImageArray(); - currentFrame++; -#ifdef VERYVERBOSE - cout << "Exiting GetData Function " << endl; -#endif - emit UpdatePlotSignal(); - return 0; - } - - - //nth frame or delay decision (data copied later on) - if (detType == slsDetectorDefs::MYTHEN){ - //Nth Frame - if(frameFactor){ - //plots if numfactor becomes 0 - if(!numFactor) numFactor=frameFactor-1; - //return if not - else{ - numFactor--; - return 0; - } - } - - //Not Nth Frame, to check time out(NOT for Scans and angle plots) - else{ - if (scanArgument == qDefs::None) { - //if the time is not over, RETURN - if(!data_pause_over){ - return 0; - } - data_pause_over=false; - data_pause_timer->start((int)(timerValue)); - } - } - } - - // convert char* to double - if(data->values == NULL) { - data->values = new double[nPixelsX*nPixelsY]; - if (gainDataEnable) { - data->dgainvalues = new double[nPixelsX*nPixelsY]; - toDoublePixelData(data->values, data->cvalues, nPixelsX*nPixelsY, data->databytes, data->dynamicRange, data->dgainvalues); - } - else - toDoublePixelData(data->values, data->cvalues, nPixelsX*nPixelsY, data->databytes, data->dynamicRange); - } - - //if scan - //alframes - if(scanArgument==qDefs::AllFrames){ - LockLastImageArray(); - //set title - plotTitle=QString(plotTitle_prefix)+QString(data->fileName).section('/',-1); - //variables - lastImageNumber= currentFrame+1; - //title - imageTitle = temp_title; - //copy data - memcpy(lastImageArray+(currentScanDivLevel*nPixelsX),data->values,nPixelsX*sizeof(double)); - plotRequired = true; - UnlockLastImageArray(); - currentFrame++; - currentScanDivLevel++; - emit UpdatePlotSignal(); - return 0; - } - //file index - if(scanArgument==qDefs::FileIndex){ - LockLastImageArray(); - //set title - plotTitle=QString(plotTitle_prefix)+QString(data->fileName).section('/',-1); - //variables - if(currentFrameIndex == 0) currentScanDivLevel = 0; - lastImageNumber= currentFrame+1; - //title - imageTitle = temp_title; - //copy data - for(unsigned int px=0;pxvalues[px]; - plotRequired = true; - UnlockLastImageArray(); - currentFrame++; - currentScanDivLevel++; - emit UpdatePlotSignal(); - return 0; - } - //level0 - if(scanArgument==qDefs::Level0){ - LockLastImageArray(); - //set title - plotTitle=QString(plotTitle_prefix)+QString(data->fileName).section('/',-1); - //get scanvariable0 - int ci = 0, fi = 0, p = 0, di = 0; double cs0 = 0 , cs1 = 0; - fileIOStatic::getVariablesFromFileName(string(data->fileName), ci, fi, p, cs0, cs1, di); - //variables - if(cs0!=currentScanValue) { - if(backwardScanPlot) currentScanDivLevel--; - else currentScanDivLevel++; - } - currentScanValue = cs0; - lastImageNumber= currentFrame+1; - //title - imageTitle = temp_title; - //copy data - for(unsigned int px=0;pxvalues[px]; - plotRequired = true; - UnlockLastImageArray(); - currentFrame++; - emit UpdatePlotSignal(); - return 0; - } - //level1 - if(scanArgument==qDefs::Level1){ - LockLastImageArray(); - //set title - plotTitle=QString(plotTitle_prefix)+QString(data->fileName).section('/',-1); - //get scanvariable1 - int ci = 0, fi = 0, p = 0, di = 0; double cs0 = 0 , cs1 = 0; - fileIOStatic::getVariablesFromFileName(string(data->fileName), ci, fi, p, cs0, cs1, di); - //variables - if(cs1!=currentScanValue){ - if(backwardScanPlot) currentScanDivLevel--; - else currentScanDivLevel++; - } - currentScanValue = cs1; - lastImageNumber= currentFrame+1; - //title - imageTitle = temp_title; - //copy data - for(unsigned int px=0;pxvalues[px]; - plotRequired = true; - UnlockLastImageArray(); - currentFrame++; - emit UpdatePlotSignal(); - return 0; - } - - - - //normal measurement or 1d scans - LockLastImageArray(); - /*if(!pthread_mutex_trylock(&(last_image_complete_mutex))){*/ - //set title - plotTitle=QString(plotTitle_prefix)+QString(data->fileName).section('/',-1); - // only if you got the lock, do u need to remember lastimagenumber to plot - lastImageNumber= currentFrame+1; - //cout<<"got last imagenumber:"<values[i] < histFrom) || (data->values[i] > histTo)) - continue; - //check for intervals, increment if validates - for(int j=0;jvalues[i])) - histogramSamples[j].value += 1; - - } - } - //get sum of data pixels - else - val += data->values[i]; - - } - - - if(histogramArgument != qDefs::Intensity){ - val /= numValues; - - //find scan value - int ci = 0, fi = 0; double cs0 = 0 , cs1 = 0; - fileIOStatic::getVariablesFromFileName(string(data->fileName), ci, fi, cs0, cs1); - - int scanval=-1; - if(cs0 != -1) - scanval = cs0; - else scanval = cs1; - - //ignore outside limits - if ((scanval < histFrom) || (scanval > histTo) || (scanval == -1)) - scanval = -1; - //check for intervals, increment if validates - for(int j=0;j0;i--) - memcpy(histYAxis[i],histYAxis[i-1],nPixelsX*sizeof(double)); - - //recalculating pedestal - if(startPedestalCal){ - //start adding frames to get to the pedestal value - if(pedestalCountvalues[px]; - memcpy(histYAxis[0],data->values,nPixelsX*sizeof(double)); - pedestalCount++; - } - //calculate the pedestal value - if(pedestalCount==NUM_PEDESTAL_FRAMES){ - cout << "Pedestal Calculated" << endl; - for(unsigned int px=0;pxvalues,nPixelsX*sizeof(double)); - resetAccumulate = false; - } - //pedestal or accumulate - else{ - double temp;//cannot overwrite cuz of accumulate - for(unsigned int px=0;px<(nPixelsX*nPixelsY);px++){ - temp = data->values[px]; - if(pedestal) - temp = data->values[px] - (pedestalVals[px]); - if(binary) { - if ((temp >= binaryFrom) && (temp <= binaryTo)) - temp = 1; - else - temp = 0; - } - if(accumulate) - temp += histYAxis[0][px]; - //after all processing - histYAxis[0][px] = temp; - } - } - } - } - //2d - else{ - // Titles - imageTitle = temp_title; - - //jungfrau mask gain - if(data->dgainvalues != NULL) { - memcpy(gainImageArray, data->dgainvalues, nPixelsX*nPixelsY*sizeof(double)); - gainPlotEnable = true; - }else - gainPlotEnable = false; - - - //recalculating pedestal - if(startPedestalCal){ - //start adding frames to get to the pedestal value - if(pedestalCountvalues[px]; - memcpy(lastImageArray,data->values,nPixelsX*nPixelsY*sizeof(double)); - pedestalCount++; - } - //calculate the pedestal value - if(pedestalCount==NUM_PEDESTAL_FRAMES){ - cout << "Pedestal Calculated" << endl; - for(unsigned int px=0;px<(nPixelsX*nPixelsY);px++) - tempPedestalVals[px] = tempPedestalVals[px]/(double)NUM_PEDESTAL_FRAMES; - memcpy(pedestalVals,tempPedestalVals,nPixelsX*nPixelsY*sizeof(double)); - startPedestalCal = 0; - } - } - - //normal data - if(((!pedestal)&(!accumulate)&(!binary)) || (resetAccumulate)){ - memcpy(lastImageArray,data->values,nPixelsX*nPixelsY*sizeof(double)); - resetAccumulate = false; - } - //pedestal or accumulate or binary - else{ - double temp; - for(unsigned int px=0;px<(nPixelsX*nPixelsY);px++){ - temp = data->values[px]; - if(pedestal) - temp = data->values[px] - (pedestalVals[px]); - if(binary) { - if ((temp >= binaryFrom) && (temp <= binaryTo)) - temp = 1; - else - temp = 0; - } - if(accumulate) - temp += lastImageArray[px]; - //after all processing - lastImageArray[px] = temp; - } - } - - } - /* pthread_mutex_unlock(&(last_image_complete_mutex)); - }*/ - plotRequired = true; - UnlockLastImageArray(); - -#ifdef VERYVERBOSE - cprintf(BLUE,"currentframe:%d \tcurrentframeindex:%d\n",currentFrame,currentFrameIndex); -#endif - currentFrame++; - emit UpdatePlotSignal(); - } - - -#ifdef VERYVERBOSE - cout << "Exiting GetData function" << endl; -#endif - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::GetAcquisitionFinishedCallBack(double currentProgress,int detectorStatus, void *this_pointer){ - ((qDrawPlot*)this_pointer)->AcquisitionFinished(currentProgress,detectorStatus); -#ifdef VERYVERBOSE - cout << "acquisition finished callback worked ok" << endl; -#endif - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::AcquisitionFinished(double currentProgress, int detectorStatus){ -#ifdef VERBOSE - cout << "\nEntering Acquisition Finished with status " ; -#endif - QString status = QString(slsDetectorBase::runStatusType(slsDetectorDefs::runStatus(detectorStatus)).c_str()); -#ifdef VERBOSE - cout << status.toAscii().constData() << " and progress " << currentProgress << endl; -#endif - //error or stopped - if((stop_signal)||(detectorStatus==slsDetectorDefs::ERROR)){ -#ifdef VERBOSE - cout << "Error in Acquisition" << endl << endl; -#endif - //stop_signal = 1;//just to be sure - emit AcquisitionErrorSignal(status); - } -#ifdef VERBOSE - //all measurements are over - else if(currentProgress==100){ - cout << "Acquisition Finished" << endl << endl; - } -#endif - StartStopDaqToggle(true); - //this lets the measurement tab know its over, and to enable tabs - emit UpdatingPlotFinished(); - - //calculate s curve inflection point - int l1=0,l2=0,j; - if((histogram)&&(histogramArgument != qDefs::Intensity)){ - for(j=0;j l2){ - cout << "***** s curve inflectionfound at " << histogramSamples[j].interval.maxValue() << "" - "or j at " << j << " with l1 " << l1 << " and l2 " << l2 << endl; - } - } - } - - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::GetProgressCallBack(double currentProgress, void *this_pointer){ - ((qDrawPlot*)this_pointer)->progress= currentProgress; - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::ShowAcquisitionErrorMessage(QString status){ - if(!alreadyDisplayed){ - alreadyDisplayed = true; - qDefs::Message(qDefs::WARNING,string("The acquisiton has ended abruptly. " - "Current Detector Status: ")+status.toAscii().constData()+ - string("."),"qDrawPlot::ShowAcquisitionErrorMessage"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::GetMeasurementFinishedCallBack(int currentMeasurementIndex, int fileIndex, void *this_pointer){ - ((qDrawPlot*)this_pointer)->MeasurementFinished(currentMeasurementIndex, fileIndex); - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::MeasurementFinished(int currentMeasurementIndex, int fileIndex){ -#ifdef VERBOSE - cout << "Entering Measurement Finished with currentMeasurement " << currentMeasurementIndex << " and fileIndex " << fileIndex << endl; -#endif - - //to make sure it plots the last frame - while(plotRequired){ - usleep(2000); - } - - currentMeasurement = currentMeasurementIndex+1; - currentFileIndex = fileIndex; -#ifdef VERBOSE - cout << "currentMeasurement:" << currentMeasurement << endl; -#endif - emit SetCurrentMeasurementSignal(currentMeasurement); - SetupMeasurement(); - /*if((myDet->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG) && (myDet->getFramesCaughtByReceiver() == 0)) - boxPlot->setTitle("OLD_plot.raw");*/ - return 0; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SelectPlot(int i){ //1 for 1D otherwise 2D - if(i==1){ - //Clear1DPlot(); it clears the last measurement - plot1D->SetXTitle(histXAxisTitle.toAscii().constData()); - plot1D->SetYTitle(histYAxisTitle.toAscii().constData()); - plot1D->show(); - plot2D->hide(); - boxPlot->setFlat(false); - plot_in_scope=1; - layout->addWidget(histFrameIndexTitle,0,0); - plotLayout->setContentsMargins(10,10,10,10); - }else{ - plot2D->SetXTitle(imageXAxisTitle); - plot2D->SetYTitle(imageYAxisTitle); - plot2D->SetZTitle(imageZAxisTitle); - plot1D->hide(); - plot2D->show(); - boxPlot->setFlat(true); - plot_in_scope=2; - histFrameIndexTitle->setText(""); - layout->removeWidget(histFrameIndexTitle); - plotLayout->setContentsMargins(0,0,0,0); - - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::Clear1DPlot(){ - for(QVector::iterator h = plot1D_hists.begin(); h!=plot1D_hists.end();h++){ - (*h)->Detach(plot1D); - //do not delete *h or h. - } - - plotHistogram->detach(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::UpdatePlot(){ -#ifdef VERYVERBOSE - cout << "Entering UpdatePlot function" << endl; -#endif - // only if no plot isnt enabled - if(plotEnable && plotRequired){ - LockLastImageArray(); - //so that it doesnt plot every single thing -#ifdef VERYVERBOSE - cprintf(GREEN,"Updating Plot\n"); -#endif - //so as to not plot it again and to let measurment finished know its done plotting it - //1-d plot stuff - if(plot_in_scope==1){ -#ifdef VERYVERBOSE - cout << "Last Image Number:" << lastImageNumber << endl; -#endif - if(histNBins){ - Clear1DPlot(); - plot1D->SetXTitle(histXAxisTitle.toAscii().constData()); - plot1D->SetYTitle(histYAxisTitle.toAscii().constData()); - - //histogram - if(histogram){ - plotHistogram->setData(new QwtIntervalSeriesData(histogramSamples)); - plotHistogram->setPen(QPen(Qt::red)); - plotHistogram->setBrush(QBrush(Qt::red,Qt::Dense4Pattern));//Qt::SolidPattern - histFrameIndexTitle->setText(GetHistTitle(0)); - plotHistogram->attach(plot1D); - //refixing all the zooming - - plot1D->SetXMinMax(startPixel,endPixel); - plot1D->SetYMinMax(0,plotHistogram->boundingRect().height()); - plot1D->SetZoomBase(startPixel,0,endPixel-startPixel,plotHistogram->boundingRect().height()); - - } - //not histogram - else{ - for(int hist_num=0;hist_num<(int)nHists;hist_num++){ - SlsQtH1D* h; - if(hist_num+1>plot1D_hists.size()){ - if(anglePlot) - plot1D_hists.append(h=new SlsQtH1D("",histNBins,histXAngleAxis,histYAngleAxis)); - else - plot1D_hists.append(h=new SlsQtH1D("",histNBins,histXAxis,GetHistYAxis(hist_num))); - h->SetLineColor(hist_num); - }else{ - h=plot1D_hists.at(hist_num); - if(anglePlot) - h->SetData(histNBins,histXAngleAxis,histYAngleAxis); - else - h->SetData(histNBins,histXAxis,GetHistYAxis(hist_num)); - } - SetStyle(h); - histFrameIndexTitle->setText(GetHistTitle(0)); - //h->setTitle(GetHistTitle(hist_num)); - h->Attach(plot1D); - //refixing all the zooming - //if((firstPlot) || (anglePlot)){ - /*plot1D->SetXMinMax(h->minXValue(),h->maxXValue()); - plot1D->SetYMinMax(h->minYValue(),h->maxYValue()); - plot1D->SetZoomBase(h->minXValue(),h->minYValue(), - h->maxXValue()-h->minXValue(),h->maxYValue()-h->minYValue());*/ - // firstPlot = false; - //} - } - - /**moved from below (had applied to histograms as well) to here, */ - // update range if required - if(XYRangeChanged){ - if(!IsXYRange[qDefs::XMINIMUM]) XYRangeValues[qDefs::XMINIMUM]= plot1D->GetXMinimum(); - if(!IsXYRange[qDefs::XMAXIMUM]) XYRangeValues[qDefs::XMAXIMUM]= plot1D->GetXMaximum(); - if(!IsXYRange[qDefs::YMINIMUM]) XYRangeValues[qDefs::YMINIMUM]= plot1D->GetYMinimum(); - if(!IsXYRange[qDefs::YMAXIMUM]) XYRangeValues[qDefs::YMAXIMUM]= plot1D->GetYMaximum(); - plot1D->SetXMinMax(XYRangeValues[qDefs::XMINIMUM],XYRangeValues[qDefs::XMAXIMUM]); - plot1D->SetYMinMax(XYRangeValues[qDefs::YMINIMUM],XYRangeValues[qDefs::YMAXIMUM]); - //Should not be reset for histogram, - //that is the only way to zoom in (new plots are zoomed out as its different each time) - if(!histogram) - XYRangeChanged = false; - } - /**moved from below (had applied to histograms as well) to here, */ - //Display Statistics - if(displayStatistics){ - double min=0,max=0,sum=0; - if(anglePlot) - GetStatistics(min,max,sum,histYAngleAxis,histNBins); - else - GetStatistics(min,max,sum,histYAxis[0],histNBins); - lblMinDisp->setText(QString("%1").arg(min)); - lblMaxDisp->setText(QString("%1").arg(max)); - lblSumDisp->setText(QString("%1").arg(sum)); - } - } - - if(saveAll) SavePlotAutomatic(); - - } - }//2-d plot stuff - else{ - if(lastImageArray){ - if(nPixelsX>0&&nPixelsY>0){ - plot2D->GetPlot()->SetData(nPixelsX,-0.5,nPixelsX-0.5,nPixelsY,startPixel,endPixel,lastImageArray); - plot2D->setTitle(GetImageTitle()); - plot2D->SetXTitle(imageXAxisTitle); - plot2D->SetYTitle(imageYAxisTitle); - plot2D->SetZTitle(imageZAxisTitle); - plot2D->UpdateNKeepSetRangeIfSet(); //keep a "set" z range, and call Update(); - if (gainPlotEnable) { - gainplot2D->GetPlot()->SetData(nPixelsX,-0.5,nPixelsX-0.5,nPixelsY,startPixel,endPixel,gainImageArray); - gainplot2D->setTitle(GetImageTitle()); - gainplot2D->show(); - }else { - gainplot2D->hide(); - } - } - // update range if required - if(XYRangeChanged){ - if(!IsXYRange[qDefs::XMINIMUM]) XYRangeValues[qDefs::XMINIMUM]= plot2D->GetPlot()->GetXMinimum(); - if(!IsXYRange[qDefs::XMAXIMUM]) XYRangeValues[qDefs::XMAXIMUM]= plot2D->GetPlot()->GetXMaximum(); - if(!IsXYRange[qDefs::YMINIMUM]) XYRangeValues[qDefs::YMINIMUM]= plot2D->GetPlot()->GetYMinimum(); - if(!IsXYRange[qDefs::YMAXIMUM]) XYRangeValues[qDefs::YMAXIMUM]= plot2D->GetPlot()->GetYMaximum(); - plot2D->GetPlot()->SetXMinMax(XYRangeValues[qDefs::XMINIMUM],XYRangeValues[qDefs::XMAXIMUM]); - plot2D->GetPlot()->SetYMinMax(XYRangeValues[qDefs::YMINIMUM],XYRangeValues[qDefs::YMAXIMUM]); - gainplot2D->GetPlot()->SetXMinMax(XYRangeValues[qDefs::XMINIMUM],XYRangeValues[qDefs::XMAXIMUM]); - gainplot2D->GetPlot()->SetYMinMax(XYRangeValues[qDefs::YMINIMUM],XYRangeValues[qDefs::YMAXIMUM]); - XYRangeChanged = false; - } - plot2D->GetPlot()->Update(); - if (gainPlotEnable) { - gainplot2D->GetPlot()->Update(); - gainplot2D->setFixedWidth(plot2D->width()/4); - gainplot2D->setFixedHeight(plot2D->height()/4); - gainplot2D->show(); - }else - gainplot2D->hide(); - //Display Statistics - if(displayStatistics){ - double min=0,max=0,sum=0; - GetStatistics(min,max,sum,lastImageArray,nPixelsX*nPixelsY); - lblMinDisp->setText(QString("%1").arg(min)); - lblMaxDisp->setText(QString("%1").arg(max)); - lblSumDisp->setText(QString("%1").arg(sum)); - } - if(saveAll) SavePlotAutomatic(); - } - } - //set plot title - boxPlot->setTitle(plotTitle); - //to notify the measurement finished when its done - plotRequired = false; - UnlockLastImageArray(); - } - -#ifdef VERYVERBOSE - cout << "Exiting UpdatePlot function" << endl; -#endif -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::ClonePlot(){ - int i; - - //check for space for more clone widget references - bool found = false; - for(i=0;igetFilePath(); - qDefs::checkErrorMessage(myDet,"qDrawPlot::ClonePlot"); - } - - - - LockLastImageArray(); - - - // create clone & copy data - if(plot_in_scope==1){ - winClone[i] = new qCloneWidget(this,i,boxPlot->title(),histXAxisTitle,histYAxisTitle,"", - (int)plot_in_scope,sFilePath,displayStatistics,lblMinDisp->text(),lblMaxDisp->text(),lblSumDisp->text()); - if(!anglePlot) - winClone[i]->SetCloneHists((int)nHists,histNBins,histXAxis,histYAxis,histTitle,lines,markers); - else - winClone[i]->SetCloneHists((int)nHists,histNBins,histXAngleAxis,histYAngleAxis,histTitle,lines,markers); - - }else{ - winClone[i] = new qCloneWidget(this,i,boxPlot->title(),imageXAxisTitle, imageYAxisTitle, imageZAxisTitle, - (int)plot_in_scope,sFilePath,displayStatistics,lblMinDisp->text(),lblMaxDisp->text(),lblSumDisp->text()); - winClone[i]->SetCloneHists2D(nPixelsX,-0.5,nPixelsX-0.5,nPixelsY,startPixel,endPixel,lastImageArray); - } - - // update range - found =false; - for(int index=0;index<4;index++) - if(IsXYRange[index]){ - found=true; - break; - } - if(found) - winClone[i]->SetRange(IsXYRange,XYRangeValues); - - - UnlockLastImageArray(); - - winClone[i]->show(); - - // to remember which all clone widgets were closed - connect(winClone[i], SIGNAL(CloneClosedSignal(int)),this, SLOT(CloneCloseEvent(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SaveClones(){ - char errID[200]; - string errMessage= "The Snapshots with ID's: "; - bool success = true; - for(int i=0;iSavePlotAutomatic()){ - success = false; - sprintf(errID,"%d",i); - errMessage.append(string(errID)+string(", ")); - } - } - if(success) - qDefs::Message(qDefs::INFORMATION,"The Snapshots have all been saved successfully in .png.","Dock"); - else - qDefs::Message(qDefs::WARNING,errMessage + string("were not saved."),"qDrawPlot::SaveClones"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::CloseClones(){ - for(int i=0;iclose(); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::CloneCloseEvent(int id){ - winClone[id]=0; -#ifdef VERBOSE - cout << "Closing Clone Window id:" << id << endl; -#endif -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SavePlot(){ - // render image - QImage savedImage(size().width(),size().height(),QImage::Format_RGB32); - QPainter painter(&savedImage); - render(&painter); - - QString fName; - if(running) fName = filePath; - else { - fName = QString(myDet->getFilePath().c_str()); - qDefs::checkErrorMessage(myDet,"qDrawPlot::SavePlot"); - } - - if(boxPlot->title().contains('.')){ - fName.append(QString('/')+boxPlot->title()); - fName.replace(".dat",".png"); - fName.replace(".raw",".png"); - }else fName.append(QString("/Image.png")); - - fName = QFileDialog::getSaveFileName(0,tr("Save Image"),fName,tr("PNG Files (*.png);;XPM Files(*.xpm);;JPEG Files(*.jpg)"),0,QFileDialog::ShowDirsOnly); - - if (!fName.isEmpty()) { - if(savedImage.save(fName)) - qDefs::Message(qDefs::INFORMATION,"The Image has been successfully saved","qDrawPlot::SavePlot"); - else - qDefs::Message(qDefs::WARNING,"Attempt to save image failed.\n" - "Formats: .png, .jpg, .xpm.","qDrawPlot::SavePlot"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SavePlotAutomatic(){ - //no need to save the same plot many times - if((currentFrame>lastSavedFrame)&&(currentMeasurement>=lastSavedMeasurement)){ - - QString qFilePath; - if(running) qFilePath = filePath; - else { - qFilePath = QString(myDet->getFilePath().c_str()); - qDefs::checkErrorMessage(myDet,"qDrawPlot::SavePlotAutomatic"); - } - - - lastSavedFrame = currentFrame; - lastSavedMeasurement = currentMeasurement; - char cID[10]; - sprintf(cID,"%d",lastSavedFrame); - //title - QString fName = qFilePath; - if(boxPlot->title().contains('.')){ - fName.append(QString('/')+boxPlot->title()); - fName.replace(".dat",".png"); - fName.replace(".raw",".png"); - }else fName.append(QString("/Image_unknown_title.png")); - //save - QImage img(size().width(),size().height(),QImage::Format_RGB32); - QPainter painter(&img); - render(&painter); - //if error while saving - if(!img.save(fName)){ - //mention the error only the first time - if(!saveError){ - //so it doesnt repeat again - saveError = true; - connect(this,SIGNAL(saveErrorSignal(QString)),this,SLOT(ShowSaveErrorMessage(QString))); - emit saveErrorSignal(fName); - } - } - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::ShowSaveErrorMessage(QString fileName){ - qDefs::Message(qDefs::WARNING,string("Automatic Saving: Could not save the first file:\n")+ - string(fileName.toAscii().constData()) + string("\n\nNote: Will not show future file save errors for this acquisition."),"qDrawPlot::ShowSaveErrorMessage"); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetPersistency(int val){ - for(int i=0;i<=val;i++) - if(!histYAxis[i]) histYAxis[i] = new double [nPixelsX]; - persistency = val; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::EnablePlot(bool enable){ -#ifdef VERBOSE - cout << "Plotting set to:" << enable << endl; -#endif - plotEnable = enable; - //if no plot, cant do setting range. - // not true vice versa where plot was false and now set it to true - Clear1DPlot(); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::DisableZoom(bool disable){ - if(plot_in_scope==1) - plot1D->DisableZoom(disable); - else - plot2D->GetPlot()->DisableZoom(disable); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qDrawPlot::UpdateTrimbitPlot(bool fromDetector,bool Histogram){ - int ret,actualPixelsX; - double min=0,max=0,sum=0; -#ifdef VERBOSE - if(fromDetector) cout << "Geting Trimbits from Detector" << endl; - else cout << "Getting Trimbits from Shared Memory" << endl; -#endif - - LockLastImageArray(); - - if(detType == slsDetectorDefs::MYTHEN){ - - //get trimbits - actualPixelsX = myDet->getTotalNumberOfChannels(slsDetectorDefs::X); - if(histTrimbits) delete [] histTrimbits; histTrimbits = new double[actualPixelsX]; - ret = myDet->getChanRegs(histTrimbits,fromDetector); - // cout << "got it!" << endl; - if(!ret){ - qDefs::Message(qDefs::WARNING,"No Trimbit data found in shared memory.","qDrawPlot::UpdateTrimbitPlot"); - UnlockLastImageArray(); - return qDefs::FAIL; - } -#ifdef VERBOSE - cout << "Got Trimbits" << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qDrawPlot::UpdateTrimbitPlot"); - - //clear/select plot and set titles - Select1DPlot(); - Clear1DPlot(); - - //Display Statistics - if(displayStatistics){ - GetStatistics(min,max,sum,histTrimbits,actualPixelsX); - lblMinDisp->setText(QString("%1").arg(min)); - lblMaxDisp->setText(QString("%1").arg(max)); - lblSumDisp->setText(QString("%1").arg(sum)); - } - - - if(!Histogram){ - cout << "Data Graph:" << nPixelsX << endl; - - //initialize - nPixelsX = actualPixelsX; - if(histXAxis) delete [] histXAxis; histXAxis = new double [nPixelsX]; - if(histYAxis[0]) delete [] histYAxis[0]; histYAxis[0]= new double [nPixelsX]; - //initializing - for(unsigned int px=0;pxsetTitle("Trimbits_Plot_Data Graph"); - plot1D->SetXTitle("Channel Number"); - plot1D->SetYTitle("Trimbits"); - //set plot parameters - plot1D->SetXMinMax(0,nPixelsX); - /*plot1D->SetYMinMax(0,plotHistogram->boundingRect().height()); plot1D->SetZoomBase(0,0,nPixelsX,plot1D->GetYMaximum());*/ - //for some reason this plothistogram works as well. - plot1D->SetZoomBase(0,0,nPixelsX,plotHistogram->boundingRect().height()); - SlsQtH1D* h; - plot1D_hists.append(h=new SlsQtH1D("",nPixelsX,histXAxis,histYAxis[0])); - h->SetLineColor(0); - histFrameIndexTitle->setText(GetHistTitle(0)); - //attach plot - h->Attach(plot1D); - //refixing all the zooming - /*plot1D->SetXMinMax(h->minXValue(),h->maxXValue()); - plot1D->SetYMinMax(h->minYValue(),h->maxYValue()); - plot1D->SetZoomBase(h->minXValue(),h->minYValue(), - h->maxXValue()-h->minXValue(),h->maxYValue()-h->minYValue());*/ - } - - else{ - cout << "Histogram: " << TRIM_HISTOGRAM_XMAX << endl; - - //create intervals - histogramSamples.resize(TRIM_HISTOGRAM_XMAX+1); - for(unsigned int i=0; i= 0)){//if(histogramSamples[j].interval.contains(data->values[i])) - value = (int) histTrimbits[i]; - histogramSamples[value].value += 1; - } - else cout<<"OUT OF BOUNDS:"<setTitle("Trimbits_Plot_Histogram"); - plot1D->SetXTitle("Trimbits"); - plot1D->SetYTitle("Frequency"); - plotHistogram->setData(new QwtIntervalSeriesData(histogramSamples)); - plotHistogram->setPen(QPen(Qt::red)); - plotHistogram->setBrush(QBrush(Qt::red,Qt::Dense4Pattern));//Qt::SolidPattern - histFrameIndexTitle->setText(GetHistTitle(0)); - plotHistogram->attach(plot1D); - //refixing all the zooming - plot1D->SetXMinMax(0,TRIM_HISTOGRAM_XMAX+1); - plot1D->SetYMinMax(0,plotHistogram->boundingRect().height()); - plot1D->SetZoomBase(0,0,actualPixelsX,plotHistogram->boundingRect().height()); - } - } - - - /**needs to be changed */ - else if(detType == slsDetectorDefs::EIGER){ - - //defining axes - nPixelsX = 100;/**??*/ - nPixelsY = 100; - if(lastImageArray) delete [] lastImageArray; lastImageArray = new double[nPixelsY*nPixelsX]; - //initializing 2d array - memset(lastImageArray, 0 ,nPixelsY * nPixelsX * sizeof(double)); - /* - for(int py=0;py<(int)nPixelsY;py++) - for(int px=0;px<(int)nPixelsX;px++) - lastImageArray[py*nPixelsX+px] = 0; - */ - //get trimbits - ret = 1;/*myDet->getChanRegs(lastImageArray,fromDetector);*/ - if(!ret){ - qDefs::Message(qDefs::WARNING,"No Trimbit data found in shared memory.","qDrawPlot::UpdateTrimbitPlot"); - UnlockLastImageArray(); - return qDefs::FAIL; - } - //clear/select plot and set titles - Select2DPlot(); - plot2D->GetPlot()->SetData(nPixelsX,-0.5,nPixelsX-0.5,nPixelsY,-0.5,nPixelsY-0.5,lastImageArray); - plot2D->setTitle("Image"); - plot2D->SetXTitle("Pixel"); - plot2D->SetYTitle("Pixel"); - plot2D->SetZTitle("Trimbits"); - plot2D->UpdateNKeepSetRangeIfSet(); -#ifdef VERBOSE - cout << "Trimbits Plot updated" << endl; -#endif - - //Display Statistics - if(displayStatistics){ - GetStatistics(min,max,sum,lastImageArray,nPixelsX*nPixelsY); - lblMinDisp->setText(QString("%1").arg(min)); - lblMaxDisp->setText(QString("%1").arg(max)); - lblSumDisp->setText(QString("%1").arg(sum)); - } - - } - - UnlockLastImageArray(); -#ifdef VERBOSE - cout << "Trimbits Plot updated" << endl; -#endif - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetPedestal(bool enable){ -#ifdef VERBOSE - cout << "Setting Pedestal to " << enable << endl; -#endif - if(enable){ - pedestal = true; - if(pedestalVals == 0) - RecalculatePedestal(); - }else{ - pedestal = false; - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::RecalculatePedestal(){ -#ifdef VERBOSE - cout << "Recalculating Pedestal" << endl; -#endif - LockLastImageArray(); - startPedestalCal = 1; - pedestalCount = 0; - - //create array - if(pedestalVals) delete [] pedestalVals; pedestalVals = new double[nPixelsX*nPixelsY]; - if(tempPedestalVals) delete [] tempPedestalVals; tempPedestalVals = new double[nPixelsX*nPixelsY]; - //reset all values - for(unsigned int px=0;px<(nPixelsX*nPixelsY);px++) - pedestalVals[px] = 0; - for(unsigned int px=0;px<(nPixelsX*nPixelsY);px++) - tempPedestalVals[px] = 0; - UnlockLastImageArray(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetAccumulate(bool enable){ -#ifdef VERBOSE - cout << "Setting Accumulate to " << enable << endl; -#endif - accumulate = enable; -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::ResetAccumulate(){ -#ifdef VERBOSE - cout << "Resetting Accumulation" << endl; -#endif - LockLastImageArray(); - resetAccumulate = true; - UnlockLastImageArray(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetPlotTimer(double time){ - timerValue = time; - if(myDet->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG){ - time = myDet->setReceiverReadTimer(timerValue); -#ifdef VERBOSE - cout << "Receiver read timer set to : " << time << endl; -#endif - qDefs::checkErrorMessage(myDet,"qDrawPlot::SetPlotTimer"); - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetFrameFactor(int frame){ - frameFactor = frame; - if(myDet->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG){ - frame = myDet->setReadReceiverFrequency(frame); -#ifdef VERBOSE - cout << "Receiver read frequency set to : " << frame << endl; -#endif - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -void qDrawPlot::UpdateAfterCloning(bool points, bool logy, bool interpolate, bool contour, bool logz){ -#ifdef VERBOSE - cout << endl << "**Updating Plot After Cloning" << endl; -#endif - - //1d - if(plot_in_scope == 1){ - SetMarkers(points); - emit LogySignal(logy); - } - //2d - else{ - emit InterpolateSignal(interpolate); - emit ContourSignal(contour); - emit LogzSignal(logz); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::SetBinary(bool enable, int from, int to){ -#ifdef VERBOSE - if(!enable) - cout << "Disabling Binary output " << endl; - else - cout << "Enabling Binary output from " << from << " to " << to << endl; -#endif - binary = enable; - binaryFrom = from; - binaryTo = to; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::DisplayStatistics(bool enable){ -#ifdef VERBOSE - if(!enable) - cout << "Disabling Statistics Display" << endl; - else - cout << "Enabling Statistics Display" << endl; -#endif - if(enable) widgetStatistics->show(); - else widgetStatistics->hide(); - - displayStatistics = enable; - lblMinDisp->setText("-"); - lblMaxDisp->setText("-"); - lblSumDisp->setText("-"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::GetStatistics(double &min, double &max, double &sum, double* array, int size){ -#ifdef VERYVERBOSE - cout << "Calculating Statistics" << endl; -#endif - - for(int i=0; i < size; i++){ - //calculate min - if(array[i] < min) - min = array[i]; - //calculate max - if(array[i] > max) - max = array[i]; - //calculate sum - sum += array[i]; - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qDrawPlot::EnableGainPlot(bool e) { -#ifdef VERBOSE - cout << "Setting Gain Data enable to " << e << endl; -#endif - gainDataEnable = e; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qDrawPlot::toDoublePixelData(double* dest, char* source,int size, int databytes, int dr, double* gaindest) { - int ichan=0; - int ibyte=0; - int halfbyte=0; - char cbyte = '\0'; - int mask=0x00ffffff; - - switch(dr) { - - case 4: - for (ibyte = 0; ibyte < databytes; ++ibyte) { - cbyte = source[ibyte]; - for (halfbyte = 1; halfbyte >= 0; --halfbyte) { - dest[ichan] = (cbyte >> (halfbyte * 4)) & 0xf; - ++ichan; - } - } - break; - - case 8: - for (ichan = 0; ichan < databytes; ++ichan) { - dest[ichan] = *((u_int8_t*)source); - ++source; - } - break; - - case 16: - if (detType == slsDetectorDefs::JUNGFRAU || detType == slsDetectorDefs::JUNGFRAUCTB) { - - // show gain plot - if(gaindest!=NULL) { - for (ichan = 0; ichan < size; ++ichan) { - if ( (*((u_int16_t*)source)) == 0xFFFF ) { - gaindest[ichan] = 0xFFFF; - dest[ichan] = 0xFFFF; - } - else{ - gaindest[ichan] = (((*((u_int16_t*)source)) & 0xC000) >> 14); - dest[ichan] = ((*((u_int16_t*)source)) & 0x3FFF); - } - source += 2; - } - } - - // only data plot - else { - for (ichan = 0; ichan < size; ++ichan) { - /*if ( (*((u_int16_t*)source)) == 0xFFFF ) - dest[ichan] = 0xFFFF; - else*/ - dest[ichan] = ((*((u_int16_t*)source)) & 0x3FFF); - source += 2; - } - } - break; - } - - - // other detectors - for (ichan = 0; ichan < size; ++ichan) { - dest[ichan] = *((u_int16_t*)source); - source += 2; - } - break; - - default: - if (detType == slsDetectorDefs::MYTHEN) { - for (ichan = 0; ichan < size; ++ichan) { - dest[ichan] = (*((u_int32_t*)source) & mask); - source += 4; - } - break; - } - - // other detectors - for (ichan = 0; ichan < size; ++ichan) { - dest[ichan] = *((u_int32_t*)source); - source += 4; - } - break; - } - -} - diff --git a/slsDetectorGui/src/qScanWidget.cpp b/slsDetectorGui/src/qScanWidget.cpp deleted file mode 100644 index df21eb056..000000000 --- a/slsDetectorGui/src/qScanWidget.cpp +++ /dev/null @@ -1,1247 +0,0 @@ -/* - * qScanWidget.cpp - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -// Qt Project Class Headers -#include "qScanWidget.h" -// Qt Include Headers -#include -#include - -// C++ Include Headers -#include -#include -#include -#include -using namespace std; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qScanWidget::NUM_SCAN_WIDGETS(0); -const string qScanWidget::modeNames[NumModes]={"","energy","threshold","trimbits","position","custom script"}; -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qScanWidget::qScanWidget(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent),myDet(detector),actualNumSteps(0){ - setupUi(this); - positions.resize(0); - SetupWidgetWindow(); - Initialization(); - LoadPositions(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qScanWidget::~qScanWidget(){ - delete myDet; - delete stackedLayout; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetupWidgetWindow(){ - id = NUM_SCAN_WIDGETS; - NUM_SCAN_WIDGETS++; - - setFixedHeight(125); - - btnGroup = new QButtonGroup(this); - btnGroup->addButton(radioRange,0); - btnGroup->addButton(radioCustom,1); - btnGroup->addButton(radioFile,2); - - - normal = radioCustom->palette(); - red = QPalette(); - red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); - fileTip = radioFile->toolTip(); - customTip = radioCustom->toolTip(); - rangeTip = radioRange->toolTip(); - - //layout for the size widgets - stackedLayout = new QStackedLayout; - stackedLayout->setSpacing(0); - - - // Range Size Layout - QWidget *widgetRange = new QWidget; - QHBoxLayout *layoutRange = new QHBoxLayout(widgetRange); - layoutRange->setContentsMargins(0, 0, 0, 0); - lblFrom = new QLabel("from",widgetRange); - spinFrom = new QDoubleSpinBox(widgetRange); - lblTo = new QLabel("to",widgetRange); - spinTo = new QDoubleSpinBox(widgetRange); - lblSize = new QLabel("step size:",widgetRange); - spinSize = new QDoubleSpinBox(widgetRange); - lblFrom->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - lblFrom->setToolTip(rangeTip); - spinFrom->setValue(0); - spinFrom->setToolTip(rangeTip); - spinFrom->setMaximum(1000000); - spinFrom->setMinimum(-1000000); - spinFrom->setKeyboardTracking(false); - spinFrom->setFixedWidth(80); - spinFrom->setDecimals(2); - lblTo->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - lblTo->setToolTip(rangeTip); - lblTo->setFixedWidth(18); - spinTo->setValue(1); - spinTo->setToolTip(rangeTip); - spinTo->setMaximum(1000000); - spinTo->setMinimum(-1000000); - spinTo->setKeyboardTracking(false); - spinTo->setFixedWidth(80); - spinTo->setDecimals(2); - lblSize->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - lblSize->setToolTip(rangeTip); - lblSize->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - lblSize->setFixedWidth(67); - spinSize->setMaximum(1000000); - spinSize->setMinimum(-1000000); - spinSize->setValue(1); - spinSize->setSingleStep(0.1); - spinSize->setToolTip(rangeTip); - spinSize->setKeyboardTracking(false); - spinSize->setDecimals(2); - - //spinSize->setMinimum(0.0001); - layoutRange->addItem(new QSpacerItem(40,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutRange->addWidget(lblFrom); - layoutRange->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutRange->addWidget(spinFrom); - layoutRange->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutRange->addWidget(lblTo); - layoutRange->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutRange->addWidget(spinTo); - layoutRange->addItem(new QSpacerItem(30,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutRange->addWidget(lblSize); - layoutRange->addWidget(spinSize); - layoutRange->addItem(new QSpacerItem(40,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - - - // Custom Values Layout - QWidget *widgetCustom = new QWidget; - QHBoxLayout *layoutCustom = new QHBoxLayout(widgetCustom); - layoutCustom->setContentsMargins(0, 0, 0, 0); - comboCustom = new QComboBox(widgetCustom); - btnCustom = new QPushButton("Delete ",widgetCustom); - btnCustom->setIcon(QIcon( ":/icons/images/close.png" )); - comboCustom->setEditable(true); - comboCustom->setCompleter(NULL); - comboCustom->setValidator(new QDoubleValidator(comboCustom)); - comboCustom->setToolTip(customTip); - btnCustom->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - btnCustom->setToolTip("Deletes current position from list and reduces Number of Positions by 1."); - layoutCustom->addItem(new QSpacerItem(160,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutCustom->addWidget(comboCustom); - layoutCustom->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - layoutCustom->addWidget(btnCustom); - layoutCustom->addItem(new QSpacerItem(160,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - - // File values From a File Layout - QWidget *widgetFile = new QWidget; - QHBoxLayout *layoutFile = new QHBoxLayout(widgetFile); - layoutFile->setContentsMargins(0, 0, 0, 0); - layoutFile->addItem(new QSpacerItem(50,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - dispFile = new QLineEdit(widgetFile); - dispFile->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); - dispFile->setToolTip(fileTip); - layoutFile->addWidget(dispFile); - btnFile = new QPushButton("Browse",widgetFile); - btnFile->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - btnFile->setToolTip(fileTip); - layoutFile->addWidget(btnFile); - layoutFile->addItem(new QSpacerItem(50,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - - - stackedLayout->addWidget(widgetRange); - stackedLayout->addWidget(widgetCustom); - stackedLayout->addWidget(widgetFile); - stackedWidget->setLayout(stackedLayout); - - radioCustom->setChecked(true); - stackedLayout->setCurrentIndex(CustomValues); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::Initialization(){ - //mode - connect(comboScript, SIGNAL(currentIndexChanged(int)), this,SLOT(SetMode(int))); - //file - connect(dispScript, SIGNAL(editingFinished()), this, SLOT(SetScriptFile())); - connect(btnBrowse, SIGNAL(clicked()), this, SLOT(BrowsePath())); - //parameter - connect(dispParameter, SIGNAL(editingFinished()), this, SLOT(SetParameter())); - //sizewidgets - connect(btnGroup, SIGNAL(buttonClicked(QAbstractButton*)),this,SLOT(EnableSizeWidgets())); - //numsteps - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - //precision - connect(spinPrecision, SIGNAL(valueChanged(int)), this, SLOT(SetPrecision(int))); - //range values - connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged())); - connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); - connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - //custom values - connect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); - connect(btnCustom, SIGNAL(clicked()), this, SLOT(DeleteCustomSteps())); - //file values - connect(dispFile, SIGNAL(editingFinished()), this, SLOT(SetFileSteps())); - connect(btnFile, SIGNAL(clicked()), this, SLOT(BrowseFileStepsPath())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::EnableSizeWidgets(){ -#ifdef VERYVERBOSE - cout << "Entering EnableSizeWidgets()" << endl; -#endif - //setting to defaults is not done here as this is called even if mode changes - //so only if its to change the size widget type, its set to default for the others - - //scan is none - if(!comboScript->currentIndex()){ - radioCustom->setText("Specific Values"); - radioCustom->setPalette(normal); - radioCustom->setToolTip(customTip); - comboCustom->setToolTip(customTip); - - radioFile->setPalette(normal); - radioFile->setText("Values from File:"); - radioFile->setToolTip(fileTip); - dispFile->setToolTip(fileTip); - btnFile->setToolTip(fileTip); - - lblTo->setPalette(normal); - lblTo->setText("to"); - lblTo->setToolTip(rangeTip); - spinTo->setToolTip(rangeTip); - } - else{ - //range values - if(radioRange->isChecked()){ -#ifdef VERBOSE - cout << "Constant Range Values" << endl; -#endif - - radioCustom->setText("Specific Values"); - radioCustom->setPalette(normal); - radioCustom->setToolTip(customTip); - comboCustom->setToolTip(customTip); - - radioFile->setPalette(normal); - radioFile->setText("Values from File:"); - radioFile->setToolTip(fileTip); - dispFile->setToolTip(fileTip); - btnFile->setToolTip(fileTip); - - stackedLayout->setCurrentIndex(RangeValues); - - //recaluculate number of steps - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - spinSteps->setValue(1+(int)(abs((spinTo->value() - spinFrom->value()) / spinSize->value()))); - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - - spinSteps->setMinimum(2); - RangeCheckToValid(); - SetRangeSteps(); - } - //custom values - else if(radioCustom->isChecked()){ -#ifdef VERBOSE - cout << "Custom Values" << endl; -#endif - spinSteps->setMinimum(0); - //defaults for other mode - radioFile->setPalette(normal); - radioFile->setText("Values from File:"); - radioFile->setToolTip(fileTip); - dispFile->setToolTip(fileTip); - btnFile->setToolTip(fileTip); - - lblTo->setPalette(normal); - lblTo->setText("to"); - lblTo->setToolTip(rangeTip); - spinTo->setToolTip(rangeTip); - - //change it back as this list is what will be loaded. - //also numstpes could have been changed in other modes too - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - spinSteps ->setValue(comboCustom->count()); - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - - stackedLayout->setCurrentIndex(CustomValues); - //only for custom steps out here because many signals go through - //custom steps and we want to give the info msg only when changig range types - if(SetCustomSteps()==qDefs::OK){ -#ifdef VERYVERBOSE - char cNum[200];sprintf(cNum,"%d",actualNumSteps); - char cId[5];sprintf(cId,"%d",id); - qDefs::Message(qDefs::INFORMATION,string("Scan Level ")+string(cId)+ - string(": Specific Values

Number of positions added: ")+ - string(cNum)+string(""),"qScanWidget::EnableSizeWidgets"); -#endif - } - } - - //file values - else{ -#ifdef VERBOSE - cout << "File Values" << endl; -#endif - spinSteps->setMinimum(0); - //defaults for other mode - radioCustom->setText("Specific Values"); - radioCustom->setPalette(normal); - radioCustom->setToolTip(customTip); - comboCustom->setToolTip(customTip); - - lblTo->setPalette(normal); - lblTo->setText("to"); - lblTo->setToolTip(rangeTip); - spinTo->setToolTip(rangeTip); - - stackedLayout->setCurrentIndex(FileValues); - SetFileSteps(); - } - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetMode(int mode){ -#ifdef VERYVERBOSE - cout << "Entering SetMode()" << endl; -#endif -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\tmode:" << mode << endl; -#endif - // defaults - dispScript->setEnabled(false); - btnBrowse->setEnabled(false); - lblParameter->setEnabled(false); - dispParameter->setEnabled(false); - group->setEnabled(false); - lblSteps->setEnabled(false); - spinSteps->setEnabled(false); - lblPrecision->setEnabled(false); - spinPrecision->setEnabled(false); - - // If anything other than None is selected - if(mode){ - lblSteps->setEnabled(true); - spinSteps->setEnabled(true); - // Custom Script only enables the first layout with addnl parameters etc - if(mode==CustomScript){ - dispScript->setEnabled(true); - btnBrowse->setEnabled(true); - lblParameter->setEnabled(true); - dispParameter->setEnabled(true); - } - group->setEnabled(true); - lblPrecision->setEnabled(true); - spinPrecision->setEnabled(true); - - } - - //set the group box widgets and also calls setscan - EnableSizeWidgets(); - - //set the mode if mode = none - if(!mode) SetScan(mode); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qScanWidget::SetScan(int mode){ -#ifdef VERYVERBOSE - cout << "Entering SetScan()" << endl; -#endif - string parameter = string(dispParameter->text().toAscii().constData()); - string script = string(dispScript->text().toAscii().constData()); -#ifdef VERBOSE - cout << "SETTING scan:" << id << "\tmode:" << comboScript->currentIndex() << - "\tnumSteps:" << actualNumSteps << - "\tscript:" << script << "\tparameter:" << parameter << endl; -#endif - double *values; - if(actualNumSteps) values = new double[actualNumSteps]; - else values = NULL; - for(int i=0;isetScan(id,script,actualNumSteps,values,parameter); - else - myDet->setScan(id,modeNames[mode],actualNumSteps,values,parameter); - - //custom script - int actualMode = myDet->getScanMode(id); - if((mode==CustomScript)&&((script=="")||(script=="none"))){ - return qDefs::OK; - }else{//mode NOT set - if((mode!=actualMode)&&(actualNumSteps)){ - qDefs::Message(qDefs::WARNING,"The mode could not be changed for an unknown reason.","qScanWidget::SetScan"); - comboScript->setCurrentIndex(actualMode); - return qDefs::FAIL; - } - } - - emit EnableScanBox(); - - qDefs::checkErrorMessage(myDet,"qScanWidget::SetScan"); - - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qScanWidget::BrowsePath(){ -#ifdef VERYVERBOSE - cout << "Entering BrowsePath()" << endl; -#endif -#ifdef VERBOSE - cout << "Browsing Script File Path\tscan:" << id << endl; -#endif - QString fName = dispScript->text(); - QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); - if(dir.isEmpty()) dir = "/home/"; - //dialog - fName = QFileDialog::getOpenFileName(this, - tr("Load Script File"),dir, - tr("Script Files(*.awk);;All Files(*)")); - //if empty, set the file name and it calls setscriptfile, else ignore - if (!fName.isEmpty()){ - dispScript->setText(fName); - SetScriptFile(); - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qScanWidget::SetScriptFile(){ -#ifdef VERYVERBOSE - cout << "Entering SetScriptFile()" << endl; -#endif - QString fName = dispScript->text(); -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\tscript:" << fName.toAscii().constData() << endl; -#endif - bool set = false; - struct stat st_buf; - - //blank - if(fName.isEmpty()) - set = true; - //none isnt in the modeNames list, so check separately - else if(!fName.compare("none")) - set = true; - else{//if one of the other modes - for(int i=1;isetText(QString(myDet->getScanScript(id).c_str())); - } - //if its not a file - else if (!S_ISREG (st_buf.st_mode)) { - qDefs::Message(qDefs::WARNING,"The script file path entered is not a file","qScanWidget::SetScriptFile"); - dispScript->setText(QString(myDet->getScanScript(id).c_str())); - } - else - set=true; - } - - //if blank or valid file - if(set){ - myDet->setScanScript(id,fName.toAscii().constData()); - if(fName.compare(QString(myDet->getScanScript(id).c_str()))){ - //did not get set, write what is was before - if(!fName.isEmpty()) - qDefs::Message(qDefs::WARNING,"The script file could not be set. Reverting to previous file.","qScanWidget::SetScriptFile"); - dispScript->setText(QString(myDet->getScanScript(id).c_str())); - } - - } - - //dont display if theres a none - fName = dispScript->text(); - //none isnt in the modeNames list, so check separately - if(!fName.compare("none")) - dispScript->setText(""); - for(int i=1;isetText(""); - - qDefs::checkErrorMessage(myDet,"qScanWidget::SetScriptFile"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetParameter(){ -#ifdef VERYVERBOSE - cout << "Entering SetParameter()" << endl; -#endif - QString parameter = dispParameter->text(); -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\tparameter:" << parameter.toAscii().constData() << endl; -#endif - - myDet->setScanParameter(id,parameter.toAscii().constData()); - //dont display if theres a none - parameter = dispParameter->text(); - //none isnt in the modeNames list, so check separately - if(!parameter.compare("none")) - dispParameter->setText(""); - for(int i=1;isetText(""); - - qDefs::checkErrorMessage(myDet,"qScanWidget::SetParameter"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetPrecision(int value){ -#ifdef VERYVERBOSE - cout << "Entering SetPrecision()" << endl; -#endif -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\tprecision:" << value << endl; -#endif - myDet->setScanPrecision(id,value); - if(myDet->getScanPrecision(id)!=value) - qDefs::Message(qDefs::WARNING,"The precision was not set for an unknown reason.","qScanWidget::SetPrecision");; - - qDefs::checkErrorMessage(myDet,"qScanWidget::SetPrecision"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetNSteps(){ -#ifdef VERYVERBOSE - cout << "Entering SetNSteps()" << endl; -#endif -#ifdef VERBOSE - cout << "Setting number of steps" << endl; -#endif - - //check if its ok - if(radioRange->isChecked()){ - disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - spinSize->setValue( (spinTo->value()-spinFrom->value()) / (spinSteps->value()-1)); - connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - RangeCheckToValid(); - SetRangeSteps(); - }else if(radioCustom->isChecked()){ - comboCustom->setMaxCount(spinSteps->value()); - SetCustomSteps(); - }else if(radioFile->isChecked()){ - SetFileSteps(); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qScanWidget::RangeCheckSizeZero(){ -#ifdef VERYVERBOSE - cout << "Entering RangeCheckSizeZero()" << endl; -#endif - if((spinTo->value()-spinFrom->value())/(spinSteps->value()-1)) - return qDefs::OK; - - return qDefs::FAIL; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qScanWidget::RangeCheckNumValid(int &num){ -#ifdef VERYVERBOSE - cout << "Entering RangeCheckNumValid()" << endl; -#endif - double div = abs(spinTo->value()-spinFrom->value())/(abs(spinSize->value())); - - //num = (to-from)/size +1 - num = (int)(div) + 1; - - if(num>=2) return qDefs::OK; - - return qDefs::FAIL; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qScanWidget::RangeCheckToValid(){ -#ifdef VERYVERBOSE - cout << "Entering RangeCheckToValid()" << endl; -#endif - double to = (spinSize->value() * spinSteps->value()) - spinSize->value() + spinFrom->value(); - - //not exact value - if (abs(to-spinTo->value())>0.01){ - lblTo->setPalette(red); - lblTo->setText("to*"); - QString tip = rangeTip + QString("

" - "To is not exact. Entering Size should recalculate To."); - lblTo->setToolTip(tip); - spinTo->setToolTip(tip); - return qDefs::FAIL; - } - - lblTo->setPalette(normal); - lblTo->setText("to"); - lblTo->setToolTip(rangeTip); - spinTo->setToolTip(rangeTip); - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::RangeFromChanged(){ -#ifdef VERYVERBOSE - cout << "Entering RangeFromChanged()" << endl; -#endif - bool change = false; - int numSteps; - - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - disconnect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged())); - disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - - - //check size validity - if(RangeCheckSizeZero()==qDefs::FAIL) - qDefs::Message(qDefs::WARNING,"From cannot be equal to To. Changing From back to previous value.","Scan"); - //check size validity - else if(RangeCheckNumValid(numSteps)==qDefs::FAIL) - qDefs::Message(qDefs::WARNING,"Number of Steps = 1 + ( To - From ) / Size.
" - "Number of Steps must be >= 2. Changing From back to previous value.","qScanWidget::RangeFromChanged"); - else change = true; - - //change it back from = to - size*num + size - if(!change) { - spinFrom->setValue(spinTo->value() - (spinSize->value() * spinSteps->value()) + spinSize->value()); -#ifdef VERBOSE - cout << "Changing From back:"<< spinFrom->value() << endl; -#endif - } - //change num steps - else{ - spinSteps->setValue(numSteps); - //size will lnever be zero here - //size should be positive - if(spinTo->value()>spinFrom->value()) - spinSize->setValue(abs(spinSize->value())); - //size should be negative - else if(spinSize->value()>0) - spinSize->setValue(-1*(spinSize->value())); - } - - RangeCheckToValid(); - SetRangeSteps(); - - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - connect(spinFrom, SIGNAL(valueChanged(double)), this, SLOT(RangeFromChanged())); - connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::RangeToChanged(){ -#ifdef VERYVERBOSE - cout << "Entering RangeToChanged()" << endl; -#endif - bool change = false; - int numSteps; - - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - disconnect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); - disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - - //check size validity - if(RangeCheckSizeZero()==qDefs::FAIL) - qDefs::Message(qDefs::WARNING,"From cannot be equal to To. Changing To back to previous value.","qScanWidget::RangeToChanged"); - //check size validity - else if(RangeCheckNumValid(numSteps)==qDefs::FAIL) - qDefs::Message(qDefs::WARNING,"Number of Steps = 1 + ( To - From ) / Size.
" - "Number of Steps must be >= 2. Changing To back to previous value.","qScanWidget::RangeToChanged"); - else change = true; - - //change it back to = size*num - size + from - if(!change) { - spinTo->setValue((spinSize->value() * spinSteps->value()) - spinSize->value() + spinFrom->value()); -#ifdef VERBOSE - cout << "Changing To back:"<< spinTo->value() << endl; -#endif - } - //change num steps - else{ - spinSteps->setValue(numSteps); - //size will lnever be zero here - //size should be positive - if(spinTo->value()>spinFrom->value()) - spinSize->setValue(abs(spinSize->value())); - //size should be negative - else if(spinSize->value()>0) - spinSize->setValue(-1*(spinSize->value())); - - } - - RangeCheckToValid(); - SetRangeSteps(); - - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); - connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::RangeSizeChanged(){ -#ifdef VERYVERBOSE - cout << "Entering RangeSizeChanged()" << endl; -#endif - bool change = false; - int numSteps; - - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - disconnect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - disconnect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); - - //check size validity - if(!spinSize->value()) - qDefs::Message(qDefs::WARNING,"Size cannot be 0. Changing Size back to previous value.","qScanWidget::RangeSizeChanged"); - //check size validity - else if(RangeCheckNumValid(numSteps)==qDefs::FAIL) - qDefs::Message(qDefs::WARNING,"Number of Steps = 1 + ( To - From ) / Size.
" - "Number of Steps must be >= 2. Changing Size back to previous value.","qScanWidget::RangeSizeChanged"); - else change = true; - - //change it back size = (to-from)/(num-1) - if(!change) { - spinSize->setValue((spinTo->value()-spinFrom->value())/(spinSteps->value()-1)); -#ifdef VERBOSE - cout << "Changing Size back:"<< spinSize->value() << endl; -#endif - } - //change num steps - else{ - spinSteps->setValue(numSteps); - //in case size changed to negative - spinTo->setValue((spinSize->value() * spinSteps->value()) - spinSize->value() + spinFrom->value()); - lblTo->setPalette(normal); - lblTo->setText("to"); - lblTo->setToolTip(rangeTip); - spinTo->setToolTip(rangeTip); - } - - RangeCheckToValid(); - SetRangeSteps(); - - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - connect(spinSize, SIGNAL(valueChanged(double)), this, SLOT(RangeSizeChanged())); - connect(spinTo, SIGNAL(valueChanged(double)), this, SLOT(RangeToChanged())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetRangeSteps(){ -#ifdef VERYVERBOSE - cout << "Entering SetRangeSteps()" << endl; -#endif -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\trange\t"; -#endif - double fromVal = spinFrom->value(); - double sizeVal = spinSize->value(); - actualNumSteps = spinSteps->value(); - - -#ifdef VERBOSE - cout << "num pos:" << actualNumSteps << endl; -#endif - - //set the vector positions - positions.resize(actualNumSteps); - for(int i=0;icurrentIndex())==qDefs::OK){ - char cId[5];sprintf(cId,"%d",id); - QString script = dispScript->text(); - - - //positions wont be loaded if its custom script - if((comboScript->currentIndex()==CustomScript)&&((script=="")||(script=="none"))){ - qDefs::Message(qDefs::INFORMATION,string("Scan Level ")+string(cId)+ - string(": Constant Step Size

" - "Positions could not be loaded as the script file path is empty."),"qScanWidget::SetRangeSteps"); - }else{ - //error loading positions - if(myDet->getScanSteps(id)!=actualNumSteps){ - qDefs::Message(qDefs::WARNING,string("Scan Level ")+string(cId)+ - string(": Values From File

" - "The positions list was not set for an unknown reason."),"qScanWidget::SetRangeSteps"); - /*LoadPositions(); - comboScript->setCurrentIndex(myDet->getScanMode(id))*/ - } -#ifdef VERYVERBOSE - else{//SUCCESS - char cNum[200];sprintf(cNum,"%d",actualNumSteps); - qDefs::Message(qDefs::INFORMATION,string("Scan Level ")+string(cId)+ - string(": Constant Step Size

Number of positions added: ")+ - string(cNum)+string(""),"qScanWidget::SetRangeSteps"); - } -#endif - } - } - - qDefs::checkErrorMessage(myDet,"qScanWidget::SetRangeSteps"); -} -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qScanWidget::SetCustomSteps(){ -#ifdef VERYVERBOSE - cout << "Entering SetCustomSteps()" << endl; -#endif -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\tcustom\tnum pos:" << comboCustom->count() << endl; -#endif - disconnect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); - - //get number of positions - int numSteps = spinSteps->value(); - comboCustom->setMaxCount(numSteps); - comboCustom->setEnabled(numSteps); - btnCustom->setEnabled(numSteps); - - //deleting too many or not entering enough - if(numSteps>comboCustom->count()){ -#ifdef VERBOSE - cout << "Too few entries" << endl; -#endif - int diff = numSteps - (comboCustom->count()); - radioCustom->setPalette(red); - radioCustom->setText("Specific Values*"); - QString tip = customTip + QString("

Add ")+ - (QString("%1").arg(diff))+ - QString(" more positions to the list to match Number of Steps.
" - "
Or reduce Number of Steps.
"); - radioCustom->setToolTip(tip); - comboCustom->setToolTip(tip); - }else{ - radioCustom->setText("Specific Values"); - radioCustom->setPalette(normal); - radioCustom->setToolTip(customTip); - comboCustom->setToolTip(customTip); - } - - actualNumSteps = comboCustom->count(); - //delete existing positions - positions.resize(actualNumSteps); - //copying the list - for(int i=0;iitemText(i).toDouble(); -#ifdef VERBOSE - cout << "positions[" << i << "]:" << positions[i] << endl; -#endif - } - - //sets the scan - if(SetScan(comboScript->currentIndex())==qDefs::OK){ - char cId[5];sprintf(cId,"%d",id); - QString script = dispScript->text(); - //positions wont be loaded if its custom script - if((comboScript->currentIndex()==CustomScript)&&((script=="")||(script=="none"))){ - qDefs::Message(qDefs::INFORMATION,string("Scan Level ")+string(cId)+ - string(": Values From File

" - "Positions could not be loaded as the script file path is empty."),"qScanWidget::SetCustomSteps"); - return qDefs::FAIL; - }else{ - if(myDet->getScanSteps(id)!=actualNumSteps){ - qDefs::Message(qDefs::WARNING,"The positions list was not set for an unknown reason.","qScanWidget::SetCustomSteps"); - LoadPositions(); - comboScript->setCurrentIndex(myDet->getScanMode(id)); - qDefs::checkErrorMessage(myDet,"qScanWidget::qScanWidget::SetCustomSteps"); - return qDefs::FAIL; - } - //else success is checked in enabledsizewidgets , else it does this for every add, delete etc - } - } - - //if num of steps = 0 - if(!spinSteps->value()){ - comboCustom->setEnabled(false); - btnCustom->setEnabled(false); - radioCustom->setPalette(red); - radioCustom->setText("Specific Values*"); - QString tip = customTip + QString("

First, increase Number of Steps. " - "Then, enter values here."); - radioCustom->setToolTip(tip); - comboCustom->setToolTip(tip); - } - connect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); - - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::DeleteCustomSteps(){ -#ifdef VERYVERBOSE - cout << "Entering DeleteCustomSteps()" << endl; -#endif - QString pos = comboCustom->currentText(); - bool found = false; - //loops through to find the index and to make sure its in the list - for(int i=0;icount();i++){ - if(!comboCustom->itemText(i).compare(pos)){ - found = true; - comboCustom->removeItem(i); - break; - } - } - if(found){ -#ifdef VERBOSE - cout << "Deleting Position " << endl; -#endif - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::SetFileSteps(){ -#ifdef VERYVERBOSE - cout << "Entering SetFileSteps()" << endl; -#endif - QString fName = dispFile->text(); -#ifdef VERBOSE - cout << "Setting\tscan:" << id << "\tfile\t:" << fName.toAscii().constData() << endl; -#endif - bool set = false; - struct stat st_buf; - - //blank - if(fName.isEmpty()){ -#ifdef VERBOSE - cout << "Empty file" << endl; -#endif - radioFile->setPalette(red); - radioFile->setText("Values from File:*"); - QString errTip = fileTip + QString("

The file path is empty.");; - radioFile->setToolTip(errTip);dispFile->setToolTip(errTip);btnFile->setToolTip(errTip); - } - //not a blank - else{ - QString file = dispFile->text().section('/',-1); - - //path doesnt exist - if(stat(file.toAscii().constData(),&st_buf)){ -#ifdef VERBOSE - cout << "The file entered does not exist." << endl; -#endif - radioFile->setPalette(red); - radioFile->setText("Values from File:*"); - QString errTip = fileTip + QString("

The file entered does not exist."); - radioFile->setToolTip(errTip);dispFile->setToolTip(errTip);btnFile->setToolTip(errTip); - } - //if its not a file - else if (!S_ISREG (st_buf.st_mode)) { -#ifdef VERBOSE - cout << "The file path entered is not a file." << endl; -#endif - radioFile->setPalette(red); - radioFile->setText("Values from File:*"); - QString errTip = fileTip + QString("

The file path entered is not a file."); - radioFile->setToolTip(errTip); dispFile->setToolTip(errTip);btnFile->setToolTip(errTip); - } - else - set = true; - } - - //if valid file - if(set){ - ifstream inFile;string sLine;char sArg[200]=""; - //open file - inFile.open(fName.toAscii().constData(), ifstream::in); - if(inFile.is_open()){ - //delete existing positions - positions.resize(0); - actualNumSteps = 0; -#ifdef VERBOSE - cout << "Opening file "<< fName.toAscii().constData() << endl; -#endif - while(inFile.good()) { - getline(inFile,sLine); - if(sLine.find('#')!=string::npos) continue;//commented out - else if(sLine.length()<2) continue;// empty line - else { - istringstream sstr(sLine); - if(sstr.good()){ - actualNumSteps++; - positions.resize(actualNumSteps); - sstr>>sArg; - if(!sscanf(sArg,"%lf",&positions[actualNumSteps-1])){ - actualNumSteps--; - positions.resize(actualNumSteps); - } - else cout << "value[" << actualNumSteps-1 << "]:" << positions[actualNumSteps-1] << endl; - } - } - } - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - spinSteps->setValue(actualNumSteps); - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - inFile.close(); - }else {//could not open file -#ifdef VERBOSE - cout << "Could not open file" << endl; -#endif - set = false; - radioFile->setPalette(red); - radioFile->setText("Values from File:*"); - QString errTip = fileTip + QString("

Could not read file."); - radioFile->setToolTip(errTip);dispFile->setToolTip(errTip); btnFile->setToolTip(errTip); - } - } - if(set){//no error while reading file - //sets the scan and positions - if(SetScan(comboScript->currentIndex())==qDefs::OK){ - char cId[5];sprintf(cId,"%d",id); - QString script = dispScript->text(); - radioFile->setPalette(normal); - radioFile->setText("Values from File:"); - radioFile->setToolTip(fileTip);dispFile->setToolTip(fileTip);btnFile->setToolTip(fileTip); - //positions wont be loaded if its custom script - if((comboScript->currentIndex()==CustomScript)&&((script=="")||(script=="none"))){ - qDefs::Message(qDefs::INFORMATION,string("Scan Level ")+string(cId)+ - string(": Values From File

" - "Positions could not be loaded as the script file path is empty."),"qScanWidget::SetFileSteps"); - }else{ - //error loading positions - if(myDet->getScanSteps(id)!=actualNumSteps){ - qDefs::Message(qDefs::WARNING,string("Scan Level ")+string(cId)+ - string(": Values From File

" - "The positions list was not set for an unknown reason."),"qScanWidget::SetFileSteps"); - } -#ifdef VERYVERBOSE - else{//SUCCESS - char cNum[200];sprintf(cNum,"%d",actualNumSteps); - qDefs::Message(qDefs::INFORMATION,string("Scan Level ")+string(cId)+ - string(": Values From File

Number of positions added: ")+ - string(cNum)+string(""),"qScanWidget::SetFileSteps"); - } -#endif - } - } - } - //ERROR IN WRITING FILENAME OR READING FILE - else{ - actualNumSteps=0; - positions.resize(0); - SetScan(comboScript->currentIndex()); - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - spinSteps->setValue(actualNumSteps); - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - } - - qDefs::checkErrorMessage(myDet,"qScanWidget::SetFileSteps"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::BrowseFileStepsPath(){ -#ifdef VERYVERBOSE - cout << "Entering BrowseFileStepsPath()" << endl; -#endif -#ifdef VERBOSE - cout << "Browsing Steps File Path\tscan:" << id << endl; -#endif - QString fName = dispFile->text(); - QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); - if(dir.isEmpty()) dir = "/home/"; - //dialog - fName = QFileDialog::getOpenFileName(this, - tr("Load Scan Steps Script File"),dir, - tr("Scan Steps Script Files(*.awk);;All Files(*)")); - //if empty, set the file name and it calls SetFileSteps, else ignore - if (!fName.isEmpty()){ - dispFile->setText(fName); - SetFileSteps(); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::LoadPositions(){ -#ifdef VERYVERBOSE - cout << "Entering LoadPositions()" << endl; -#endif - disconnect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); - disconnect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - disconnect(btnGroup, SIGNAL(buttonClicked(QAbstractButton*)),this,SLOT(EnableSizeWidgets())); - - - int mode = myDet->getScanMode(id); - radioCustom->setChecked(true); - - int numSteps = myDet->getScanSteps(id); - actualNumSteps = numSteps; - comboCustom->setMaxCount(numSteps); - positions.resize(actualNumSteps); - - //set the number of steps in the gui - spinSteps->setValue(numSteps); - - //load the positions - double *values = NULL; - if(actualNumSteps){ - values = new double[actualNumSteps]; - myDet->getScanSteps(id,values); - } - for(int i=0;isetText("Specific Values"); - radioCustom->setPalette(normal); - radioCustom->setToolTip(customTip); - comboCustom->setToolTip(customTip); - }//no positions and has a mode - else if(mode){ - radioCustom->setPalette(red); - radioCustom->setText("Specific Values*"); - QString tip = customTip + QString("

First, increase Number of Steps. " - "Then, enter values here."); - radioCustom->setToolTip(tip); - comboCustom->setToolTip(tip); - } - for(int i=0;icount();i++) - comboCustom->removeItem(i); - for(int i=0;iinsertItem(i,QString("%1").arg(positions[i])); - - //delete the combolist and reload it - comboCustom->setEnabled(numSteps&&mode); - btnCustom->setEnabled(numSteps&&mode); - - connect(comboCustom, SIGNAL(currentIndexChanged(int)), this, SLOT(SetCustomSteps())); - connect(spinSteps, SIGNAL(valueChanged(int)), this, SLOT(SetNSteps())); - connect(btnGroup, SIGNAL(buttonClicked(QAbstractButton*)),this,SLOT(EnableSizeWidgets())); - - qDefs::checkErrorMessage(myDet,"qScanWidget::LoadPositions"); - //do not set the range variables because if the stepsize is by any chance 0.. - //then the number of steps should change to 1. so only set custom steps -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qScanWidget::Refresh(){ -#ifdef VERYVERBOSE - cout << "Entering Refresh()" << endl; -#endif - int mode = (myDet->getScanMode(id)); - string script = myDet->getScanScript(id); - string parameter = myDet->getScanParameter(id); - int precision = myDet->getScanPrecision(id); - - - //settings values and checking for none - if(QString(script.c_str()).compare("none")) - dispScript->setText(QString(script.c_str())); - if(mode) SetScriptFile(); - dispParameter->setText(QString(parameter.c_str())); - SetParameter(); - spinPrecision->setValue(precision); - - //set mode which also checks number of steps - //and enable size widgets and set the positions from combolist to server - comboScript->setCurrentIndex(mode); - - -#ifdef VERBOSE - cout << "Updated\tscan:" << id << "\t" - "mode:" << mode << "\t" - "script:" << script << "\t" - "numSteps:" << actualNumSteps << "\t" - //"values:" << arrSteps << "\t" - "parameter:" << parameter << "\t" - "precision:" << precision << "\t***" << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qScanWidget::Refresh"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorGui/src/qServer.cpp b/slsDetectorGui/src/qServer.cpp deleted file mode 100644 index 9b83a8d9c..000000000 --- a/slsDetectorGui/src/qServer.cpp +++ /dev/null @@ -1,431 +0,0 @@ -/* - * qServer.cpp - * - * Created on: Feb 27, 2013 - * Author: Dhanya Maliakal - */ -// Qt Project Class Headers -#include "qServer.h" -#include "qDetectorMain.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -#include "MySocketTCP.h" -// C++ Include Headers -#include -#include -using namespace std; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qServer::gui_server_thread_running(0); - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qServer::qServer(qDetectorMain *t): - myMainTab(t), mySocket(0),myStopSocket(0),port_no(DEFAULT_GUI_PORTNO),lockStatus(0),checkStarted(0),checkStopStarted(0){ - strcpy(mess,""); - FunctionTable(); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qServer::~qServer(){ - delete myMainTab; - if(mySocket) delete mySocket; - if(myStopSocket) delete myStopSocket; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qServer::FunctionTable(){ - - flist[F_GET_RUN_STATUS] = &qServer::GetStatus; - flist[F_START_ACQUISITION] = &qServer::StartAcquisition; - flist[F_STOP_ACQUISITION] = &qServer::StopsAcquisition; - flist[F_START_AND_READ_ALL] = &qServer::Acquire; - flist[F_EXIT_SERVER] = &qServer::ExitServer; - - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - -int qServer::DecodeFunction(MySocketTCP* sock){ - int ret = qDefs::FAIL; - int n,fnum; -#ifdef VERYVERBOSE - cout << "receive data" << endl; -#endif - n = sock->ReceiveDataOnly(&fnum,sizeof(fnum)); - if (n <= 0) { -#ifdef VERYVERBOSE - cout << "ERROR reading from socket " << n << ", " << fnum << endl; -#endif - return qDefs::FAIL; - } -#ifdef VERYVERBOSE - else - cout << "size of data received " << n <ShutDownSocket(); - - myStopSocket->SendDataOnly(&ret,sizeof(ret)); - myStopSocket->SendDataOnly(mess,sizeof(mess)); - return GOODBYE; - } - - - //calling function - ret = (this->*flist[fnum])(); - if (ret==qDefs::FAIL) - cout << "Error executing the function = " << fnum << endl; - - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - -int qServer::ExitServer(){ - - int ret = OK; - strcpy(mess," Gui Server closed successfully\n"); - - if(mySocket) - mySocket->ShutDownSocket(); - - myStopSocket->SendDataOnly(&ret,sizeof(ret)); - myStopSocket->SendDataOnly(mess,sizeof(mess)); - cout << mess << endl; - - return GOODBYE; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - - -int qServer::StartStopServer(int start){ - - //start server - if(start){ -#ifdef VERBOSE - cout << endl << "Starting Gui Server" << endl; -#endif - - if(!gui_server_thread_running){ - gui_server_thread_running=1; - - - //error creating thread - checkStarted=1; - if (pthread_create(&gui_server_thread, NULL,StartServerThread, (void*) this)){ - gui_server_thread_running=0; - qDefs::Message(qDefs::WARNING,"Can't create gui server thread", "qServer::StartStopServer"); - cout << "ERROR: Can't create gui server thread" << endl; - return FAIL; - } - while(checkStarted); - checkStarted = 0; -#ifdef VERBOSE - if(gui_server_thread_running) - cout << "Server thread created successfully." << endl; -#endif - - - //error creating thread - checkStopStarted=1; - if (pthread_create(&gui_stop_server_thread, NULL,StopServerThread, (void*) this)){ - gui_server_thread_running=0; - qDefs::Message(qDefs::WARNING,"Can't create gui stop server thread", "qServer::StartStopServer"); - cout << "ERROR: Can't create gui stop server thread" << endl; - return FAIL; - } - while(checkStopStarted); - checkStopStarted=0; -#ifdef VERBOSE - if(gui_server_thread_running) - cout << "Server Stop thread created successfully." << endl; -#endif - } - } - - - //stop server - else{ -#ifdef VERBOSE - cout << "Stopping Gui Server" << endl; -#endif - - if(gui_server_thread_running){ - gui_server_thread_running=0; - - if(mySocket) - mySocket->ShutDownSocket(); - pthread_join(gui_server_thread,NULL); - if(mySocket){ - delete mySocket; - mySocket = 0; - } - - if(myStopSocket) - myStopSocket->ShutDownSocket(); - pthread_join(gui_stop_server_thread,NULL); - if(myStopSocket){ - delete myStopSocket; - myStopSocket = 0; - } - } -#ifdef VERBOSE - cout << "Server threads stopped successfully." << endl; -#endif - } - - return gui_server_thread_running; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void* qServer::StopServerThread(void* this_pointer){ - ((qServer*)this_pointer)->StopServer(); - return this_pointer; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -int qServer::StopServer(){ -#ifdef VERYVERBOSE - cout << "In StopServer()" << endl; -#endif - int ret = qDefs::OK; - - try { - MySocketTCP* s = new MySocketTCP(port_no+1); - myStopSocket = s; - } catch(...) { - gui_server_thread_running = 0; - qDefs::Message(qDefs::WARNING,"Could not start gui stop server socket","qServer::StopServer"); - } - checkStopStarted = 0; - - while ((gui_server_thread_running) && (ret!=GOODBYE)) { -#ifdef VERBOSE - cout<< endl; -#endif -#ifdef VERYVERBOSE - cout << "Waiting for client call" << endl; -#endif - if(myStopSocket->Connect()>=0){ -#ifdef VERYVERBOSE - cout << "Conenction accepted" << endl; -#endif - ret = DecodeFunction(myStopSocket); -#ifdef VERYVERBOSE - cout << "function executed" << endl; -#endif - myStopSocket->Disconnect(); -#ifdef VERYVERBOSE - cout << "connection closed" << endl; -#endif - } - } -#ifdef VERBOSE - cout << "Stopped gui stop server thread" << endl; -#endif - gui_server_thread_running = 0; - //delete socket(via exit server) - if(myStopSocket){ - delete myStopSocket; - myStopSocket = 0; - } - - if(!gui_server_thread_running) - emit ServerStoppedSignal(); - - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -void* qServer::StartServerThread(void* this_pointer){ - ((qServer*)this_pointer)->StartServer(); - return this_pointer; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -int qServer::StartServer(){ -#ifdef VERYVERBOSE - cout << "In StartServer()" << endl; -#endif - int ret = qDefs::OK; - - try { - MySocketTCP* s = new MySocketTCP(port_no); - mySocket = s; - } catch(...) { - gui_server_thread_running = 0; - qDefs::Message(qDefs::WARNING,"Could not start gui server socket","qServer::StartServer"); - } - checkStarted = 0; - - while ((gui_server_thread_running) && (ret!=GOODBYE)) { -#ifdef VERBOSE - cout<< endl; -#endif -#ifdef VERYVERBOSE - cout << "Waiting for client call" << endl; -#endif - if(mySocket->Connect()>=0){ -#ifdef VERYVERBOSE - cout << "Conenction accepted" << endl; -#endif - ret = DecodeFunction(mySocket); -#ifdef VERYVERBOSE - cout << "function executed" << endl; -#endif - mySocket->Disconnect(); -#ifdef VERYVERBOSE - cout << "connection closed" << endl; -#endif - } - } -#ifdef VERBOSE - cout << "Stopped gui server thread" << endl; -#endif - gui_server_thread_running = 0; - //delete socket(via exit server) - if(mySocket){ - delete mySocket; - mySocket = 0; - } - - if(!gui_server_thread_running) - emit ServerStoppedSignal(); - - return qDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qServer::GetStatus(){ - - int ret = qDefs::OK; - enum slsDetectorDefs::runStatus retval; - int progress = 0; - - // execute action if the arguments correctly arrived - if(myMainTab->isPlotRunning()) - retval = slsDetectorDefs::RUNNING; - else - retval = slsDetectorDefs::IDLE; - - progress = myMainTab->GetProgress(); - - // send answer - myStopSocket->SendDataOnly(&ret,sizeof(ret)); - myStopSocket->SendDataOnly(&retval,sizeof(retval)); - myStopSocket->SendDataOnly(&progress,sizeof(progress)); - //return ok/fail - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - -int qServer::StartAcquisition(){ - - strcpy(mess,"Could not start acquisition in gui. \n"); - - int ret = myMainTab->StartStopAcquisitionFromClient(true); - mySocket->SendDataOnly(&ret,sizeof(ret)); - if(ret==FAIL) - mySocket->SendDataOnly(mess,sizeof(mess)); - - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - -int qServer::StopsAcquisition(){ - - strcpy(mess,"Could not stop acquisition in gui. \n"); - - int ret = myMainTab->StartStopAcquisitionFromClient(false); - myStopSocket->SendDataOnly(&ret,sizeof(ret)); - if(ret==FAIL) - myStopSocket->SendDataOnly(mess,sizeof(mess)); - - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - - -int qServer::Acquire(){ - - strcpy(mess,"Could not start blocking acquisition in gui. \n"); - - int ret = myMainTab->StartStopAcquisitionFromClient(true); - - usleep(5000); - while(myMainTab->isPlotRunning()); - - mySocket->SendDataOnly(&ret,sizeof(ret)); - if(ret==FAIL) - mySocket->SendDataOnly(mess,sizeof(mess)); - - return ret; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------ - diff --git a/slsDetectorGui/src/qTabActions.cpp b/slsDetectorGui/src/qTabActions.cpp deleted file mode 100644 index 37a8f7693..000000000 --- a/slsDetectorGui/src/qTabActions.cpp +++ /dev/null @@ -1,585 +0,0 @@ -/* - * qTabActions.cpp - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ -// Qt Project Class Headers -#include "qTabActions.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -// Qt Include Headers -#include -// C++ Include Headers -#include -using namespace std; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabActions::qTabActions(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent),myDet(detector), - positionWidget(0), - lblNumPos(0), - lblPosList(0), - spinNumPos(0), - comboPos(0), - btnDelete(0), - chkInvert(0), - chkSeparate(0), - chkReturn(0), - positions(0), - iconPlus(0), - iconMinus(0){ - for(int i=0;i<6;i++) - actionWidget[i]=0; - for(int i=0;i<2;i++) - scanWidget[i]=0; - for(int i=0;isetWidget(this); - scroll->setWidgetResizable(true); - - // Layout Settings - gridLayout = new QGridLayout(scroll); - setLayout(gridLayout); - gridLayout->setContentsMargins(10,5,0,0); - gridLayout->setVerticalSpacing(2); - - // Buttongroup to know which +/- button was clicked - group = new QButtonGroup(this); - group->setExclusive(false); - palette = new QPalette(); - - QPalette p; - p.setColor(QPalette::Shadow,QColor(0,0,0,0)); - p.setColor(QPalette::Button,QColor(0,0,0,0)); -/*get rid of this vector*/ - char names[NumTotalActions][200] = { - "Action at Start", - "Scan Level 0", - "Scan Level 1", - "Action before each Frame", - "Positions", - "Header before Frame", - "Header after Frame", - "Action after each Frame", - "Action at Stop" - }; - - //creating the icons for the buttons - iconPlus = new QIcon(":/icons/images/add.png"); - iconMinus = new QIcon(":/icons/images/remove.png"); - - QString tip = "Click on the \"+\" to Expand or \"-\" to Collapse."; - - - - int hIndent=0, vIndent=0, colspan=6, posVal=0; - QLabel *lblReal; - // For each level of Actions - for(int i=0;isetToolTip(tip); - btnExpand[i]->setCheckable(true); - btnExpand[i]->setChecked(false); - btnExpand[i]->setFixedSize(16,16); - btnExpand[i]->setToolTip(tip); - btnExpand[i]->setIcon(*iconPlus); - btnExpand[i]->setFocusPolicy(Qt::NoFocus); - btnExpand[i]->setFlat(true); - btnExpand[i]->setIconSize(QSize(16,16)); - btnExpand[i]->setPalette(p); - group->addButton(btnExpand[i],i); - - - //add label and button to expand or collapse - gridLayout->addWidget(btnExpand[i],vIndent,hIndent,1,1); - gridLayout->addWidget(lblName[i],vIndent,hIndent+1,1,colspan); - - //creating the action/scan/position widgets and adding them - switch(i){ - case NumPositions: - CreatePositionsWidget(); - gridLayout->addWidget(positionWidget,vIndent+1,hIndent+1,1,colspan); - positionWidget->hide(); - break; - case Scan0: - case Scan1: - posVal = qScanWidget::NUM_SCAN_WIDGETS; - scanWidget[posVal] = new qScanWidget(this,myDet); - gridLayout->addWidget(scanWidget[posVal],vIndent+1,hIndent+1,1,colspan); - scanWidget[posVal]->hide(); - break; - default: - posVal = qActionsWidget::NUM_ACTION_WIDGETS; - actionWidget[posVal] = new qActionsWidget(this,myDet); - gridLayout->addWidget(actionWidget[posVal],vIndent+1,hIndent+1,1,colspan); - actionWidget[posVal]->hide(); - break; - } - - //incrementing the vertical and horizontal indent - vIndent+=2; - switch(i){ - case HeaderBefore: - //real time acquisition - palette->setColor(QPalette::Active,QPalette::WindowText,QColor(0,0,200,255)); - lblReal = new QLabel(" Real Time Acquisition"); - lblReal->setFixedHeight(25); - //lblReal->setPalette(*palette); - gridLayout->addWidget(lblReal,vIndent,hIndent+1,1,colspan); - vIndent++; - break; - case HeaderAfter: - hIndent-=2; - colspan+=2; - break; - case ActionAfter: - hIndent=0; - colspan=6; - break; - default: - hIndent++; - colspan--; - break; - } - - } - - - //Number of positions is only for mythen or gotthard - detType = myDet->getDetectorsType(); - if((detType == slsDetectorDefs::EIGER) || - (detType == slsDetectorDefs::AGIPD) || - (detType == slsDetectorDefs::PROPIX) || - (detType == slsDetectorDefs::JUNGFRAU) || - (detType == slsDetectorDefs::JUNGFRAUCTB) || - (detType == slsDetectorDefs::MOENCH)) { - lblName[NumPositions]->setEnabled(false); - btnExpand[NumPositions]->setEnabled(false); - }else{ - //disable positions if angular conversion is enabled - int ang; - if(!myDet->getAngularConversion(ang)){ - lblName[NumPositions]->setEnabled(false); - btnExpand[NumPositions]->setEnabled(false); - } - - } - - //load positions - if(lblName[NumPositions]->isEnabled()){ - //delete existing positions - if (positions) {delete [] positions; positions = NULL;} - //get number of positions - int numPos=myDet->getPositions(); - comboPos->setMaxCount(numPos); - - //set the number of positions in the gui - spinNumPos->setValue(numPos); - - positions=new double[numPos]; - //load the positions - myDet->getPositions(positions); - - //delete the combolist and reload it - comboPos->setEnabled(numPos); - lblPosList->setEnabled(numPos); - btnDelete->setEnabled(numPos); - lblPosList->setText("List of Positions: "); - lblPosList->setPalette(normal); - for(int i=0;icount();i++) comboPos->removeItem(i); - for(int i=0;iinsertItem(i,QString("%1").arg(positions[i])); - } - - - qDefs::checkErrorMessage(myDet,"qTabActions::SetupWidgetWindow"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabActions::CreatePositionsWidget(){ - positionWidget = new QWidget; - positionWidget->setFixedHeight(25); - positionWidget->setFixedWidth(680); - - QGridLayout *layout = new QGridLayout(positionWidget); - layout->setContentsMargins(0,0,0,0); - layout->setHorizontalSpacing(0); - layout->setVerticalSpacing(5); - - lblNumPos = new QLabel("Number of Positions: "); - lblNumPos->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - layout->addWidget(lblNumPos,0,0); - layout->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - spinNumPos = new QSpinBox(this); - layout->addWidget(spinNumPos,0,2); - layout->addItem(new QSpacerItem(80,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,3); - lblPosList = new QLabel("List of Positions: "); - lblPosList->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - lblPosList->setFixedWidth(108); - lblPosList->setEnabled(false); - lblPosList->setToolTip("Enter the positions at which the detector should be moved.
" - "Number of entries is restricted to Number of Positions field."); - layout->addWidget(lblPosList,0,4); - comboPos = new QComboBox(this); - comboPos->setEditable(true); -// comboPos->setCompleter(false); - comboPos->setCompleter(NULL); - normal = comboPos->palette(); - comboPos->setEnabled(false); - QDoubleValidator *validate = new QDoubleValidator(comboPos); - comboPos->setValidator(validate); - layout->addWidget(comboPos,0,5); - layout->addItem(new QSpacerItem(5,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,6); - btnDelete = new QPushButton("Delete "); - btnDelete->setEnabled(false); - btnDelete->setIcon(QIcon( ":/icons/images/close.png" )); - btnDelete->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - layout->addWidget(btnDelete,0,7); - - //might be included at some point -/* QGroupBox *w = new QGroupBox; - layout->addWidget(w,1,0,1,9); - QHBoxLayout *l1 = new QHBoxLayout(w); - l1->setContentsMargins(0,0,0,0); - l1->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - chkInvert = new QCheckBox("Invert Angles"); - l1->addWidget(chkInvert); - chkSeparate = new QCheckBox("Separate Two Halves"); - l1->addWidget(chkSeparate); - chkReturn = new QCheckBox("Return to Start Position"); - chkReturn->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - l1->addWidget(chkReturn); - l1->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed)); - w->setLayout(l1);*/ - - positionWidget->setLayout(layout); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabActions::Initialization(){ - //expand - connect(group, SIGNAL(buttonClicked(QAbstractButton*)), this,SLOT(Expand(QAbstractButton*))); - //enable scan box in plot tab - for(int i=0;iid(button); - - // Collapse - if(!button->isChecked()){ - palette->setColor(QPalette::Active,QPalette::WindowText,Qt::black); - - - lblName[index]->setPalette(*palette); - button->setIcon(*iconPlus); - - if(index==NumPositions) { - positionWidget->hide(); - setFixedHeight(height()-30);//-80 if the checkboxes are included - if(myDet->getPositions()) { - palette->setColor(QPalette::Active,QPalette::WindowText,Qt::darkGreen); - lblName[index]->setPalette(*palette); - } - } - else if((index==Scan0)||(index==Scan1)) { - scanWidget[GetActualIndex(index)]->hide(); - setFixedHeight(height()-130); - if(myDet->getScanMode(GetActualIndex(index))){ - palette->setColor(QPalette::Active,QPalette::WindowText,Qt::darkGreen); - lblName[index]->setPalette(*palette); - } - } - else { - actionWidget[GetActualIndex(index)]->hide(); - setFixedHeight(height()-30); - if(myDet->getActionMode(GetActualIndex(index))){ - palette->setColor(QPalette::Active,QPalette::WindowText,Qt::darkGreen); - lblName[index]->setPalette(*palette); - } - } - }else{ - // Expand - //always set title color to blue for expan\d - - palette->setColor(QPalette::Active,QPalette::WindowText,QColor(0,0,200,255)); - - - lblName[index]->setPalette(*palette); - button->setIcon(*iconMinus); - - if(index==NumPositions){ - positionWidget->show(); - setFixedHeight(height()+30);//+80 if the checkboxes are included - } - else if((index==Scan0)||(index==Scan1)){ - scanWidget[GetActualIndex(index)]->show(); - setFixedHeight(height()+130); - } - else{ - actionWidget[GetActualIndex(index)]->show(); - setFixedHeight(height()+30); - } - } - - qDefs::checkErrorMessage(myDet,"qTabActions::Expand"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabActions::SetPosition(){ -#ifdef VERBOSE - cout << "Entering SetPosition\tnum Pos:" << spinNumPos->value() << "\tlist count:" << comboPos->count() << endl; -#endif - //get number of positions - int numPos = spinNumPos->value(); - comboPos->setMaxCount(numPos); - comboPos->setEnabled(numPos); - lblPosList->setEnabled(numPos); - btnDelete->setEnabled(numPos); - - //deleting too many or not entering enough - if(numPos>comboPos->count()){ - - QPalette red = QPalette(); - red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); - lblPosList->setPalette(red); - QString tip = QString("Enter the positions at which the detector should be moved.
" - "Number of entries is restricted to Number of Positions field.

")+ - QString("Add ")+ - (QString("%1").arg(((numPos)-(comboPos->count()))))+ - QString(" more positions to the list to match Number of Positions.
" - "Or reduce Number of Positions.
"); - lblPosList->setToolTip(tip); - lblPosList->setText("List of Positions:*"); - }else{ - lblPosList->setText("List of Positions: "); - lblPosList->setPalette(normal); - lblPosList->setToolTip("Enter the positions at which the detector should be moved.
" - "Number of entries is restricted to Number of Positions field."); - } - - //delete existing positions - if (positions) {delete [] positions; positions = NULL;} - positions=new double[comboPos->count()]; - //copying the list - for(int i=0;icount();i++) - positions[i] = comboPos->itemText(i).toDouble(); - //setting the list and catching error - if(myDet->setPositions(comboPos->count(),positions)!=comboPos->count()) - qDefs::Message(qDefs::WARNING,"The positions list was not set for some reason.","qTabActions::SetPosition"); - - - qDefs::checkErrorMessage(myDet,"qTabActions::SetPosition"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabActions::DeletePosition(){ - QString pos = comboPos->currentText(); - bool found = false; - //loops through to find the index and to make sure its in the list - for(int i=0;icount();i++){ - if(!comboPos->itemText(i).compare(pos)){ - found = true; - comboPos->removeItem(i); - break; - } - } - if(found){ -#ifdef VERBOSE - cout << "Deleting Position " << endl; -#endif - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabActions::EnablePositions(bool enable){ -#ifdef VERBOSE - cout << "Enable Positions: " << enable << endl; -#endif - if(enable){ - lblName[NumPositions]->setEnabled(true); - btnExpand[NumPositions]->setEnabled(true); - }else{ - //deletes all positions - for(int i=0;icount();i++) - comboPos->removeItem(i); - cout<<"Number of Positions set to :"<getPositions()<isChecked()){ - disconnect(group, SIGNAL(buttonClicked(QAbstractButton*)), this,SLOT(Expand(QAbstractButton*))); - btnExpand[NumPositions]->setChecked(false); - connect(group, SIGNAL(buttonClicked(QAbstractButton*)), this,SLOT(Expand(QAbstractButton*))); - Expand(group->button(NumPositions)); - } - lblName[NumPositions]->setEnabled(false); - btnExpand[NumPositions]->setEnabled(false); - } - - qDefs::checkErrorMessage(myDet,"qTabActions::EnablePositions"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabActions::Refresh(){ -#ifdef VERBOSE - cout << endl <<"**Updating all action widgets: " << endl; -#endif - if((detType == slsDetectorDefs::MYTHEN) || (detType == slsDetectorDefs::GOTTHARD)){ - //positions is enabled only if angular conversion is enabled - int ang; if(!myDet->getAngularConversion(ang)) EnablePositions(false); - - if(lblName[NumPositions]->isEnabled()){ - //delete existing positions - if (positions) {delete [] positions; positions = NULL;} - //get number of positions - int numPos=myDet->getPositions(); - comboPos->setMaxCount(numPos); - - //set the number of positions in the gui - disconnect(spinNumPos, SIGNAL(valueChanged(int)), this, SLOT(SetPosition())); - spinNumPos->setValue(numPos); - connect(spinNumPos, SIGNAL(valueChanged(int)), this, SLOT(SetPosition())); - - positions=new double[numPos]; - //load the positions - myDet->getPositions(positions); - - //delete the combolist and reload it - disconnect(comboPos,SIGNAL(currentIndexChanged(int)), this, SLOT(SetPosition())); - comboPos->setEnabled(numPos); - lblPosList->setEnabled(numPos); - btnDelete->setEnabled(numPos); - lblPosList->setText("List of Positions: "); - lblPosList->setPalette(normal); - for(int i=0;icount();i++) - comboPos->removeItem(i); - for(int i=0;iinsertItem(i,QString("%1").arg(positions[i])); - connect(comboPos, SIGNAL(currentIndexChanged(int)), this, SLOT(SetPosition())); - - -#ifdef VERBOSE - cout << "Updated position widget\tnum:" << numPos << "\t***" << endl; -#endif - } - } - for(int i=0;iRefresh(); - for(int i=0;iRefresh(); - UpdateCollapseColors(); -#ifdef VERBOSE - cout << "**Updated all action widgets: " << endl << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qTabActions::Refresh"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qTabActions::GetActualIndex(int index){ - switch(index){ - case 0: return slsDetectorDefs::startScript; - case Scan0: return 0; - case Scan1: return 1; - case 3: return slsDetectorDefs::scriptBefore; - case 5: return slsDetectorDefs::headerBefore; - case 6: return slsDetectorDefs::headerAfter; - case 7: return slsDetectorDefs::scriptAfter; - case 8: return slsDetectorDefs::stopScript; - default: return -1; - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabActions::UpdateCollapseColors(){ -#ifdef VERYVERBOSE - cout << "Updating Collapse Colors" << endl; -#endif - for(int i=0;igetPositions()) palette->setColor(QPalette::Active,QPalette::WindowText,Qt::darkGreen); - else palette->setColor(QPalette::Active,QPalette::WindowText,Qt::black); - lblName[i]->setPalette(*palette); - } - //scans - else if((i==Scan0)||(i==Scan1)){ - if(myDet->getScanMode(GetActualIndex(i))) palette->setColor(QPalette::Active,QPalette::WindowText,Qt::darkGreen); - else palette->setColor(QPalette::Active,QPalette::WindowText,Qt::black); - lblName[i]->setPalette(*palette); - } - //actions - else{ - if(myDet->getActionMode(GetActualIndex(i))) palette->setColor(QPalette::Active,QPalette::WindowText,Qt::darkGreen); - else palette->setColor(QPalette::Active,QPalette::WindowText,Qt::black); - lblName[i]->setPalette(*palette); - } - } - -} -//------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorGui/src/qTabAdvanced.cpp b/slsDetectorGui/src/qTabAdvanced.cpp deleted file mode 100644 index 616d2ed4d..000000000 --- a/slsDetectorGui/src/qTabAdvanced.cpp +++ /dev/null @@ -1,1631 +0,0 @@ -/* - * qTabAdvanced.cpp - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ -#include "qTabAdvanced.h" -#include "qDrawPlot.h" -/** Project Class Headers */ -#include "slsDetector.h" -#include "multiSlsDetector.h" -/** Qt Include Headers */ -#include -/** C++ Include Headers */ -#include -using namespace std; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabAdvanced::qTabAdvanced(QWidget *parent,multiSlsDetector*& detector, qDrawPlot*& plot): - QWidget(parent),myDet(detector),det(0),myPlot(plot),btnGroup(NULL),isEnergy(false),isAngular(false), - lblFromX(0), - spinFromX(0), - lblFromY(0), - spinFromY(0), - lblToX(0), - spinToX(0), - lblToY(0), - spinToY(0), - numRois(0){ - setupUi(this); - SetupWidgetWindow(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -qTabAdvanced::~qTabAdvanced(){ - delete myDet; - if(det) delete det; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetupWidgetWindow(){ - -//executed even for non digital, so make sure its necessary - - //Network - lblIP->setEnabled(false); - lblMAC->setEnabled(false); - dispIP->setEnabled(false); - dispMAC->setEnabled(false); - boxRxr->setEnabled(false); - boxSetAllTrimbits->setEnabled(false); - - - red = QPalette(); - red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); - outputDirTip = dispFile->toolTip(); - errOutputTip = QString("

" - "Output Trim File should contain both existing directory and a file name.
" - "The extensions are automatically added.

" - "Enter valid Output Trim File to enable Start Trimming button.
"); - detOnlineTip = comboOnline->toolTip(); - rxrOnlineTip = comboRxrOnline->toolTip(); - errOnlineTip = QString("

It is offline!"); - - acqSubPeriodTip = spinSubPeriod->toolTip(); - errSubPeriodTip = acqSubPeriodTip + - QString("

Sub Frame Period " - "should be greater than or equal to " - "Sub Frame Exposure Time.
"); - - - - detType = myDet->getDetectorsType(); - switch(detType){ - case slsDetectorDefs::MYTHEN: - isEnergy = true; - isAngular = true; - spinZmqPort->setEnabled(false); - spinZmqPort2->setEnabled(false); - dispZMQIP->setEnabled(false); - dispZMQIP2->setEnabled(false); - break; - case slsDetectorDefs::EIGER: - isEnergy = true; - isAngular = false; - lblIP->setEnabled(true); - lblMAC->setEnabled(true); - dispIP->setEnabled(true); - dispMAC->setEnabled(true); - boxRxr->setEnabled(true); - boxSetAllTrimbits->setEnabled(true); - lblSubExpTime->setEnabled(true); - spinSubExpTime->setEnabled(true); - comboSubExpTimeUnit->setEnabled(true); - lblSubPeriod->setEnabled(true); - spinSubPeriod->setEnabled(true); - comboSubPeriodUnit->setEnabled(true); - break; - case slsDetectorDefs::MOENCH: - isEnergy = false; - isAngular = false; - lblIP->setEnabled(true); - lblMAC->setEnabled(true); - dispIP->setEnabled(true); - dispMAC->setEnabled(true); - boxRxr->setEnabled(true); - break; - case slsDetectorDefs::GOTTHARD: - isEnergy = false; - isAngular = true; - lblIP->setEnabled(true); - lblMAC->setEnabled(true); - dispIP->setEnabled(true); - dispMAC->setEnabled(true); - boxRxr->setEnabled(true); - break; - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - isEnergy = false; - isAngular = false; - lblIP->setEnabled(true); - lblMAC->setEnabled(true); - dispIP->setEnabled(true); - dispMAC->setEnabled(true); - boxRxr->setEnabled(true); - break; - default: break; - } - - - //logs and trimming - if(!isAngular && !isEnergy) boxLogs->setEnabled(false); - else{ - if(!isAngular) chkAngularLog->setEnabled(false); - if(!isEnergy){ - chkEnergyLog->setEnabled(false); - boxPlot->setEnabled(false); - boxTrimming->setEnabled(false); - }else{ - boxTrimming->setChecked(false); - SetOptimize(false); - - btnGroup = new QButtonGroup(this); - btnGroup->addButton(btnRefresh,0); - btnGroup->addButton(btnGetTrimbits,1); - } - } - trimmingMode = slsDetectorDefs::NOISE_TRIMMING; - - //network - - //add detectors - for(int i=0;igetNumberOfDetectors();i++) - comboDetector->addItem(QString(myDet->getHostname(i).c_str())); - - comboDetector->setCurrentIndex(0); - - det = myDet->getSlsDetector(comboDetector->currentIndex()); - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetupWidgetWindow"); - cout << "Getting ports" << endl; - spinControlPort->setValue(det->getControlPort()); - spinStopPort->setValue(det->getStopPort()); - spinTCPPort->setValue(det->getReceiverPort()); - spinUDPPort->setValue(atoi(det->getReceiverUDPPort().c_str())); - spinZmqPort->setValue(atoi(det->getClientStreamingPort().c_str())); - spinZmqPort2->setValue(atoi(det->getReceiverStreamingPort().c_str())); - - cout << "Getting network information" << endl; - dispIP->setText(det->getDetectorIP().c_str()); - dispMAC->setText(det->getDetectorMAC().c_str()); - dispRxrHostname->setText(det->getReceiver().c_str()); - dispUDPIP->setText(det->getReceiverUDPIP().c_str()); - dispUDPMAC->setText(det->getReceiverUDPMAC().c_str()); - dispZMQIP->setText(det->getClientStreamingIP().c_str()); - dispZMQIP2->setText(det->getReceiverStreamingIP().c_str()); - - //check if its online and set it to red if offline -#ifdef VERYVERBOSE - cout << "online" << endl; -#endif - if(det->setOnline()==slsDetectorDefs::ONLINE_FLAG) - det->checkOnline(); - if(det->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG) - det->checkReceiverOnline(); - comboOnline->setCurrentIndex(det->setOnline()); - comboRxrOnline->setCurrentIndex(det->setReceiverOnline()); - if(!comboOnline->currentIndex()){ - comboOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setPalette(red); - lblOnline->setText("Online:*"); - } - if((comboRxrOnline->isEnabled())&&(!comboRxrOnline->currentIndex())){ - comboRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setPalette(red); - lblRxrOnline->setText("Online:*"); - } - - - //updates roi - cout << "Getting ROI" << endl; - if (detType == slsDetectorDefs::GOTTHARD) - updateROIList(); -#ifdef VERYVERBOSE - // print receiver configurations - if(detType != slsDetectorDefs::MYTHEN){ - cout << endl; - myDet->printReceiverConfiguration(); - } -#endif - - // jungfrau - if (detType == slsReceiverDefs::JUNGFRAU) { - lblNumStoragecells->setEnabled(true); - spinNumStoragecells->setEnabled(true); - spinNumStoragecells->setValue((int)myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER,-1)); - } else if (detType == slsDetectorDefs::EIGER) { - //subexptime - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::SUBFRAME_ACQUISITION_TIME,-1)*(1E-9)))); - spinSubExpTime->setValue(time); - comboSubExpTimeUnit->setCurrentIndex((int)unit); - //period - time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::SUBFRAME_DEADTIME,-1)*(1E-9)))); - spinSubPeriod->setValue(time); - comboSubPeriodUnit->setCurrentIndex((int)unit); - - CheckAcqPeriodGreaterThanExp(); - } - - Initialization(); - - qDefs::checkErrorMessage(det,"qTabAdvanced::SetupWidgetWindow"); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::Initialization(){ - - connect(tabAdvancedSettings,SIGNAL(currentChanged(int)), this, SLOT(Refresh())); - - //energy/angular logs - if(isAngular) - connect(chkEnergyLog, SIGNAL(toggled(bool)), this, SLOT(SetLogs())); - - if(isEnergy){ - connect(chkAngularLog, SIGNAL(toggled(bool)), this, SLOT(SetLogs())); - - //exptime - connect(spinExpTime, SIGNAL(valueChanged(double)), this, SLOT(SetExposureTime())); - connect(comboExpUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetExposureTime())); - - //threshold dac - connect(spinThreshold, SIGNAL(valueChanged(double)), this, SLOT(SetThreshold())); - - //output directory - connect(dispFile, SIGNAL(editingFinished()), this, SLOT(SetOutputFile())); - connect(btnFile, SIGNAL(clicked()), this, SLOT(BrowseOutputFile())); - - //setalltrimbits - if(boxSetAllTrimbits->isEnabled()) - connect(spinSetAllTrimbits, SIGNAL(editingFinished()), this, SLOT(SetAllTrimbits())); - - //enable trimming method group box - connect(boxTrimming, SIGNAL(toggled(bool)), this, SLOT(EnableTrimming(bool))); - - //trimming method combo - connect(comboMethod, SIGNAL(currentIndexChanged(int)), this, SLOT(SetTrimmingMethod(int))); - - //method options - connect(chkOptimize, SIGNAL(toggled(bool)), this, SLOT(SetOptimize(bool))); - - //start Trimming - connect(btnStart, SIGNAL(clicked()), this, SLOT(StartTrimming())); - - //refresh - connect(btnGroup, SIGNAL(buttonClicked(int)), this, SLOT(UpdateTrimbitPlot(int))); - } - - //network - connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(SetDetector(int))); - connect(spinControlPort, SIGNAL(valueChanged(int)), this, SLOT(SetControlPort(int))); - connect(spinStopPort, SIGNAL(valueChanged(int)), this, SLOT(SetStopPort(int))); - connect(comboOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetOnline(int))); - - if(detType!=slsDetectorDefs::MYTHEN){ - - //network - connect(spinTCPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrTCPPort(int))); - connect(spinUDPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrUDPPort(int))); - connect(spinZmqPort, SIGNAL(valueChanged(int)), this, SLOT(SetCltZmqPort(int))); - connect(spinZmqPort2, SIGNAL(valueChanged(int)), this, SLOT(SetRxrZmqPort(int))); - connect(comboRxrOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetReceiverOnline(int))); - - connect(dispIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispUDPIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispUDPMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - - connect(dispZMQIP, SIGNAL(editingFinished()), this, SLOT(SetClientZMQIP())); - connect(dispZMQIP2, SIGNAL(editingFinished()), this, SLOT(SetReceiverZMQIP())); - - connect(btnRxr, SIGNAL(clicked()), this, SLOT(SetReceiver())); - } - - - //roi - - if (detType == slsDetectorDefs::GOTTHARD) { - connect(btnClearRoi, SIGNAL(clicked()), this, SLOT(clearROIinDetector())); - connect(btnGetRoi, SIGNAL(clicked()), this, SLOT(updateROIList())); - connect(btnSetRoi, SIGNAL(clicked()), this, SLOT(setROI())); - } - - if(detType == slsReceiverDefs::JUNGFRAU) { - connect(spinNumStoragecells, SIGNAL(valueChanged(int)), this, SLOT(SetNumStoragecells(int))); - } else if (detType == slsDetectorDefs::EIGER) { - //Exposure Time - connect(spinSubExpTime,SIGNAL(valueChanged(double)), this, SLOT(SetSubExposureTime())); - connect(comboSubExpTimeUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetSubExposureTime())); - //Frame Period between exposures - connect(spinSubPeriod,SIGNAL(valueChanged(double)), this, SLOT(SetSubPeriod())); - connect(comboSubPeriodUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubPeriod())); - - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetLogs(){ - QCheckBox *checkedBox = qobject_cast(sender()); - int index = ((!checkedBox->text().compare("Energy Calibration"))?slsDetectorDefs::enCalLog:slsDetectorDefs::angCalLog); - bool enable = checkedBox->isChecked(); -#ifdef VERBOSE - if(index==slsDetectorDefs::enCalLog) - cout << "Setting Energy Calibration Logs to " << enable << endl; - else - cout << "Setting Angular Calibration Logs to " << enable << endl; -#endif - //set/unset the log - myDet->setAction(index,(enable?"set":"none")); - //verify - if(myDet->getActionMode(index)!=(enable)){ -#ifdef VERBOSE - cout << "Could not set/reset Log." << endl; -#endif - qDefs::Message(qDefs::WARNING,"Could not set/reset Log.","qTabAdvanced::SetLogs"); - checkedBox->setChecked(!enable); - } - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetLogs"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetExposureTime(){ - //Get the value of timer in ns - double exptimeNS = qDefs::getNSTime((qDefs::timeUnit)comboExpUnit->currentIndex(),spinExpTime->value()); -#ifdef VERBOSE - cout << "Setting Exposure Time to " << exptimeNS << " clocks" << "/" << spinExpTime->value() << qDefs::getUnitString((qDefs::timeUnit)comboExpUnit->currentIndex()) << endl; -#endif - myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,(int64_t)exptimeNS); - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetExposureTime"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetThreshold(){ -#ifdef VERBOSE - cout << "Setting Threshold DACu:" << spinThreshold->value() << endl; -#endif - spinThreshold->setValue((double)myDet->setDAC((dacs_t)spinThreshold->value(),slsDetectorDefs::THRESHOLD,0)); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetThreshold"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetOutputFile(){ -#ifdef VERBOSE - cout << "Setting Output File for Trimming:" << endl; -#endif - QString dirPath = dispFile->text().section('/',0,-2,QString::SectionIncludeLeadingSep); - cout << "Directory:" << dirPath.toAscii().constData() << "." << endl; - QString fName = dispFile->text().section('/',-1); - cout << "File Name:" << fName.toAscii().constData() << "." << endl; - //checks if directory exists and file name is not empty - if((QFile::exists(dirPath))&&(!fName.isEmpty())){ - - dispFile->setToolTip(outputDirTip); - lblFile->setToolTip(outputDirTip); - lblFile->setPalette(lblExpTime->palette()); - lblFile->setText("Output Trim File: "); - btnStart->setEnabled(true); - - - //check if you're overwriting original trimsettings - QDir dir; - //gets the clean absolute path - dirPath = dir.absoluteFilePath(dirPath); - dirPath = dir.cleanPath(dirPath); - QString trimdir = QString::fromStdString(myDet->getSettingsFile()).section('/',0,-2,QString::SectionIncludeLeadingSep); - trimdir = dir.absoluteFilePath(trimdir); - trimdir = dir.cleanPath(trimdir); - if(!dirPath.compare(trimdir)){ - int ret = qDefs::Message(qDefs::QUESTION,string("This will possibly overwrite your original trimbits.
" - "Proposed file path:") + string(dirPath.toAscii().constData())+ - string("
Do you still want to continue?"),"qTabAdvanced::SetOutputFile"); - if(ret==qDefs::FAIL){ - dispFile->setText(""); - dispFile->setToolTip(outputDirTip + errOutputTip); - lblFile->setToolTip(outputDirTip + errOutputTip); - lblFile->setPalette(red); - lblFile->setText("Output Trim File:*"); - btnStart->setEnabled(false); - } - } - - }//if the directory doesnt exist or if file name is empty - else{ - cout<<"Invalid Trimming output File"<setToolTip(outputDirTip + errOutputTip); - lblFile->setToolTip(outputDirTip + errOutputTip); - lblFile->setPalette(red); - lblFile->setText("Output Trim File:*"); - btnStart->setEnabled(false); - } - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetOutputFile"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::BrowseOutputFile(){ -#ifdef VERBOSE - cout << "Browsing Output Dir for Trimming" << endl; -#endif - QString fName = dispFile->text(); - //dialog - QFileDialog *fileDialog = new QFileDialog(this, - tr("Save Trimbits"),fName, - tr("Trimbit files (*.trim noise.sn*);;All Files(*) ")); - fileDialog->setFileMode(QFileDialog::AnyFile ); - if ( fileDialog->exec() == QDialog::Accepted ) - fName = fileDialog->selectedFiles()[0]; - - //if empty, set the file name and it calls SetFileSteps, else ignore - if (!fName.isEmpty()){ - dispFile->setText(fName); - SetOutputFile(); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::EnableTrimming(bool enable){ -#ifdef VERBOSE - cout << "Enable Trimming set to:" << enable << endl; -#endif - if(enable){ - //show error label if invalid output dir - SetOutputFile(); - SetTrimmingMethod(comboMethod->currentIndex()); - }else{ - //error label shouldnt show when disabled - dispFile->setToolTip(outputDirTip); - lblFile->setToolTip(outputDirTip); - lblFile->setPalette(lblExpTime->palette()); - lblFile->setText("Output Trim File: "); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- -void qTabAdvanced::SetOptimize(bool enable){ -#ifdef VERBOSE - cout << "Setting Optimize to:" << enable << endl; -#endif - //trimming method is adjust to count - if(!comboMethod->currentIndex()){ - lblCounts->setEnabled(true); - spinCounts->setEnabled(true); - lblResolution->setEnabled(enable); - spinResolution->setEnabled(enable); - }//trimming method is equalize to median - else{ - lblCounts->setEnabled(false); - spinCounts->setEnabled(false); - lblResolution->setEnabled(true); - spinResolution->setEnabled(true); - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetTrimmingMethod(int mode){ -#ifdef VERBOSE - cout << "Setting Trimming method to :" << mode << endl; -#endif - //make sure the right resolution/Counts is enabled - SetOptimize(chkOptimize->isChecked()); - - //set mode - switch(mode){ - case 0: trimmingMode = slsDetectorDefs::NOISE_TRIMMING; break; - case 1: trimmingMode = slsDetectorDefs::IMPROVE_TRIMMING; break; - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qTabAdvanced::validateBeforeTrimming(){ -#ifdef VERBOSE - cout << "Validating conditions before Trimming" << endl; -#endif - char temp[100]; - string message = "All conditions satisfied for Trimming.
"; - switch(detType){ - case slsDetectorDefs::MYTHEN: - - //dynamic range - if(myDet->setDynamicRange(-1) != TRIMMING_DYNAMIC_RANGE){ - sprintf(temp,"%d",TRIMMING_DYNAMIC_RANGE); - if(myDet->setDynamicRange(TRIMMING_DYNAMIC_RANGE) != TRIMMING_DYNAMIC_RANGE){ - qDefs::Message(qDefs::WARNING, - string("Trimming Pre-condition not satisfied:
" - "Could not set dynamic range to ") + string(temp)+string(".
" - "Trimming Aborted."),"qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::FAIL; - }else - message.append(string("Dynamic Range has been changed to ") + string(temp) + string(".
")); - } - //frames - if((int)myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,-1) != TRIMMING_FRAME_NUMBER){ - sprintf(temp,"%d",TRIMMING_FRAME_NUMBER); - if((int)myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,TRIMMING_FRAME_NUMBER) != TRIMMING_FRAME_NUMBER){ - qDefs::Message(qDefs::WARNING, - string("
Trimming Pre-condition not satisfied:
" - "Could not set Number of Frames to ") + string(temp)+string(".
" - "Trimming Aborted."),"qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::FAIL; - }else - message.append(string("Number of Frames has been changed to ") + string(temp) + string(".
")); - } - //trigger - if((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,-1) != TRIMMING_TRIGGER_NUMBER){ - sprintf(temp,"%d",TRIMMING_TRIGGER_NUMBER); - if((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,TRIMMING_TRIGGER_NUMBER) != TRIMMING_TRIGGER_NUMBER){ - qDefs::Message(qDefs::WARNING, - string("
Trimming Pre-condition not satisfied:
" - "Could not set Number of Triggers to ") + string(temp)+string(".
" - "Trimming Aborted."),"qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::FAIL; - }else - message.append(string("Number of Triggers has been changed to ") + string(temp) + string(".
")); - } - //probes - if((int)myDet->setTimer(slsDetectorDefs::PROBES_NUMBER,-1) != TRIMMING_PROBE_NUMBER){ - sprintf(temp,"%d",TRIMMING_PROBE_NUMBER); - if((int)myDet->setTimer(slsDetectorDefs::PROBES_NUMBER,TRIMMING_PROBE_NUMBER) != TRIMMING_PROBE_NUMBER){ - qDefs::Message(qDefs::WARNING, - string("
Trimming Pre-condition not satisfied:
" - "Could not set Number of Probes to ") + string(temp)+string(".
" - "Trimming Aborted."),"qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::FAIL; - }else - message.append(string("Number of Probes has been changed to ") + string(temp) + string(".
")); - } - //Setting - if(myDet->getSettings() == slsDetectorDefs::UNINITIALIZED){ - if(qDefs::Message(qDefs::QUESTION, - string("
Trimming Pre-condition not satisfied:
")+ - string("Settings cannot be Uninitialized to start Trimming.
" - "Change it to Standard and proceed?"),"qTabAdvanced::validateBeforeTrimming") == slsDetectorDefs::FAIL){ - qDefs::Message(qDefs::INFORMATION, - "Please change the Settings in the Settings tab to your choice.
" - "Aborting Trimming.","qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::FAIL; - } - //user asked to change settings to standard - else{ - if((int)myDet->setSettings(slsDetectorDefs::STANDARD) != slsDetectorDefs::STANDARD){ - qDefs::Message(qDefs::WARNING, - string("Trimming Pre-condition not satisfied:
" - "Could not change Settings to Standard
" - "Trimming Aborted."),"qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::FAIL; - }else - message.append(string("Settings has been changed to Standard.
")); - } - } - break; - default: - return slsDetectorDefs::FAIL; - - } - - message.append("
Initiating Trimming..."); - qDefs::Message(qDefs::INFORMATION,message,"qTabAdvanced::validateBeforeTrimming"); - return slsDetectorDefs::OK; - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::StartTrimming(){ - //check a few conditions before trimming - if(validateBeforeTrimming() == slsDetectorDefs::FAIL) - return; - -#ifdef VERBOSE - cout << "Starting Trimming" << endl; -#endif - int parameter1=0, parameter2=0; - //optimize - bool optimize = chkOptimize->isChecked(); - - //set the mode again and also set resolution, counts - switch(trimmingMode){ - - case slsDetectorDefs::NOISE_TRIMMING: - //define parameters - parameter1 = spinCounts->value(); - parameter2 = spinResolution->value(); - if(!optimize){ - parameter2 = -1; - trimmingMode = slsDetectorDefs::FIXEDSETTINGS_TRIMMING; -#ifdef VERBOSE - cout << "Trimming Mode: FIXEDSETTINGS_TRIMMING" << endl; -#endif - }else{ -#ifdef VERBOSE - cout << "Trimming Mode: NOISE_TRIMMING" << endl; -#endif - } - break; - - case slsDetectorDefs::IMPROVE_TRIMMING: -#ifdef VERBOSE - cout << "Trimming Mode: IMPROVE_TRIMMING" << endl; -#endif - //define parameters - parameter1 = spinResolution->value(); - parameter2 = 1; - if(!optimize) parameter2 = 0; - break; - default: - cout << "Should never come here. Start Trimming will have only 2 methods. Trimming Method:" << trimmingMode << endl; - return; - } - - //execute - int ret = myDet->executeTrimming(trimmingMode,parameter1,parameter2,-1); - - if((ret!=slsDetectorDefs::FAIL)&&(ret!=-1)); - else - qDefs::Message(qDefs::WARNING,"Atleast 1 channel could not be trimmed.","qTabAdvanced::StartTrimming"); - //save trim file - ret = myDet->saveSettingsFile(string(dispFile->text().toAscii().constData()),-1); - if((ret!=slsDetectorDefs::FAIL)&&(ret!=-1)){ - qDefs::Message(qDefs::INFORMATION,"The Trimbits have been saved successfully.","qTabAdvanced::StartTrimming"); - //updates plots - myPlot->UpdateTrimbitPlot(false,radioHistogram->isChecked()); - } - else qDefs::Message(qDefs::WARNING,string("Could not Save the Trimbits to file:\n")+dispFile->text().toAscii().constData(),"qTabAdvanced::StartTrimming"); - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::StartTrimming"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::UpdateTrimbitPlot(int id){ - if(boxPlot->isChecked()){ - //refresh - if(!id) myPlot->UpdateTrimbitPlot(false,radioHistogram->isChecked()); - //from detector - else myPlot->UpdateTrimbitPlot(true,radioHistogram->isChecked()); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetControlPort(int port){ -#ifdef VERBOSE - cout << "Setting Control Port:" << port << endl; -#endif - disconnect(spinControlPort, SIGNAL(valueChanged(int)), this, SLOT(SetControlPort(int))); - spinControlPort->setValue(det->setPort(slsDetectorDefs::CONTROL_PORT,port)); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetControlPort"); - connect(spinControlPort, SIGNAL(valueChanged(int)), this, SLOT(SetControlPort(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetStopPort(int port){ -#ifdef VERBOSE - cout << "Setting Stop Port:" << port << endl; -#endif - disconnect(spinStopPort, SIGNAL(valueChanged(int)), this, SLOT(SetStopPort(int))); - spinStopPort->setValue(det->setPort(slsDetectorDefs::STOP_PORT,port)); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetStopPort"); - connect(spinStopPort, SIGNAL(valueChanged(int)), this, SLOT(SetStopPort(int))); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetRxrTCPPort(int port){ -#ifdef VERBOSE - cout << "Setting Receiver TCP Port:" << port << endl; -#endif - disconnect(spinTCPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrTCPPort(int))); - spinTCPPort->setValue(det->setPort(slsDetectorDefs::DATA_PORT,port)); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetRxrTCPPort"); - connect(spinTCPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrTCPPort(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetRxrUDPPort(int port){ -#ifdef VERBOSE - cout << "Setting Receiver UDP Port:" << port << endl; -#endif - - disconnect(spinUDPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrUDPPort(int))); - spinUDPPort->setValue(det->setReceiverUDPPort(port)); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetRxrUDPPort"); - connect(spinUDPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrUDPPort(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetCltZmqPort(int port){ -#ifdef VERBOSE - cout << "Setting Client UDP Port:" << port << endl; -#endif - ostringstream ss; ss << port; string sport = ss.str(); - - disconnect(spinZmqPort, SIGNAL(valueChanged(int)), this, SLOT(SetCltZmqPort(int))); - spinZmqPort->setValue(atoi(det->setClientStreamingPort(sport).c_str())); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetCltZmqPort"); - myDet->enableDataStreamingToClient(false); - myDet->enableDataStreamingToClient(true); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetCltZmqPort"); - connect(spinZmqPort, SIGNAL(valueChanged(int)), this, SLOT(SetCltZmqPort(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetRxrZmqPort(int port){ -#ifdef VERBOSE - cout << "Setting Receiver UDP Port:" << port << endl; -#endif - ostringstream ss; ss << port; string sport = ss.str(); - - disconnect(spinZmqPort2, SIGNAL(valueChanged(int)), this, SLOT(SetRxrZmqPort(int))); - spinZmqPort2->setValue(atoi(det->setReceiverStreamingPort(sport).c_str())); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetRxrZmqPort"); - myDet->enableDataStreamingFromReceiver(false); - myDet->enableDataStreamingFromReceiver(true); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetRxrZmqPort"); - connect(spinZmqPort2, SIGNAL(valueChanged(int)), this, SLOT(SetRxrZmqPort(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetReceiverOnline(int index){ -#ifdef VERBOSE - cout << "Setting Reciever Online to :" << index << endl; -#endif - disconnect(comboRxrOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetReceiverOnline(int))); - if(index) - SetReceiver(); - else - comboRxrOnline->setCurrentIndex(det->setReceiverOnline(index)); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetReceiverOnline"); - connect(comboRxrOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetReceiverOnline(int))); - //highlight in red if offline - if(!comboRxrOnline->currentIndex()){ - comboRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setPalette(red); - lblRxrOnline->setText("Online:*"); - }else{ - comboRxrOnline->setToolTip(rxrOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip); - lblRxrOnline->setPalette(lblHostname->palette()); - lblRxrOnline->setText("Online:"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetOnline(int index){ -#ifdef VERBOSE - cout << "Setting Detector Online to " << index << endl; -#endif - disconnect(comboOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetOnline(int))); - comboOnline->setCurrentIndex(det->setOnline(index)); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetOnline"); - connect(comboOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetOnline(int))); - //highlight in red if offline - if(!comboOnline->currentIndex()){ - comboOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setPalette(red); - lblOnline->setText("Online:*"); - }else{ - comboOnline->setToolTip(detOnlineTip); - lblOnline->setToolTip(detOnlineTip); - lblOnline->setPalette(lblHostname->palette()); - lblOnline->setText("Online:"); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetNetworkParameters(){ -#ifdef VERBOSE - cout << "Setting Network Parametrs" << endl; -#endif - disconnect(dispIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(dispMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(dispUDPIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(dispUDPMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - - dispIP->setText(QString(det->setDetectorIP(dispIP->text().toAscii().constData()).c_str())); - dispMAC->setText(QString(det->setDetectorMAC(dispMAC->text().toAscii().constData()).c_str())); - dispUDPIP->setText(QString(det->setReceiverUDPIP(dispUDPIP->text().toAscii().constData()).c_str())); - dispUDPMAC->setText(QString(det->setReceiverUDPMAC(dispUDPMAC->text().toAscii().constData()).c_str())); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetNetworkParameters"); - - connect(dispIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispUDPIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispUDPMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetClientZMQIP(){ -#ifdef VERBOSE - cout << "Setting Client ZMQ IP" << endl; -#endif - disconnect(dispZMQIP, SIGNAL(editingFinished()), this, SLOT(SetClientZMQIP())); - - dispZMQIP->setText(QString(det->setClientStreamingIP(dispZMQIP->text().toAscii().constData()).c_str())); - myDet->enableDataStreamingToClient(false); - myDet->enableDataStreamingToClient(true); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetClientZMQIP"); - - connect(dispZMQIP, SIGNAL(editingFinished()), this, SLOT(SetClientZMQIP())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetReceiverZMQIP(){ -#ifdef VERBOSE - cout << "Setting Receiver ZMQ IP" << endl; -#endif - disconnect(dispZMQIP2, SIGNAL(editingFinished()), this, SLOT(SetReceiverZMQIP())); - - dispZMQIP2->setText(QString(det->setReceiverStreamingIP(dispZMQIP2->text().toAscii().constData()).c_str())); - myDet->enableDataStreamingFromReceiver(false); - myDet->enableDataStreamingFromReceiver(true); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetReceiverZMQIP"); - - connect(dispZMQIP2, SIGNAL(editingFinished()), this, SLOT(SetReceiverZMQIP())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetReceiver(){ -#ifdef VERBOSE - cout << "Setting Receiver" << endl; -#endif - string outdir = myDet->getFilePath(); - dispRxrHostname->setText(QString(det->setReceiver(dispRxrHostname->text().toAscii().constData()).c_str())); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetReceiver"); - det->setFilePath(outdir); - qDefs::checkErrorMessage(det,"qTabAdvanced::SetReceiver"); - Refresh(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::updateROIList(){ -#ifdef VERYVERBOSE - cout<<"in updateROIList() " << endl; -#endif - clearROI(); - - int n,i; - slsDetectorDefs::ROI* temp = myDet->getROI(n); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::updateROIList"); - - if((temp!=NULL)&&(n>0)){ - //assign into array, else it loses values cuz of memory - slsDetectorDefs::ROI allroi[n]; - for(i=0;isetValue(allroi[i].xmin); - spinFromY[i]->setValue(allroi[i].ymin); - spinToX[i]->setValue(allroi[i].xmax); - spinToY[i]->setValue(allroi[i].ymax); - } - cout << "ROIs populated: " << n << endl; - } - - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::AddROIInput(int num){ -#ifdef VERVERBOSE - cout<<"in AddROIInput() " << num << endl; -#endif - if((int)lblFromX.size()){ - disconnect(spinFromX[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - disconnect(spinFromY[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - disconnect(spinToX[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - disconnect(spinToY[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - } - - int exists = numRois+1; - int total = exists+num; - //if cleared, addding just one - if ((num==0) && (numRois==0)){ - exists = 0; - total = 1; - }/*else{ - gridRoi->removeWidget - }*/ - - for (int i=exists;i= ((int)lblFromX.size())){ - lblFromX.resize(i+1); spinFromX.resize(i+1); - lblFromY.resize(i+1); spinFromY.resize(i+1); - lblToX.resize(i+1); spinToX.resize(i+1); - lblToY.resize(i+1); spinToY.resize(i+1); - - lblFromX[i] = new QLabel("x min:"); - lblFromY[i] = new QLabel("y min:"); - lblToX[i] = new QLabel("x max:"); - lblToY[i] = new QLabel("y max:"); - spinFromX[i] = new QSpinBox(); - spinFromY[i] = new QSpinBox(); - spinToX[i] = new QSpinBox(); - spinToY[i] = new QSpinBox(); - - - lblFromX[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); lblFromX[i]->setFixedWidth(50); - lblFromY[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); lblFromY[i]->setFixedWidth(50); - lblToX[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); lblToX[i]->setFixedWidth(50); - lblToY[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); lblToY[i]->setFixedWidth(50); - spinFromX[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); spinFromX[i]->setFixedWidth(80); - spinFromY[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); spinFromY[i]->setFixedWidth(80); - spinToX[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); spinToX[i]->setFixedWidth(80); - spinToY[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); spinToY[i]->setFixedWidth(80); - spinFromX[i]->setFixedHeight(19); - spinFromY[i]->setFixedHeight(19); - spinToX[i]->setFixedHeight(19); - spinToY[i]->setFixedHeight(19); - - spinFromX[i]->setMaximum(myDet->getMaxNumberOfChannels(slsDetectorDefs::X)-1); - spinToX[i]->setMaximum(myDet->getMaxNumberOfChannels(slsDetectorDefs::X)-1); - spinFromY[i]->setMaximum(myDet->getMaxNumberOfChannels(slsDetectorDefs::Y)-1); - spinToY[i]->setMaximum(myDet->getMaxNumberOfChannels(slsDetectorDefs::Y)-1); - spinFromX[i]->setMinimum(-1); - spinToX[i]->setMinimum(-1); - spinFromY[i]->setMinimum(-1); - spinToY[i]->setMinimum(-1); - spinFromX[i]->setValue(-1); - spinFromY[i]->setValue(-1); - spinToX[i]->setValue(-1); - spinToY[i]->setValue(-1); - } - - gridRoi->addWidget(lblFromX[i], i,0,Qt::AlignTop); - gridRoi->addWidget(spinFromX[i],i,1,Qt::AlignTop); - gridRoi->addItem(new QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Fixed), i,2,Qt::AlignTop); - gridRoi->addWidget(lblToX[i], i,3,Qt::AlignTop); - gridRoi->addWidget(spinToX[i], i,4,Qt::AlignTop); - gridRoi->addItem(new QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Fixed), i,5,Qt::AlignTop); - gridRoi->addWidget(lblFromY[i], i,6,Qt::AlignTop); - gridRoi->addWidget(spinFromY[i],i,7,Qt::AlignTop); - gridRoi->addItem(new QSpacerItem(40,20,QSizePolicy::Expanding,QSizePolicy::Fixed), i,8,Qt::AlignTop); - gridRoi->addWidget(lblToY[i], i,9,Qt::AlignTop); - gridRoi->addWidget(spinToY[i], i,10,Qt::AlignTop); - - lblFromX[i]->show(); - spinFromX[i]->show(); - lblToX[i]->show(); - spinToX[i]->show(); - lblFromY[i]->show(); - spinFromY[i]->show(); - lblToY[i]->show(); - spinToY[i]->show(); - } - - numRois += num; - - connect(spinFromX[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - connect(spinFromY[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - connect(spinToX[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - connect(spinToY[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - -#ifdef VERYVERBOSE - cout<<"ROI Inputs added " << num << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::AddROIInput"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::clearROI(){ -#ifdef VERYVERBOSE - cout<<"in clearROI() " << endl; -#endif - if((int)lblFromX.size()){ - disconnect(spinFromX[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - disconnect(spinFromY[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - disconnect(spinToX[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - disconnect(spinToY[numRois], SIGNAL(valueChanged(int)), this, SLOT(AddROIInputSlot())); - - } - - - for (int i=0;isetValue(-1); - spinFromY[i]->setValue(-1); - spinToX[i]->setValue(-1); - spinToY[i]->setValue(-1); - } - - - //hide widget because they are still visible even when removed and layout deleted - QLayoutItem *item; - while((item = gridRoi->takeAt(0))) { - if (item->widget()){ - item->widget()->hide(); - gridRoi->removeWidget(item->widget()); - } - //if (item->spacerItem()) - } - - numRois = 0; - AddROIInput(0); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::setROI(){ -#ifdef VERYVERBOSE - cout<<"in setROI() " << endl; -#endif - - slsDetectorDefs::ROI allroi[MAX_ROIS]; - - for (int i=0;ivalue(); - allroi[i].ymin = spinFromY[i]->value(); - allroi[i].xmax = spinToX[i]->value(); - allroi[i].ymax = spinToY[i]->value(); - } - - myDet->setROI(numRois,allroi); - //qDefs::checkErrorMessage(myDet); - cout<<"ROIs set" << endl; - //get the correct list back - updateROIList(); - //configuremac - myDet->configureMAC(); - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::setROI"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::clearROIinDetector(){ -#ifdef VERYVERBOSE - cout<<"in clearROIinDetector() " << endl; -#endif - - if (QMessageBox::warning(this, "Clear ROI", - "Are you sure you want to clear all the ROI in detector?", - QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes){ - - clearROI(); - setROI(); -#ifdef VERBOSE - cout << "ROIs cleared" << endl; -#endif - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetDetector(int index){ -#ifdef VERYVERBOSE - cout<<"in SetDetector: " << index << endl; -#endif - det = myDet->getSlsDetector(comboDetector->currentIndex()); - - - spinControlPort->setValue(det->getControlPort()); - spinStopPort->setValue(det->getStopPort()); - spinTCPPort->setValue(det->getReceiverPort()); - spinUDPPort->setValue(atoi(det->getReceiverUDPPort().c_str())); - spinZmqPort->setValue(atoi(det->getClientStreamingPort().c_str())); - spinZmqPort2->setValue(atoi(det->getReceiverStreamingPort().c_str())); - - dispIP->setText(det->getDetectorIP().c_str()); - dispMAC->setText(det->getDetectorMAC().c_str()); - dispRxrHostname->setText(det->getReceiver().c_str()); - dispUDPIP->setText(det->getReceiverUDPIP().c_str()); - dispUDPMAC->setText(det->getReceiverUDPMAC().c_str()); - dispZMQIP->setText(det->getClientStreamingIP().c_str()); - dispZMQIP2->setText(det->getReceiverStreamingIP().c_str()); - - - //check if its online and set it to red if offline - if(det->setOnline()==slsDetectorDefs::ONLINE_FLAG) - det->checkOnline(); - if(det->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG) - det->checkReceiverOnline(); - comboOnline->setCurrentIndex(det->setOnline()); - comboRxrOnline->setCurrentIndex(det->setReceiverOnline()); - //highlight in red if detector or receiver is offline - if(!comboOnline->currentIndex()){ - comboOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setPalette(red); - lblOnline->setText("Online:*"); - }else{ - comboOnline->setToolTip(detOnlineTip); - lblOnline->setToolTip(detOnlineTip); - lblOnline->setPalette(lblHostname->palette()); - lblOnline->setText("Online:"); - } - if(comboRxrOnline->isEnabled()){ - if(!comboRxrOnline->currentIndex()){ - comboRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setPalette(red); - lblRxrOnline->setText("Online:*"); - }else{ - comboRxrOnline->setToolTip(rxrOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip); - lblRxrOnline->setPalette(lblHostname->palette()); - lblRxrOnline->setText("Online:"); - } - } - - qDefs::checkErrorMessage(det,"qTabAdvanced::SetDetector"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetAllTrimbits(){ -#ifdef VERBOSE - cout<<"Set all trimbits to " << spinSetAllTrimbits->value() << endl; -#endif - myDet->setAllTrimbits(spinSetAllTrimbits->value()); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetAllTrimbits"); - updateAllTrimbitsFromServer(); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::updateAllTrimbitsFromServer(){ -#ifdef VERBOSE - cout<<"Getting all trimbits value" << endl; -#endif - disconnect(spinSetAllTrimbits, SIGNAL(editingFinished()), this, SLOT(SetAllTrimbits())); - - int ret = myDet->setAllTrimbits(-1); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::updateAllTrimbitsFromServer"); - spinSetAllTrimbits->setValue(ret); - - connect(spinSetAllTrimbits, SIGNAL(editingFinished()), this, SLOT(SetAllTrimbits())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetNumStoragecells(int value) { -#ifdef VERBOSE - cout << "Setting number of stoarge cells to " << value << endl; -#endif - myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER,value); - - disconnect(spinNumStoragecells,SIGNAL(valueChanged(int)),this, SLOT(SetNumStoragecells(int))); - spinNumStoragecells->setValue((int)myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER,-1)); - connect(spinNumStoragecells,SIGNAL(valueChanged(int)), this, SLOT(SetNumStoragecells(int))); - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetNumStoragecells"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetSubExposureTime() { - disconnect(spinSubExpTime,SIGNAL(valueChanged(double)), this, SLOT(SetSubExposureTime())); - disconnect(comboSubExpTimeUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubExposureTime())); - - //Get the value of timer in ns - double timeNS = qDefs::getNSTime( - (qDefs::timeUnit)comboSubExpTimeUnit->currentIndex(), - spinSubExpTime->value()); - - // set value -#ifdef VERBOSE - cout << "Setting sub frame acquisition time to " << timeNS << " clocks" << - "/" << spinSubExpTime->value() << - qDefs::getUnitString((qDefs::timeUnit)comboSubExpTimeUnit->currentIndex()) << endl; -#endif - myDet->setTimer(slsDetectorDefs::SUBFRAME_ACQUISITION_TIME,(int64_t)timeNS); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetSubExposureTime"); - - // update value in gui - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)( - myDet->setTimer(slsDetectorDefs::SUBFRAME_ACQUISITION_TIME,-1)*(1E-9)))); - spinSubExpTime->setValue(time); - comboSubExpTimeUnit->setCurrentIndex((int)unit); - - - // highlight if period < exptime - CheckAcqPeriodGreaterThanExp(); - - connect(spinSubExpTime,SIGNAL(valueChanged(double)), this, SLOT(SetSubExposureTime())); - connect(comboSubExpTimeUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetSubExposureTime())); - - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetSubExposureTime"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::SetSubPeriod() { - disconnect(spinSubPeriod,SIGNAL(valueChanged(double)), this, SLOT(SetSubPeriod())); - disconnect(comboSubPeriodUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubPeriod())); - - //Get the value of timer in ns - double timeNS = qDefs::getNSTime( - (qDefs::timeUnit)comboSubPeriodUnit->currentIndex(), - spinSubPeriod->value()); - - // set value -#ifdef VERBOSE - cout << "Setting sub frame period to " << timeNS << " clocks" << - "/" << spinSubPeriod->value() << - qDefs::getUnitString((qDefs::timeUnit)comboSubPeriodUnit->currentIndex()) << endl; -#endif - myDet->setTimer(slsDetectorDefs::SUBFRAME_DEADTIME,(int64_t)timeNS); - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetSubPeriod"); - - // update value in gui - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)( - myDet->setTimer(slsDetectorDefs::SUBFRAME_DEADTIME,-1)*(1E-9)))); - spinSubPeriod->setValue(time); - comboSubPeriodUnit->setCurrentIndex((int)unit); - - // highlight if period < exptime - CheckAcqPeriodGreaterThanExp(); - - connect(spinSubPeriod,SIGNAL(valueChanged(double)), this, SLOT(SetSubPeriod())); - connect(comboSubPeriodUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubPeriod())); - - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::SetSubPeriod"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::CheckAcqPeriodGreaterThanExp(){ - double exptimeNS = qDefs::getNSTime( - (qDefs::timeUnit)comboSubExpTimeUnit->currentIndex(), - spinSubExpTime->value()); - double acqtimeNS = qDefs::getNSTime( - (qDefs::timeUnit)comboSubPeriodUnit->currentIndex(), - spinSubPeriod->value()); - if(exptimeNS>acqtimeNS && acqtimeNS > 0) { - spinSubPeriod->setToolTip(errSubPeriodTip); - lblSubPeriod->setToolTip(errSubPeriodTip); - lblSubPeriod->setPalette(red); - lblSubPeriod->setText("Sub Frame Period:*"); - } - else { - spinSubPeriod->setToolTip(acqSubPeriodTip); - lblSubPeriod->setToolTip(acqSubPeriodTip); - lblSubPeriod->setPalette(lblExpTime->palette()); - lblSubPeriod->setText("Sub Frame Period:"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabAdvanced::Refresh(){ - - -#ifdef VERBOSE - cout << endl << "**Updating Advanced Tab" << endl; -#endif - //setting color of tab - //void setTabBar ( QTabBar * tb ) - //QTabBar * tabBar () const - /* - for(int i=0;itabBar()->setTabTextColor(i,defaultTabColor); - tabAdvancedSettings->tabBar()->setTabTextColor(index,QColor(0,0,200,255)); - */ - - if(isAngular){ -#ifdef VERBOSE - cout << "Angular Calibration Log set to " << chkAngularLog->isChecked() << endl; -#endif - - disconnect(chkAngularLog, SIGNAL(toggled(bool)), this, SLOT(SetLogs())); - - chkAngularLog->setChecked(myDet->getActionMode(slsDetectorDefs::angCalLog)); - - connect(chkAngularLog, SIGNAL(toggled(bool)), this, SLOT(SetLogs())); - } - - - if(isEnergy){ - //disconnect - disconnect(chkEnergyLog, SIGNAL(toggled(bool)), this, SLOT(SetLogs())); - disconnect(spinExpTime, SIGNAL(valueChanged(double)), this, SLOT(SetExposureTime())); - disconnect(comboExpUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetExposureTime())); - disconnect(spinThreshold, SIGNAL(valueChanged(double)), this, SLOT(SetThreshold())); - - - //energy/angular logs - chkEnergyLog->setChecked(myDet->getActionMode(slsDetectorDefs::enCalLog)); -#ifdef VERBOSE - cout << "Energy Calibration Log set to " << chkEnergyLog->isChecked() << endl; -#endif - - - //exptime - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,-1)*(1E-9)))); -#ifdef VERBOSE - cout << "Getting acquisition time : " << time << qDefs::getUnitString(unit) << endl; -#endif - spinExpTime->setValue(time); - comboExpUnit->setCurrentIndex((int)unit); - - - //threshold - double threshold = (double)myDet->setDAC(-1,slsDetectorDefs::THRESHOLD,0); -#ifdef VERBOSE - cout << "Getting Threshold DACu : " << threshold << endl; -#endif - spinThreshold->setValue(threshold); - - - //connect - connect(chkEnergyLog, SIGNAL(toggled(bool)), this, SLOT(SetLogs())); - connect(spinExpTime, SIGNAL(valueChanged(double)), this, SLOT(SetExposureTime())); - connect(comboExpUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(SetExposureTime())); - connect(spinThreshold, SIGNAL(valueChanged(double)), this, SLOT(SetThreshold())); - } - - - //network - det = myDet->getSlsDetector(comboDetector->currentIndex()); - - qDefs::checkErrorMessage(myDet,"qTabAdvanced::Refresh"); - - - -#ifdef VERBOSE - cout << "Getting Detector Ports" << endl; -#endif - //disconnect - disconnect(spinControlPort, SIGNAL(valueChanged(int)), this, SLOT(SetControlPort(int))); - disconnect(spinStopPort, SIGNAL(valueChanged(int)), this, SLOT(SetStopPort(int))); - disconnect(comboOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetOnline(int))); - - //so that updated status - if(det->setOnline()==slsDetectorDefs::ONLINE_FLAG) - det->checkOnline(); - comboOnline->setCurrentIndex(det->setOnline()); - spinControlPort->setValue(det->getControlPort()); - spinStopPort->setValue(det->getStopPort()); - - //connect - connect(spinControlPort, SIGNAL(valueChanged(int)), this, SLOT(SetControlPort(int))); - connect(spinStopPort, SIGNAL(valueChanged(int)), this, SLOT(SetStopPort(int))); - connect(comboOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetOnline(int))); - - -#ifdef VERBOSE - cout << "Getting Receiver Network Information" << endl; -#endif - if (detType!=slsDetectorDefs::MYTHEN){ - //disconnect - disconnect(spinTCPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrTCPPort(int))); - disconnect(spinUDPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrUDPPort(int))); - disconnect(spinZmqPort, SIGNAL(valueChanged(int)), this, SLOT(SetCltZmqPort(int))); - disconnect(spinZmqPort2, SIGNAL(valueChanged(int)), this, SLOT(SetRxrZmqPort(int))); - disconnect(comboRxrOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetReceiverOnline(int))); - disconnect(dispIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(dispMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(dispUDPIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(dispUDPMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - disconnect(btnRxr, SIGNAL(clicked()), this, SLOT(SetReceiver())); - - dispIP->setText(det->getDetectorIP().c_str()); - dispMAC->setText(det->getDetectorMAC().c_str()); - - //so that updated status - if(det->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG) - det->checkReceiverOnline(); - comboRxrOnline->setCurrentIndex(det->setReceiverOnline()); - - dispRxrHostname->setText(det->getReceiver().c_str()); - spinTCPPort->setValue(det->getReceiverPort()); - spinUDPPort->setValue(atoi(det->getReceiverUDPPort().c_str())); - spinZmqPort->setValue(atoi(det->getClientStreamingPort().c_str())); - spinZmqPort2->setValue(atoi(det->getReceiverStreamingPort().c_str())); - - dispUDPIP->setText(det->getReceiverUDPIP().c_str()); - dispUDPMAC->setText(det->getReceiverUDPMAC().c_str()); - - //connect - connect(spinTCPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrTCPPort(int))); - connect(spinUDPPort, SIGNAL(valueChanged(int)), this, SLOT(SetRxrUDPPort(int))); - connect(spinZmqPort, SIGNAL(valueChanged(int)), this, SLOT(SetCltZmqPort(int))); - connect(spinZmqPort2, SIGNAL(valueChanged(int)), this, SLOT(SetRxrZmqPort(int))); - connect(comboRxrOnline, SIGNAL(currentIndexChanged(int)), this, SLOT(SetReceiverOnline(int))); - connect(dispIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispUDPIP, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(dispUDPMAC, SIGNAL(editingFinished()), this, SLOT(SetNetworkParameters())); - connect(btnRxr, SIGNAL(clicked()), this, SLOT(SetReceiver())); - - // zmq parameters - disconnect(dispZMQIP, SIGNAL(editingFinished()), this, SLOT(SetClientZMQIP())); - dispZMQIP->setText(det->getClientStreamingIP().c_str()); - connect(dispZMQIP, SIGNAL(editingFinished()), this, SLOT(SetClientZMQIP())); - - disconnect(dispZMQIP2, SIGNAL(editingFinished()), this, SLOT(SetReceiverZMQIP())); - dispZMQIP2->setText(det->getReceiverStreamingIP().c_str()); - connect(dispZMQIP2, SIGNAL(editingFinished()), this, SLOT(SetReceiverZMQIP())); - } - - //highlight in red if detector or receiver is offline - if(!comboOnline->currentIndex()){ - comboOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setToolTip(detOnlineTip + errOnlineTip); - lblOnline->setPalette(red); - lblOnline->setText("Online:*"); - }else{ - comboOnline->setToolTip(detOnlineTip); - lblOnline->setToolTip(detOnlineTip); - lblOnline->setPalette(lblHostname->palette()); - lblOnline->setText("Online:"); - } - if(comboRxrOnline->isEnabled()){ - if(!comboRxrOnline->currentIndex()){ - comboRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip + errOnlineTip); - lblRxrOnline->setPalette(red); - lblRxrOnline->setText("Online:*"); - }else{ - comboRxrOnline->setToolTip(rxrOnlineTip); - lblRxrOnline->setToolTip(rxrOnlineTip); - lblRxrOnline->setPalette(lblHostname->palette()); - lblRxrOnline->setText("Online:"); - } - } - - //roi -#ifdef VERBOSE - cout << "Getting ROI" << endl; -#endif - if (detType == slsDetectorDefs::GOTTHARD) - updateROIList(); - - //update alltirmbits from server - if(boxSetAllTrimbits->isEnabled()) - updateAllTrimbitsFromServer(); - - // storage cells - if (detType == slsReceiverDefs::JUNGFRAU) { - disconnect(spinNumStoragecells,SIGNAL(valueChanged(int)),this, SLOT(SetNumStoragecells(int))); - spinNumStoragecells->setValue((int)myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER,-1)); - connect(spinNumStoragecells,SIGNAL(valueChanged(int)), this, SLOT(SetNumStoragecells(int))); - } - - // sub exptime and sub period - else if (detType == slsReceiverDefs::EIGER) { - disconnect(spinSubExpTime,SIGNAL(valueChanged(double)), this, SLOT(SetSubExposureTime())); - disconnect(comboSubExpTimeUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubExposureTime())); - disconnect(spinSubPeriod,SIGNAL(valueChanged(double)), this, SLOT(SetSubPeriod())); - disconnect(comboSubPeriodUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubPeriod())); - -#ifdef VERBOSE - cout << "Getting Sub Exposure time and Sub Period" << endl; -#endif - // subexptime - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)( - myDet->setTimer(slsDetectorDefs::SUBFRAME_ACQUISITION_TIME,-1)*(1E-9)))); - spinSubExpTime->setValue(time); - comboSubExpTimeUnit->setCurrentIndex((int)unit); - - // subperiod - time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::SUBFRAME_DEADTIME,-1)*(1E-9)))); - spinSubPeriod->setValue(time); - comboSubPeriodUnit->setCurrentIndex((int)unit); - - - // highlight if period < exptime - CheckAcqPeriodGreaterThanExp(); - - connect(spinSubExpTime,SIGNAL(valueChanged(double)), this, SLOT(SetSubExposureTime())); - connect(comboSubExpTimeUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetSubExposureTime())); - connect(spinSubPeriod,SIGNAL(valueChanged(double)), this, SLOT(SetSubPeriod())); - connect(comboSubPeriodUnit,SIGNAL(currentIndexChanged(int)),this, SLOT(SetSubPeriod())); - } - -#ifdef VERBOSE - cout << "**Updated Advanced Tab" << endl << endl; -#endif - - qDefs::checkErrorMessage(det,"qTabAdvanced::Refresh"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - diff --git a/slsDetectorGui/src/qTabDataOutput.cpp b/slsDetectorGui/src/qTabDataOutput.cpp deleted file mode 100644 index 1f38edb5e..000000000 --- a/slsDetectorGui/src/qTabDataOutput.cpp +++ /dev/null @@ -1,1102 +0,0 @@ -/* - * qTabDataOutput.cpp - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ -/********************************************************************** - * ********************************************************************/ - -#include "qTabDataOutput.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -// Qt Include Headers -#include -#include -// C++ Include Headers -#include -#include -using namespace std; - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -qTabDataOutput::qTabDataOutput(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent),myDet(detector){ - setupUi(this); - SetupWidgetWindow(); - Refresh(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabDataOutput::~qTabDataOutput(){ - delete myDet; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetupWidgetWindow(){ - // Detector Type - detType=myDet->getDetectorsType(); - widgetEiger->setVisible(false); - - //rate correction - not for charge integrating detectors - if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::EIGER)) - chkRate->setEnabled(true); - - if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::GOTTHARD)) - chkAngular->setEnabled(true); - - if(detType == slsDetectorDefs::EIGER){ - chkRate->setEnabled(true); - chkTenGiga->setEnabled(true); - widgetEiger->setVisible(true); - } - - /** error message **/ - red = QPalette(); - red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); - black = QPalette(); - black.setColor(QPalette::Active,QPalette::WindowText,Qt::black); - - red1 = new QPalette(); - red1->setColor(QPalette::Text,Qt::red); - black1 = new QPalette(); - black1->setColor(QPalette::Text,Qt::black); - - flatFieldTip = dispFlatField->toolTip(); - errFlatFieldTip = QString("Flat field corrections.
" - " #flatfield# filename

")+ - QString("" - "Enter a valid file to enable Flat Field."); - outDirTip = lblOutputDir->toolTip(); - - - //not used at all, later used for gappixels - chkUnused->setEnabled(false); - - //enabling file format depending on detector type - SetupFileFormat(); - - Initialization(); - - disconnect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); - PopulateDetectors(); - connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); - - //flat field correction from server -#ifdef VERBOSE - cout << "Getting flat field" << endl; -#endif - UpdateFlatFieldFromServer(); - - - //rate correction - not for charge integrating detectors - if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::EIGER)){ -#ifdef VERBOSE - cout << "Getting rate correction" << endl; -#endif - UpdateRateCorrectionFromServer(); - } - - - //update angular conversion from server - if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::GOTTHARD)){ -#ifdef VERBOSE - cout << "Getting angular conversion" << endl; -#endif - int ang; - if(myDet->getAngularConversion(ang)) - chkAngular->setChecked(true); - emit AngularConversionSignal(chkAngular->isChecked()); - } - - - //discard bad channels from server -#ifdef VERBOSE - cout << "Getting bad channel correction:" << myDet->getBadChannelCorrection() << endl; -#endif - disconnect(chkDiscardBad, SIGNAL(toggled(bool))); - if(myDet->getBadChannelCorrection()) - chkDiscardBad->setChecked(true); - else - chkDiscardBad->setChecked(false); - connect(chkDiscardBad, SIGNAL(toggled(bool)), this, SLOT(DiscardBadChannels())); - -/* - if(detType == slsDetectorDefs::MYTHEN){ - comboDetector->hide(); - } -*/ - qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetupWidgetWindow"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::Initialization(){ - //output dir - connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); - connect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); - - //overwrite enable - connect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); - - //file format - connect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); - - connect(btnOutputBrowse, SIGNAL(clicked()), this, SLOT(BrowseOutputDir())); - //flat field correction - connect(chkFlatField, SIGNAL(toggled(bool)), this, SLOT(SetFlatField())); - connect(btnFlatField, SIGNAL(clicked()), this, SLOT(BrowseFlatFieldPath())); - //rate correction - connect(chkRate, SIGNAL(toggled(bool)), this, SLOT(SetRateCorrection())); - connect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); - connect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); - - //angular correction - connect(chkAngular, SIGNAL(toggled(bool)), this, SLOT(SetAngularCorrection())); - //discard bad channels - connect(chkDiscardBad, SIGNAL(toggled(bool)), this, SLOT(DiscardBadChannels())); - //10GbE - connect(chkTenGiga, SIGNAL(toggled(bool)), this, SLOT(EnableTenGigabitEthernet(bool))); - - //eiger - if(widgetEiger->isVisible()){ - //speed - connect(comboEigerClkDivider,SIGNAL(currentIndexChanged(int)), this, SLOT(SetSpeed())); - //flags - connect(comboEigerFlags1, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); - connect(comboEigerFlags2, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::BrowseOutputDir() -{ - QString directory = QFileDialog::getExistingDirectory(this,tr("Choose Output Directory "),dispOutputDir->text()); - if (!directory.isEmpty()) - dispOutputDir->setText(directory); - SetOutputDir(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetFlatField(){ -#ifdef VERYVERBOSE - cout << "Entering Set Flat Field Correction Function" << endl; -#endif - // so that it doesnt call it twice - disconnect(dispFlatField, SIGNAL(editingFinished()), this, SLOT(SetFlatField())); - - //enable/disable - dispFlatField->setEnabled(chkFlatField->isChecked()); - btnFlatField->setEnabled(chkFlatField->isChecked()); - - if(chkFlatField->isChecked()){ - if(dispFlatField->text().isEmpty()){ - chkFlatField->setToolTip(errFlatFieldTip); - dispFlatField->setToolTip(errFlatFieldTip); - chkFlatField->setPalette(red); - chkFlatField->setText("Flat Field File:*"); -#ifdef VERBOSE - cout << "Flat Field File is not set." << endl; -#endif - }else{ - QString fName = dispFlatField->text(); - QString file = fName.section('/',-1); - QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); - - chkFlatField->setToolTip(flatFieldTip); - dispFlatField->setToolTip(flatFieldTip); - chkFlatField->setPalette(chkDiscardBad->palette()); - chkFlatField->setText("Flat Field File:"); - //set ff dir - myDet->setFlatFieldCorrectionDir(dir.toAscii().constData()); - //set ff file and catch error if -1 - if(myDet->setFlatFieldCorrectionFile(file.toAscii().constData())<0){ - string sDir = dir.toAscii().constData(),sFile = file.toAscii().constData(); - if(sDir.length()<1) {sDir = string(QDir::current().absolutePath().toAscii().constData()); /*"/home/";*/} - qDefs::Message(qDefs::WARNING,"Invalid Flat Field file: "+sDir+"/"+sFile+ - ".\nUnsetting Flat Field.","qTabDataOutput::SetFlatField"); - - //Unsetting flat field - myDet->setFlatFieldCorrectionFile(""); - dispFlatField->setText(""); - chkFlatField->setToolTip(errFlatFieldTip); - dispFlatField->setToolTip(errFlatFieldTip); - chkFlatField->setPalette(red); - chkFlatField->setText("Flat Field File:*"); -#ifdef VERBOSE - cout << "Invalid Flat Field File - "<< sDir << sFile << ". Unsetting Flat Field." << endl; -#endif - } - else{ -#ifdef VERBOSE - cout << "Setting flat field file to "<< dispFlatField->text().toAscii().constData() << endl; -#endif - } - } - }else{ - chkFlatField->setToolTip(flatFieldTip); - dispFlatField->setToolTip(flatFieldTip); - chkFlatField->setPalette(chkDiscardBad->palette()); - chkFlatField->setText("Flat Field File:"); - //Unsetting flat field - myDet->setFlatFieldCorrectionFile(""); - dispFlatField->setText(""); -#ifdef VERBOSE - cout << "Unsetting flat field correction file" << endl; -#endif - } - - connect(dispFlatField,SIGNAL(editingFinished()),this,SLOT(SetFlatField())); - - qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetFlatField"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabDataOutput::UpdateFlatFieldFromServer(){ - disconnect(dispFlatField, SIGNAL(editingFinished()), this, SLOT(SetFlatField())); - - dispFlatField->setText(QString(myDet->getFlatFieldCorrectionDir().c_str())+"/"+QString(myDet->getFlatFieldCorrectionFile().c_str())); -#ifdef VERBOSE - cout << "Getting flat field correction file" << dispFlatField->text().toAscii().constData() << endl; -#endif - //calls setflatfield to ensure the file still exists or disable it - if(!QString(myDet->getFlatFieldCorrectionFile().c_str()).compare("none")){ - dispFlatField->setText(""); - chkFlatField->setChecked(false); -#ifdef VERBOSE - cout << "Flat Field is not set." << endl; -#endif - } - else - chkFlatField->setChecked(true); - - chkFlatField->setToolTip(flatFieldTip); - dispFlatField->setToolTip(flatFieldTip); - chkFlatField->setPalette(chkDiscardBad->palette()); - chkFlatField->setText("Flat Field File:"); - - connect(dispFlatField, SIGNAL(editingFinished()), this, SLOT(SetFlatField())); - - qDefs::checkErrorMessage(myDet,"qTabDataOutput::UpdateFlatFieldFromServer"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabDataOutput::BrowseFlatFieldPath(){ - QString fName = dispFlatField->text(); - QString dir = fName.section('/',0,-2,QString::SectionIncludeLeadingSep); - if(dir.isEmpty()) dir = QString(myDet->getFlatFieldCorrectionDir().c_str());/*"/home/";*/ - fName = QFileDialog::getOpenFileName(this, - tr("Load Flat Field Correction File"),dir, - tr("Data Files(*.raw *.dat);; All Files (*.*)"),0,QFileDialog::ShowDirsOnly); - if (!fName.isEmpty()){ - dispFlatField->setText(fName); - SetFlatField(); - } - - qDefs::checkErrorMessage(myDet,"qTabDataOutput::BrowseFlatFieldPath"); - -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetRateCorrection(int deadtime){ - disconnect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); - disconnect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); - -#ifdef VERBOSE - cout << "Entering Set Rate Correction function" << endl; -#endif - - if(chkRate->isChecked()){ - if(!btnDefaultRate->isEnabled()){ - btnDefaultRate->setEnabled(true); - lblDeadTime->setEnabled(true); - spinDeadTime->setEnabled(true); - } - - if(deadtime!=-1){ - deadtime = (double)spinDeadTime->value(); -#ifdef VERBOSE - cout << "Setting rate corrections with custom dead time: " << deadtime << endl; -#endif - }else{; -#ifdef VERBOSE - cout << "Setting rate corrections with default dead time" << endl; -#endif - } - myDet->setRateCorrection(deadtime); - - }//unsetting rate correction - else{ - btnDefaultRate->setEnabled(false); - lblDeadTime->setEnabled(false); - spinDeadTime->setEnabled(false); - myDet->setRateCorrection(0); -#ifdef VERBOSE - cout << "Unsetting rate correction" << endl; -#endif - } - qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetRateCorrection"); - - //update just the value - double rate = (double)myDet->getRateCorrectionTau(); - spinDeadTime->setValue((double)rate); - if(rate == -1){ - qDefs::Message(qDefs::WARNING,"Dead time is inconsistent for all detectors. Returned Value: -1.","qTabDataOutput::UpdateRateCorrectionFromServer"); - QString errorTip = QString("Rate Corrections.
" - " #ratecorr# tau in seconds

")+ - QString("" - "Dead time is inconsistent for all detectors."); - chkRate->setToolTip(errorTip); - spinDeadTime->setToolTip(errorTip); - chkRate->setPalette(red); - chkRate->setText("Rate:*"); - }else{ - QString normalTip = QString("Rate Corrections.
" - " #ratecorr# tau in seconds

"); - chkRate->setToolTip(normalTip); - spinDeadTime->setToolTip(normalTip); - chkRate->setPalette(chkDiscardBad->palette()); - chkRate->setText("Rate:"); - } - - connect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); - connect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetDefaultRateCorrection(){ - SetRateCorrection(-1); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::UpdateRateCorrectionFromServer(){ - disconnect(chkRate, SIGNAL(toggled(bool)), this, SLOT(SetRateCorrection())); - disconnect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); - disconnect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); - - double rate; - rate = (double)myDet->getRateCorrectionTau(); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::UpdateRateCorrectionFromServer"); -#ifdef VERBOSE - cout << "Getting rate correction from server: " << rate << endl; -#endif - if(rate==0){ - chkRate->setChecked(false); - btnDefaultRate->setEnabled(false); - lblDeadTime->setEnabled(false); - spinDeadTime->setEnabled(false); - } - - else{ - chkRate->setChecked(true); - btnDefaultRate->setEnabled(true); - lblDeadTime->setEnabled(true); - spinDeadTime->setEnabled(true); - spinDeadTime->setValue((double)rate); - } - - if(rate == -1){ - qDefs::Message(qDefs::WARNING,"Dead time is inconsistent for all detectors. Returned Value: -1.","qTabDataOutput::UpdateRateCorrectionFromServer"); - QString errorTip = QString("Rate Corrections.
" - " #ratecorr# tau in seconds

")+ - QString("" - "Dead time is inconsistent for all detectors."); - chkRate->setToolTip(errorTip); - spinDeadTime->setToolTip(errorTip); - chkRate->setPalette(red); - chkRate->setText("Rate:*"); - }else{ - QString normalTip = QString("Rate Corrections.
" - " #ratecorr# tau in seconds

"); - chkRate->setToolTip(normalTip); - spinDeadTime->setToolTip(normalTip); - chkRate->setPalette(chkDiscardBad->palette()); - chkRate->setText("Rate:"); - } - - connect(chkRate, SIGNAL(toggled(bool)), this, SLOT(SetRateCorrection())); - connect(btnDefaultRate, SIGNAL(clicked()), this, SLOT(SetDefaultRateCorrection())); - connect(spinDeadTime, SIGNAL(editingFinished()), this, SLOT(SetRateCorrection())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetAngularCorrection(){ - disconnect(chkAngular, SIGNAL(toggled(bool)), this, SLOT(SetAngularCorrection())); -#ifdef VERYVERBOSE - cout << "Entering Set Angular Correction function" << endl; -#endif - bool enabled = chkAngular->isChecked(); - //set - if(myDet->setAngularCorrectionMask(enabled) == enabled){ -#ifdef VERBOSE - cout << "Angular Conversion mask:" << enabled << endl; -#endif - } - //error - else{ -#ifdef VERBOSE - cout << "Could not set angular conversion to default" << endl; -#endif - qDefs::Message(qDefs::WARNING,"Angular Conversion could not be set/reset. Please set the default file name using the command line, if you want to set it.","qTabDataOutput::SetAngularCorrection"); - chkAngular->setChecked(!enabled); - } - - emit AngularConversionSignal(chkAngular->isChecked()); - connect(chkAngular, SIGNAL(toggled(bool)), this, SLOT(SetAngularCorrection())); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetAngularCorrection"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::DiscardBadChannels(){ -#ifdef VERBOSE - cout << "Entering Discard bad channels function" << endl; -#endif - if(chkDiscardBad->isChecked()){ -#ifdef VERBOSE - cout << "Setting bad channel correction to default" << endl; -#endif - myDet->setBadChannelCorrection("default"); - }else{ -#ifdef VERBOSE - cout << "Unsetting bad channel correction" << endl; -#endif - myDet->setBadChannelCorrection(""); - } - - qDefs::checkErrorMessage(myDet,"qTabDataOutput::DiscardBadChannels"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::PopulateDetectors(){ -#ifdef VERBOSE - cout << "Populating detectors" << endl; -#endif - comboDetector->clear(); - comboDetector->addItem("All"); - lblOutputDir->setText("Path:"); - //add specific detector options only if more than 1 detector - if(myDet->getNumberOfDetectors()>1){ - for(int i=0;igetNumberOfDetectors();i++) - comboDetector->addItem(QString(myDet->getHostname(i).c_str())); - } - GetOutputDir(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::GetOutputDir(){ -#ifdef VERBOSE - cout << "Getting output directory" << endl; -#endif - - disconnect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); - //all - if(!comboDetector->currentIndex()) { - dispOutputDir->setText(QString(myDet->getFilePath().c_str())); - //multi file path blank means sls file paths are different - if (dispOutputDir->text().isEmpty()) { -#ifdef VERYVERBOSE - qDefs::Message(qDefs::INFORMATION,"The file path for individual units are different.\n" - "Hence, leaving the common field blank.","qTabDataOutput::GetOutputDir"); -#endif -#ifdef VERBOSE - cout << "The file path for individual units are different.\n" - "Hence, leaving the common field blank." << endl; -#endif - QString errTip = QString("
" - "Output Directory Information only: The file path for individual units are different.
" - "Hence, leaving the common field blank.
"); - lblOutputDir->setText("Path*:"); - lblOutputDir->setPalette(red); - lblOutputDir->setToolTip(errTip); - btnOutputBrowse->setToolTip(errTip); - dispOutputDir->setToolTip(errTip); - } else { - lblOutputDir->setText("Path:"); - lblOutputDir->setPalette(*black1); - lblOutputDir->setToolTip(outDirTip); - btnOutputBrowse->setToolTip(outDirTip); - dispOutputDir->setToolTip(outDirTip); - } - } - - //specific - else{ - slsDetector *det = myDet->getSlsDetector(comboDetector->currentIndex()-1); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::GetOutputDir"); - dispOutputDir->setText(QString(det->getFilePath().c_str())); - } - - connect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -int qTabDataOutput::VerifyOutputDirectory(){ -#ifdef VERBOSE - cout << "Verifying output directory" << endl; -#endif - - GetOutputDir(); - - bool error = false; - string detName = ""; - string mess = ""; - - //common - myDet->setFilePath(myDet->getFilePath()); - if(!qDefs::checkErrorMessage(myDet,"qTabDataOutput::VerifyOutputDirectory").empty()) - error = true; - - //for each detector - for(int i=0;igetNumberOfDetectors();i++){ - slsDetector *det = myDet->getSlsDetector(i); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::VerifyOutputDirectory"); - detName = string("\n - ") + string(comboDetector->itemText(i+1).toAscii().constData()); - det->setFilePath(det->getFilePath()); - if(!qDefs::checkErrorMessage(det,"qTabDataOutput::VerifyOutputDirectory").empty()) { - mess. append(detName); - error = true; - } - } - - //invalid - if(error){ - qDefs::Message(qDefs::WARNING,string("Invalid Output Directory ")+ mess ,"qTabDataOutput::VerifyOutputDirectory"); -#ifdef VERBOSE - cout << "The output path doesnt exist anymore" << endl; -#endif - //replace all \n with
- size_t pos = 0; - while((pos = mess.find("\n", pos)) != string::npos){ - mess.replace(pos, 1, "
"); - pos += 1; - } - QString errTip = outDirTip + - QString("
" - "Invalid Output Directory") + - QString(mess.c_str()) + - QString( "."); - lblOutputDir->setText("Path*:"); - lblOutputDir->setPalette(red); - lblOutputDir->setToolTip(errTip); - btnOutputBrowse->setToolTip(errTip); - dispOutputDir->setToolTip(errTip); - - return slsDetectorDefs::FAIL; - } - - //valid - else{ -#ifdef VERBOSE - cout << "The output pathid valid" << endl; -#endif - lblOutputDir->setText("Path:"); - lblOutputDir->setPalette(*black1); - lblOutputDir->setToolTip(outDirTip); - btnOutputBrowse->setToolTip(outDirTip); - dispOutputDir->setToolTip(outDirTip); - } - - return slsDetectorDefs::OK; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetOutputDir(){ - -#ifdef VERBOSE - cout << "Setting output directory" << endl; -#endif - - disconnect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); - - - bool error = false; - QString path = dispOutputDir->text(); - - //empty - if(path.isEmpty()) { - qDefs::Message(qDefs::WARNING,"Invalid Output Path. Must not be empty.","qTabDataOutput::SetOutputDir"); -#ifdef VERBOSE - cout << "Invalid Output Path. Must not be empty." << endl; -#endif - error = true; - } - //gets rid of the end '/'s - else if (path.endsWith('/')){ - while(path.endsWith('/')) - path.chop(1); - dispOutputDir->setText(path); - } - - //specific - if(comboDetector->currentIndex()){ - slsDetector *det = myDet->getSlsDetector(comboDetector->currentIndex()-1); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetOutputDir"); - det->setFilePath(string(dispOutputDir->text().toAscii().constData())); - if(!qDefs::checkErrorMessage(det,"qTabDataOutput::SetOutputDir").empty()) - error = true; - } - - //multi - else{ - myDet->setFilePath(string(path.toAscii().constData())); - if(!qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetOutputDir").empty()) - error = true; - } - - - if(error){ -#ifdef VERBOSE - cout << "The output path could not be set" << endl; -#endif - QString errTip = outDirTip + QString("
" - "Invalid File Path"); - - lblOutputDir->setText("Path*:"); - lblOutputDir->setPalette(red); - lblOutputDir->setToolTip(errTip); - btnOutputBrowse->setToolTip(errTip); - dispOutputDir->setToolTip(errTip); - } - else{ -#ifdef VERBOSE - cout << "The output path has been modified" << endl; -#endif - lblOutputDir->setText("Path:"); - lblOutputDir->setPalette(*black1); - lblOutputDir->setToolTip(outDirTip); - btnOutputBrowse->setToolTip(outDirTip); - dispOutputDir->setToolTip(outDirTip); - - } - - - connect(dispOutputDir, SIGNAL(editingFinished()), this, SLOT(SetOutputDir())); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::EnableTenGigabitEthernet(bool enable,int get){ -#ifdef VERBOSE - cout << endl << "Enabling/Disabling 10GbE" << endl; -#endif - disconnect(chkTenGiga, SIGNAL(toggled(bool)), this, SLOT(EnableTenGigabitEthernet(bool))); - int ret; - if(get) - ret = myDet->enableTenGigabitEthernet(-1); - else - ret = myDet->enableTenGigabitEthernet(enable); - if(ret > 0) chkTenGiga->setChecked(true); - else chkTenGiga->setChecked(false); - connect(chkTenGiga, SIGNAL(toggled(bool)), this, SLOT(EnableTenGigabitEthernet(bool))); - - qDefs::checkErrorMessage(myDet,"qTabDataOutput::EnableTenGigabitEthernet"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetSpeed(){ -#ifdef VERBOSE - cout << endl << "Setting Speed" << endl; -#endif - if(widgetEiger->isVisible()){ - myDet->setSpeed(slsDetectorDefs::CLOCK_DIVIDER,comboEigerClkDivider->currentIndex()); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::SetSpeed"); - UpdateSpeedFromServer(); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetFlags(){ -#ifdef VERBOSE - cout << endl << "Setting Readout Flags" << endl; -#endif - slsDetectorDefs::readOutFlags val = slsDetectorDefs::GET_READOUT_FLAGS; - if(widgetEiger->isVisible()){ - - //set to continous or storeinram - switch(comboEigerFlags1->currentIndex()){ - case Storeinram: val = slsDetectorDefs::STORE_IN_RAM; break; - default: val = slsDetectorDefs::CONTINOUS_RO; break; - } - myDet->setReadOutFlags(val); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::setFlags"); - - //set to parallel, nonparallel or safe - switch(comboEigerFlags2->currentIndex()){ - case Parallel: val = slsDetectorDefs::PARALLEL; break; - case Safe: val = slsDetectorDefs::SAFE; break; - default: val = slsDetectorDefs::NONPARALLEL; break; - } - myDet->setReadOutFlags(val); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::setFlags"); - - //update flags - UpdateFlagsFromServer(); - } - -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::UpdateSpeedFromServer(){ - int ret; - if(widgetEiger->isVisible()){ - disconnect(comboEigerClkDivider, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSpeed())); - - //get speed - ret = myDet->setSpeed(slsDetectorDefs::CLOCK_DIVIDER, -1); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateSpeedFromServer"); - - //valid speed - if(ret >= 0 && ret < NumberofSpeeds) - comboEigerClkDivider->setCurrentIndex(ret); - - //invalid speed - else{ - qDefs::Message(qDefs::WARNING,"Inconsistent value from clock divider.\n" - "Setting it for all detectors involved to half speed.","qTabDataOutput::updateSpeedFromServer"); - //set to default - comboEigerClkDivider->setCurrentIndex(HalfSpeed); - myDet->setSpeed(slsDetectorDefs::CLOCK_DIVIDER,HalfSpeed); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateSpeedFromServer"); - - } - connect(comboEigerClkDivider, SIGNAL(currentIndexChanged(int)), this, SLOT(SetSpeed())); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::UpdateFlagsFromServer(){ - int ret; - if(widgetEiger->isVisible()){ - disconnect(comboEigerFlags1, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); - disconnect(comboEigerFlags2, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); - - //get speed - ret = myDet->setReadOutFlags(slsDetectorDefs::GET_READOUT_FLAGS); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateFlagsFromServer"); - - //invalid flags - if(ret==-1){ - qDefs::Message(qDefs::WARNING,"Inconsistent value for readout flags.\n" - "Setting it for all detectors involved to continous nonparallel mode.", - "qTabDataOutput::updateFlagsFromServer"); - //set to default - comboEigerFlags1->setCurrentIndex(Continous); - myDet->setReadOutFlags(slsDetectorDefs::CONTINOUS_RO); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateFlagsFromServer"); - comboEigerFlags2->setCurrentIndex(NonParallel); - myDet->setReadOutFlags(slsDetectorDefs::NONPARALLEL); - qDefs::checkErrorMessage(myDet,"qTabDataOutput::updateFlagsFromServer"); - } - - //valid flags - else{ - if(ret & slsDetectorDefs::STORE_IN_RAM) - comboEigerFlags1->setCurrentIndex(Storeinram); - else if(ret & slsDetectorDefs::CONTINOUS_RO) - comboEigerFlags1->setCurrentIndex(Continous); - if(ret & slsDetectorDefs::PARALLEL) - comboEigerFlags2->setCurrentIndex(Parallel); - else if(ret & slsDetectorDefs::NONPARALLEL) - comboEigerFlags2->setCurrentIndex(NonParallel); - else if(ret & slsDetectorDefs::SAFE) - comboEigerFlags2->setCurrentIndex(Safe); - } - - connect(comboEigerFlags1, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); - connect(comboEigerFlags2, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFlags())); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetupFileFormat(){ - - - //To be able to index items on a combo box - QStandardItemModel* model = qobject_cast(comboFileFormat->model()); - QModelIndex index[slsReceiverDefs::NUM_FILE_FORMATS]; - QStandardItem* item[slsReceiverDefs::NUM_FILE_FORMATS]; - if (model) { - for(int i=0;iindex(i, comboFileFormat->modelColumn(), comboFileFormat->rootModelIndex()); - item[i] = model->itemFromIndex(index[i]); - } - //Enabling/Disabling depending on the detector type - switch(detType){ - case slsDetectorDefs::MYTHEN: - item[(int)slsReceiverDefs::BINARY]->setEnabled(false); - item[(int)slsReceiverDefs::ASCII]->setEnabled(true); - item[(int)slsReceiverDefs::HDF5]->setEnabled(false); - break; - case slsDetectorDefs::EIGER: - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - item[(int)slsReceiverDefs::BINARY]->setEnabled(true); - item[(int)slsReceiverDefs::ASCII]->setEnabled(false); - item[(int)slsReceiverDefs::HDF5]->setEnabled(true); - break; - default: - cout << "Unknown detector type " << endl; - qDefs::Message(qDefs::CRITICAL,"Unknown detector type.","qTabDataOutput::SetupFileFormat"); - exit(-1); - break; - } - } - - comboFileFormat->setCurrentIndex((int)myDet->getFileFormat()); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::UpdateFileFormatFromServer(){ -#ifdef VERBOSE - cout << endl << "Getting File Format" << endl; -#endif - disconnect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); - - comboFileFormat->setCurrentIndex((int)myDet->getFileFormat()); - - connect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetFileFormat(int format){ -#ifdef VERBOSE - cout << endl << "Setting File Format" << endl; -#endif - disconnect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); - - int ret = (int)myDet->setFileFormat((slsReceiverDefs::fileFormat)comboFileFormat->currentIndex()); - if (ret != comboFileFormat->currentIndex()) { - qDefs::Message(qDefs::WARNING,"Could not set file format.","qTabDataOutput::SetFileFormat"); - comboFileFormat->setCurrentIndex((int)ret); - } - - connect(comboFileFormat, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFileFormat(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::UpdateFileOverwriteFromServer(){ -#ifdef VERBOSE - cout << endl << "Getting File Over Write Enable" << endl; -#endif - disconnect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); - - chkOverwriteEnable->setChecked(myDet->overwriteFile()); - - connect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::SetOverwriteEnable(bool enable){ -#ifdef VERBOSE - cout << endl << "Setting File Over Write Enable" << endl; -#endif - disconnect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); - - int valid = (enable?1:0); - if (myDet->overwriteFile(enable) != valid) - qDefs::Message(qDefs::WARNING,"Could not over write enable.","qTabDataOutput::SetOverwriteEnable"); - - connect(chkOverwriteEnable, SIGNAL(toggled(bool)), this, SLOT(SetOverwriteEnable(bool))); - - UpdateFileOverwriteFromServer(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDataOutput::Refresh(){ -#ifdef VERBOSE - cout << endl << "**Updating DataOutput Tab" << endl; -#endif - - if (!myDet->enableWriteToFile()) - boxFileWriteEnabled->setEnabled(false); - else - boxFileWriteEnabled->setEnabled(true); - - // output dir -#ifdef VERBOSE - cout << "Getting output directory" << endl; -#endif - - disconnect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); - PopulateDetectors(); - connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(GetOutputDir())); - - //file format - UpdateFileFormatFromServer(); - - //overwrite - UpdateFileOverwriteFromServer(); - - //file name - dispFileName->setText(QString(myDet->getFileName().c_str())); - - //flat field correction from server -#ifdef VERBOSE - cout << "Getting flat field" << endl; -#endif - UpdateFlatFieldFromServer(); - - - //rate correction - not for charge integrating detectors - if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::EIGER)){ -#ifdef VERBOSE - cout << "Getting rate correction" << endl; -#endif - UpdateRateCorrectionFromServer(); - } - - - //update angular conversion from server - if((detType == slsDetectorDefs::MYTHEN)||(detType == slsDetectorDefs::GOTTHARD)){ -#ifdef VERBOSE - cout << "Getting angular conversion" << endl; -#endif - int ang; - if(myDet->getAngularConversion(ang)) - chkAngular->setChecked(true); - emit AngularConversionSignal(chkAngular->isChecked()); - } - - - //discard bad channels from server -#ifdef VERBOSE - cout << "Getting bad channel correction" << endl;//cout << "ff " << myDet->getBadChannelCorrection() << endl; -#endif - - - disconnect(chkDiscardBad, SIGNAL(toggled(bool))); - if(myDet->getBadChannelCorrection()) - chkDiscardBad->setChecked(true); - else - chkDiscardBad->setChecked(false); - connect(chkDiscardBad, SIGNAL(toggled(bool)), this, SLOT(DiscardBadChannels())); - - if(myDet->setReceiverOnline()==slsDetectorDefs::ONLINE_FLAG){ - btnOutputBrowse->setEnabled(false); - btnOutputBrowse->setToolTip("This button is disabled as receiver PC is different from " - "client PC and hence different directory structures.

" + dispOutputDir->toolTip()); - }else{ - btnOutputBrowse->setEnabled(true); - btnOutputBrowse->setToolTip(dispOutputDir->toolTip()); - } - - //getting 10GbE - if(chkTenGiga->isEnabled()){ -#ifdef VERBOSE - cout << "Getting 10GbE enable" << endl; -#endif - EnableTenGigabitEthernet(-1,1); - } - - //Eiger specific - if(widgetEiger->isVisible()){ - //speed -#ifdef VERBOSE - cout << "Getting Speed" << endl; -#endif - UpdateSpeedFromServer(); - //flags -#ifdef VERBOSE - cout << "Getting Readout Flags" << endl; -#endif - UpdateFlagsFromServer(); - - - - } - - -#ifdef VERBOSE - cout << "**Updated DataOutput Tab" << endl << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qTabDataOutput::Refresh"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - diff --git a/slsDetectorGui/src/qTabDebugging.cpp b/slsDetectorGui/src/qTabDebugging.cpp deleted file mode 100644 index 46b861052..000000000 --- a/slsDetectorGui/src/qTabDebugging.cpp +++ /dev/null @@ -1,619 +0,0 @@ -/* - * qTabDebugging.cpp - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ -#include "qTabDebugging.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -// Qt Include Headers -#include -#include -// C++ Include Headers -#include -using namespace std; - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabDebugging::qTabDebugging(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent), - myDet(detector), - det(0), - treeDet(0), - dispFrame(0), - lblDetectorId(0), - lblDetectorSerial(0), - lblDetectorFirmware(0), - lblDetectorSoftware(0), - lblModuleId(0), - lblModuleFirmware(0), - lblModuleSerial(0){ - setupUi(this); - SetupWidgetWindow(); - Initialization(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabDebugging::~qTabDebugging(){ - delete myDet; - if(det) delete det; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDebugging::SetupWidgetWindow(){ - - blue = new QPalette(); - blue->setColor(QPalette::Active,QPalette::WindowText,Qt::darkBlue); - - - // Detector Type - detType=myDet->getDetectorsType(); - ///change module label - switch(detType){ - case slsDetectorDefs::EIGER: - lblDetector->setText("Half Module:"); - chkDetectorFirmware->setText("Half Module Firmware:"); - chkDetectorSoftware->setText("Half Module Software:"); - chkDetectorMemory->setText("Half Module Memory:"); - chkDetectorBus->setText("Half Module Bus:"); - lblModule->hide(); - comboModule->hide(); - chkModuleFirmware->hide(); - chkChip->setEnabled(false); - chkModuleFirmware->setEnabled(false); - break; - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: - lblDetector->setText("Module:"); - chkDetectorFirmware->setText("Module Firmware:"); - chkDetectorSoftware->setText("Module Software:"); - chkDetectorMemory->setText("Module Memory:"); - chkDetectorBus->setText("Module Bus:"); - lblModule->hide(); - comboModule->hide(); - chkModuleFirmware->hide(); - chkChip->setEnabled(false); - chkModuleFirmware->setEnabled(false); - break; - case slsDetectorDefs::MOENCH: - lblDetector->setText("Module:"); - chkDetectorFirmware->setText("Module Firmware:"); - chkDetectorSoftware->setText("Module Software:"); - chkDetectorMemory->setText("Module Memory:"); - chkDetectorBus->setText("Module Bus:"); - lblModule->hide(); - comboModule->hide(); - chkModuleFirmware->hide(); - chkChip->setEnabled(false); - chkModuleFirmware->setEnabled(false); - break; - case slsDetectorDefs::MYTHEN: - break; - default: - //leave everything as it is(mythen is default) - break; - } - - - //add detectors - for(int i=0;igetNumberOfDetectors();i++){ - comboDetector->addItem(QString(myDet->getHostname(i).c_str())); - } - - - //add modules and status for current detector - if(detType==slsDetectorDefs::MYTHEN) UpdateModuleList(); - UpdateStatus(); - - qDefs::checkErrorMessage(myDet,"qTabDebugging::SetupWidgetWindow"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDebugging::Initialization(){ - if(detType==slsDetectorDefs::MYTHEN) - connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateModuleList())); - - connect(comboDetector, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateStatus())); - connect(btnGetInfo, SIGNAL(clicked()), this, SLOT(GetInfo())); - connect(btnTest, SIGNAL(clicked()), this, SLOT(TestDetector())); -} - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDebugging::UpdateModuleList(){ -#ifdef VERBOSE - cout << "Getting Module List" << endl; -#endif - det = myDet->getSlsDetector(comboDetector->currentIndex()); - qDefs::checkErrorMessage(myDet,"qTabDebugging::UpdateModuleList"); - //deletes all modules except "all modules" - for(int i=0;icount()-1;i++) - comboModule->removeItem(i); - for(int i=0;igetNMods();i++){ - comboModule->addItem(QString("Module %1").arg(i)); - } - - qDefs::checkErrorMessage(det,"qTabDebugging::UpdateModuleList"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDebugging::UpdateStatus(){ -#ifdef VERBOSE - cout << "Getting Status" << endl; -#endif - det = myDet->getSlsDetector(comboDetector->currentIndex()); - qDefs::checkErrorMessage(myDet,"qTabDebugging::UpdateStatus"); - int detStatus = (int)det->getRunStatus(); - string status = slsDetectorBase::runStatusType(slsDetectorDefs::runStatus(detStatus)); - lblStatus->setText(QString(status.c_str()).toUpper()); - - qDefs::checkErrorMessage(det,"qTabDebugging::UpdateStatus"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDebugging::GetInfo(){ -#ifdef VERBOSE - cout << "Getting Info" << endl; -#endif - //window - QFrame* popup1 = new QFrame(this, Qt::Popup | Qt::SubWindow ); - QList items; - - - - //layout - QGridLayout *layout = new QGridLayout(popup1); - //treewidget - treeDet = new QTreeWidget(popup1); - layout->addWidget(treeDet,0,0); - //display the details - dispFrame = new QFrame(popup1); - QGridLayout *formLayout = new QGridLayout(dispFrame); - lblDetectorId = new QLabel(""); lblDetectorId->setPalette(*blue); - lblDetectorSerial = new QLabel(""); lblDetectorSerial->setPalette(*blue); - lblDetectorFirmware = new QLabel(""); lblDetectorFirmware->setPalette(*blue); - lblDetectorSoftware = new QLabel(""); lblDetectorSoftware->setPalette(*blue); - lblModuleId = new QLabel(""); lblModuleId->setPalette(*blue); - lblModuleSerial = new QLabel(""); lblModuleSerial->setPalette(*blue); - lblModuleFirmware = new QLabel(""); lblModuleFirmware->setPalette(*blue); - //to make sure the size is constant - lblDetectorFirmware->setFixedWidth(100); - layout->addWidget(dispFrame,0,1); - - switch(detType){ - - case slsDetectorDefs::MYTHEN: - //display widget - formLayout->addWidget(new QLabel("Readout:"),0,0); - formLayout->addItem(new QSpacerItem(15,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - formLayout->addWidget(lblDetectorId,0,2); - formLayout->addWidget(new QLabel("Readout MAC Address:"),1,0); - formLayout->addWidget(lblDetectorSerial,1,2); - formLayout->addWidget(new QLabel("Readout Firmware Version:"),2,0); - formLayout->addWidget(lblDetectorFirmware,2,2); - formLayout->addWidget(new QLabel("Readout Software Version:"),3,0); - formLayout->addWidget(lblDetectorSoftware,3,2); - formLayout->addWidget(new QLabel("Module:"),4,0); - formLayout->addWidget(lblModuleId,4,2); - formLayout->addWidget(new QLabel("Module Serial Number:"),5,0); - formLayout->addWidget(lblModuleSerial,5,2); - formLayout->addWidget(new QLabel("Module Firmware Version:"),6,0); - formLayout->addWidget(lblModuleFirmware,6,2); - - - //tree widget - treeDet->setHeaderLabel("Mythen Detector"); - //gets det names - for (int i=0;icount();i++) - items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Readout (%1)").arg(comboDetector->itemText(i))))); - treeDet->insertTopLevelItems(0, items); - //gets module names - for (int i=0;icount();i++){ - QList childItems; - det = myDet->getSlsDetector(i); - qDefs::checkErrorMessage(myDet,"qTabDebugging::GetInfo"); - for(int j=0;jgetNMods();j++) - childItems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Module %1").arg(j)))); - treeDet->topLevelItem(i)->insertChildren(0,childItems); - qDefs::checkErrorMessage(det,"qTabDebugging::GetInfo"); - } - - break; - - - - - case slsDetectorDefs::EIGER: - //display widget - formLayout->addWidget(new QLabel("Half Module:"),0,0); - formLayout->addItem(new QSpacerItem(15,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - formLayout->addWidget(lblDetectorId,0,2); - formLayout->addWidget(new QLabel("Half Module MAC Address:"),1,0); - formLayout->addWidget(lblDetectorSerial,1,2); - formLayout->addWidget(new QLabel("Half Module Firmware Version:"),2,0); - formLayout->addWidget(lblDetectorFirmware,2,2); - formLayout->addWidget(new QLabel("Half Module Software Version:"),3,0); - formLayout->addWidget(lblDetectorSoftware,3,2); - - //tree widget - treeDet->setHeaderLabel("Eiger Detector"); - //get num modules - for (int i=0;icount()/2;i++) - items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Module %1").arg(i)))); - treeDet->insertTopLevelItems(0, items); - //gets det names - for (int i=0;icount();i++){ - QList childItems; - childItems.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Half Module (%1)").arg(comboDetector->itemText(i))))); - treeDet->topLevelItem(i*2)->insertChildren(0,childItems); - } - break; - - - - case slsDetectorDefs::MOENCH: - - //display widget - formLayout->addWidget(new QLabel("Module:"),0,0); - formLayout->addItem(new QSpacerItem(15,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - formLayout->addWidget(lblDetectorId,0,2); - formLayout->addWidget(new QLabel("Module MAC Address:"),1,0); - formLayout->addWidget(lblDetectorSerial,1,2); - formLayout->addWidget(new QLabel("Module Firmware Version:"),2,0); - formLayout->addWidget(lblDetectorFirmware,2,2); - formLayout->addWidget(new QLabel("Module Software Version:"),3,0); - formLayout->addWidget(lblDetectorSoftware,3,2); - //tree widget - treeDet->setHeaderLabel("Moench Detector"); - //gets det names - for (int i=0;icount();i++) - items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Module (%1)").arg(comboDetector->itemText(i))))); - treeDet->insertTopLevelItems(0, items); - - break; - - - - case slsDetectorDefs::PROPIX: - - //display widget - formLayout->addWidget(new QLabel("Module:"),0,0); - formLayout->addItem(new QSpacerItem(15,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - formLayout->addWidget(lblDetectorId,0,2); - formLayout->addWidget(new QLabel("Module MAC Address:"),1,0); - formLayout->addWidget(lblDetectorSerial,1,2); - formLayout->addWidget(new QLabel("Module Firmware Version:"),2,0); - formLayout->addWidget(lblDetectorFirmware,2,2); - formLayout->addWidget(new QLabel("Module Software Version:"),3,0); - formLayout->addWidget(lblDetectorSoftware,3,2); - //tree widget - treeDet->setHeaderLabel("Propix Detector"); - //gets det names - for (int i=0;icount();i++) - items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Module (%1)").arg(comboDetector->itemText(i))))); - treeDet->insertTopLevelItems(0, items); - - break; - - - - case slsDetectorDefs::GOTTHARD: - - //display widget - formLayout->addWidget(new QLabel("Module:"),0,0); - formLayout->addItem(new QSpacerItem(15,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - formLayout->addWidget(lblDetectorId,0,2); - formLayout->addWidget(new QLabel("Module MAC Address:"),1,0); - formLayout->addWidget(lblDetectorSerial,1,2); - formLayout->addWidget(new QLabel("Module Firmware Version:"),2,0); - formLayout->addWidget(lblDetectorFirmware,2,2); - formLayout->addWidget(new QLabel("Module Software Version:"),3,0); - formLayout->addWidget(lblDetectorSoftware,3,2); - //tree widget - treeDet->setHeaderLabel("Gotthard Detector"); - //gets det names - for (int i=0;icount();i++) - items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Module (%1)").arg(comboDetector->itemText(i))))); - treeDet->insertTopLevelItems(0, items); - - break; - - - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - //display widget - formLayout->addWidget(new QLabel("Module:"),0,0); - formLayout->addItem(new QSpacerItem(15,20,QSizePolicy::Fixed,QSizePolicy::Fixed),0,1); - formLayout->addWidget(lblDetectorId,0,2); - formLayout->addWidget(new QLabel("Module MAC Address:"),1,0); - formLayout->addWidget(lblDetectorSerial,1,2); - formLayout->addWidget(new QLabel("Module Firmware Version:"),2,0); - formLayout->addWidget(lblDetectorFirmware,2,2); - formLayout->addWidget(new QLabel("Module Software Version:"),3,0); - formLayout->addWidget(lblDetectorSoftware,3,2); - //tree widget - if (detType == slsDetectorDefs::JUNGFRAU) - treeDet->setHeaderLabel("JungFrau Detector"); - else - treeDet->setHeaderLabel("JungFrauCTB Detector"); - //gets det names - for (int i=0;icount();i++) - items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("Module (%1)").arg(comboDetector->itemText(i))))); - treeDet->insertTopLevelItems(0, items); - - break; - - - default: - break; - } - - //show and center widget - - int x = ((parentWidget()->width()) - (popup1->frameGeometry().width())) / 2; - int y = ((parentWidget()->height()) - (popup1->frameGeometry().height())) / 2; - QDesktopWidget *desktop = QApplication::desktop(); - int screen = desktop->screenNumber(this); - popup1->setWindowModality(Qt::WindowModal); - popup1->move( (desktop->screenGeometry(screen).x())+x, (desktop->screenGeometry(screen).y())+y ); - popup1->show(); - - //put the first parameters - SetParameters(treeDet->topLevelItem(0)); - - //initializations - connect(treeDet, SIGNAL(itemDoubleClicked(QTreeWidgetItem *,int)) , this, SLOT(SetParameters(QTreeWidgetItem *))); - -} -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabDebugging::SetParameters(QTreeWidgetItem *item){ - char value[200]; - int i; - - - switch(detType){ - - case slsDetectorDefs::MYTHEN: - if(item->text(0).contains("Readout")){ - //find index - for(i=0;icount();i++) - if(item== treeDet->topLevelItem(i)) - break; - - det = myDet->getSlsDetector(i); - qDefs::checkErrorMessage(myDet,"qTabDebugging::SetParameters"); - lblDetectorId->setText(comboDetector->itemText(i)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SERIAL_NUMBER)); - lblDetectorSerial->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_FIRMWARE_VERSION)); - lblDetectorFirmware ->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION)); - lblDetectorSoftware->setText(QString(value)); - qDefs::checkErrorMessage(det,"qTabDebugging::SetParameters"); - - lblModuleId->setText(""); - lblModuleSerial->setText(""); - lblModuleFirmware->setText(""); - }else{ - //find index - for(i=0;icount();i++) - if(item->parent() == treeDet->topLevelItem(i)) - break; - int im = item->parent()->indexOfChild(item); - - det = myDet->getSlsDetector(i); - qDefs::checkErrorMessage(myDet,"qTabDebugging::SetParameters"); - lblDetectorId->setText(comboDetector->itemText(i)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SERIAL_NUMBER)); - lblDetectorSerial->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_FIRMWARE_VERSION)); - lblDetectorFirmware ->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION)); - lblDetectorSoftware->setText(QString(value)); - - lblModuleId->setText(QString("%1").arg(im)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::MODULE_SERIAL_NUMBER,im)); - lblModuleSerial->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::MODULE_FIRMWARE_VERSION,im)); - lblModuleFirmware->setText(QString(value)); - - qDefs::checkErrorMessage(det,"qTabDebugging::SetParameters"); - } - break; - - - - - - case slsDetectorDefs::EIGER: - //only if half module clicked - if(item->text(0).contains("Half Module")){ - //find index - for(i=0;icount();i++) - if(item== treeDet->topLevelItem(i)) - break; - - det = myDet->getSlsDetector(i); - qDefs::checkErrorMessage(myDet,"qTabDebugging::SetParameters"); - lblDetectorId->setText(comboDetector->itemText(i)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SERIAL_NUMBER)); - lblDetectorSerial->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_FIRMWARE_VERSION)); - lblDetectorFirmware ->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION)); - lblDetectorSoftware->setText(QString(value)); - - qDefs::checkErrorMessage(det,"qTabDebugging::SetParameters"); - } - break; - - - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::GOTTHARD: - //find index - for(i=0;icount();i++) - if(item== treeDet->topLevelItem(i)) - break; - - det = myDet->getSlsDetector(i); - qDefs::checkErrorMessage(myDet,"qTabDebugging::SetParameters"); - lblDetectorId->setText(comboDetector->itemText(i)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SERIAL_NUMBER)); - lblDetectorSerial->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_FIRMWARE_VERSION)); - lblDetectorFirmware ->setText(QString(value)); - sprintf(value,"%llx",(long long unsigned int)det->getId(slsDetectorDefs::DETECTOR_SOFTWARE_VERSION)); - lblDetectorSoftware->setText(QString(value)); - - qDefs::checkErrorMessage(det,"qTabDebugging::SetParameters"); - break; - - - - - default: - break; - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDebugging::TestDetector(){ -#ifdef VERBOSE - cout << "Testing" << endl; -#endif - - int retval=slsDetectorDefs::FAIL; - QString message; - QString Detector = "Detector"; - - //main messagebox title - switch(detType){ - case slsDetectorDefs::MYTHEN: - message = QString("Test Results for %1 and %2:

").arg(comboDetector->currentText(),comboModule->currentText()); - break; - case slsDetectorDefs::EIGER: Detector = "Half Module"; break; - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: Detector = "Module"; break; - default: break; - } - - - if(detType==slsDetectorDefs::MYTHEN) - message = QString("Test Results for %1 and %2:

").arg(comboDetector->currentText(),comboModule->currentText()); - else message = QString("Test Results for %1:

").arg(comboDetector->currentText()); - - //get sls det object - det = myDet->getSlsDetector(comboDetector->currentIndex()); - qDefs::checkErrorMessage(myDet,"qTabDebugging::TestDetector"); - - //detector firmware - if(chkDetectorFirmware->isChecked()){ - retval = det->digitalTest(slsDetectorDefs::DETECTOR_FIRMWARE_TEST); - if(retval== slsDetectorDefs::FAIL) message.append(QString("%1 Firmware: FAIL
").arg(Detector)); - else message.append(QString("%1 Firmware: %2
").arg(Detector,QString::number(retval))); -#ifdef VERBOSE - cout<<"Detector Firmware: "<isChecked()){ - retval = det->digitalTest(slsDetectorDefs::DETECTOR_SOFTWARE_TEST); - if(retval== slsDetectorDefs::FAIL) message.append(QString("%1 Software: FAIL
").arg(Detector)); - else message.append(QString("%1 Software: %2
").arg(Detector,QString::number(retval))); -#ifdef VERBOSE - cout<<"Detector Software: "<isChecked()){ - retval = det->digitalTest(slsDetectorDefs::DETECTOR_BUS_TEST); - if(retval== slsDetectorDefs::FAIL) message.append(QString("%1 Bus:     FAIL
").arg(Detector)); - else message.append(QString("%1 Bus:     %2
").arg(Detector,QString::number(retval))); -#ifdef VERBOSE - cout<<"Detector Bus: "<isChecked()){ - retval = det->digitalTest(slsDetectorDefs::DETECTOR_MEMORY_TEST); - if(retval== slsDetectorDefs::FAIL) message.append(QString("%1 Memory:  FAIL
").arg(Detector)); - else message.append(QString("%1 Memory:  %2
").arg(Detector,QString::number(retval))); -#ifdef VERBOSE - cout<<"Detector Memory: "<isChecked()){ - retval = det->digitalTest(slsDetectorDefs::CHIP_TEST,comboModule->currentIndex()); - if(retval== slsDetectorDefs::FAIL) message.append("
Chip: FAIL
"); - else message.append(QString("Chip: %1
").arg(retval)); -#ifdef VERBOSE - cout<<"Chip: "<isChecked()){ - retval = det->digitalTest(slsDetectorDefs::MODULE_FIRMWARE_TEST,comboModule->currentIndex()); - if(retval== slsDetectorDefs::FAIL) message.append("Module Firmware: FAIL
"); - else message.append(QString("Module Firmware: %1
").arg(retval)); -#ifdef VERBOSE - cout<<"Module Firmware: "< -#include -#include -//C++ Include Headers -#include - -using namespace std; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -int qTabDeveloper::NUM_DAC_WIDGETS(0); -int qTabDeveloper::NUM_ADC_WIDGETS(0); - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabDeveloper::qTabDeveloper(qDetectorMain *parent,multiSlsDetector*& detector): - thisParent(parent), - myDet(detector), - det(0), - boxDacs(0), - boxAdcs(0), - lblHV(0), - comboHV(0), - adcTimer(0), - dacLayout(0){ - for(int i=0;i<20;i++) { - lblDacs[i]=0; - lblAdcs[i]=0; - spinDacs[i]=0; - spinAdcs[i]=0; - lblDacsmV[i]=0; - } - SetupWidgetWindow(); - Initialization(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabDeveloper::~qTabDeveloper() { - delete myDet; - if(det) delete det; - if(thisParent) delete thisParent; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::SetupWidgetWindow() { - //Detector Type - detType=myDet->getDetectorsType(); - - //palette - red = QPalette(); - red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); - - - //the number of dacs and adcs - switch(detType){ - case slsDetectorDefs::MYTHEN: - NUM_DAC_WIDGETS = 6; - NUM_ADC_WIDGETS = 0; - dacNames.push_back("v Trimbit:"); - dacNames.push_back("v Threshold:"); - dacNames.push_back("v Shaper1:"); - dacNames.push_back("v Shaper2:"); - dacNames.push_back("v Calibration:"); - dacNames.push_back("v Preamp:"); - break; - case slsDetectorDefs::EIGER: - NUM_DAC_WIDGETS = 17; - NUM_ADC_WIDGETS = 6; - - dacNames.push_back("v SvP:"); - dacNames.push_back("v SvN"); - dacNames.push_back("v Vrf:"); - dacNames.push_back("v Vrs:"); - dacNames.push_back("v Vtr:"); - dacNames.push_back("v Vtgstv:"); - dacNames.push_back("v cal:"); - dacNames.push_back("v Vcp"); - dacNames.push_back("v Vcn:"); - dacNames.push_back("v Vis:"); - dacNames.push_back("v rxb_lb:"); - dacNames.push_back("v rxb_rb:"); - dacNames.push_back("v Vcmp_ll:"); - dacNames.push_back("v Vcmp_lr:"); - dacNames.push_back("v Vcmp_rl:"); - dacNames.push_back("v Vcmp_rr:"); - dacNames.push_back("v threshold:"); - - adcNames.push_back("Temperature FPGA Ext:"); - adcNames.push_back("Temperature 10GE:"); - adcNames.push_back("Temperature DCDC:"); - adcNames.push_back("Temperature SODL:"); - adcNames.push_back("Temperature SODR:"); - adcNames.push_back("Temperature FPGA:"); - - break; - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: - NUM_DAC_WIDGETS = 8; - NUM_ADC_WIDGETS = 2; - dacNames.push_back("v Reference:"); - dacNames.push_back("v Cascode n:"); - dacNames.push_back("v Cascode p:"); - dacNames.push_back("v Comp. Output:"); - dacNames.push_back("v Cascode out"); - dacNames.push_back("v Comp. Input:"); - dacNames.push_back("v Comp. Ref:"); - dacNames.push_back("i Base Test:"); - - adcNames.push_back("Temperature ADC:"); - adcNames.push_back("Temperature FPGA:"); - - break; - case slsDetectorDefs::MOENCH: - NUM_DAC_WIDGETS = 8; - NUM_ADC_WIDGETS = 2; - dacNames.push_back("v Dac 0:"); - dacNames.push_back("v Dac 1:"); - dacNames.push_back("v Dac 2:"); - dacNames.push_back("v Dac 3:"); - dacNames.push_back("v Dac 4:"); - dacNames.push_back("v Dac 5:"); - dacNames.push_back("v Dac 6:"); - dacNames.push_back("i Dac 7:"); - - adcNames.push_back("Temperature ADC:"); - adcNames.push_back("Temperature FPGA:"); - - break; - - - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - NUM_DAC_WIDGETS = 8; - NUM_ADC_WIDGETS = 1; - dacNames.push_back("v vb comp:"); - dacNames.push_back("v vdd prot:"); - dacNames.push_back("v vin com:"); - dacNames.push_back("v vref prech:"); - dacNames.push_back("v vb pixbuf:"); - dacNames.push_back("v vb ds:"); - dacNames.push_back("v vref ds:"); - dacNames.push_back("i vref comp:"); - - adcNames.push_back("Temperature ADC/FPGA:"); - - break; - - default: - cout << "ERROR: Unknown detector type: " + myDet->slsDetectorBase::getDetectorType(detType) << endl; - qDefs::Message(qDefs::CRITICAL,string("Unknown detector type:")+myDet->slsDetectorBase::getDetectorType(detType),"qTabDeveloper::SetupWidgetWindow"); - exit(-1); - break; - } - - - //layout - setFixedWidth(765); - setFixedHeight(20+50+(NUM_DAC_WIDGETS/2)*35); - //setHeight(340); - - scroll = new QScrollArea; - //scroll->setFrameShape(QFrame::NoFrame); - scroll->setWidget(this); - scroll->setWidgetResizable(true); - - layout = new QGridLayout(scroll); - layout->setContentsMargins(20,10,10,5); - setLayout(layout); - - //readout - comboDetector = new QComboBox(this); - //comboDetector->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed); - comboDetector->addItem("All"); - //add detectors - for(int i=1;igetNumberOfDetectors()+1;i++) - comboDetector->addItem(QString(myDet->getHostname(i-1).c_str())); - comboDetector->setCurrentIndex(0); - - - //dacs - boxDacs = new QGroupBox("Dacs",this); - boxDacs->setFixedHeight(25+(NUM_DAC_WIDGETS/2)*35); - CreateDACWidgets(); - - //HV for gotthard - if ((detType==slsDetectorDefs::GOTTHARD) || - (detType==slsDetectorDefs::PROPIX) || - (detType==slsDetectorDefs::MOENCH)){ - boxDacs->setFixedHeight(boxDacs->height()+35); - - lblHV = new QLabel("High Voltage",boxDacs); - comboHV = new QComboBox(boxDacs); - comboHV->addItem("0"); - comboHV->addItem("90"); - comboHV->addItem("110"); - comboHV->addItem("120"); - comboHV->addItem("150"); - comboHV->addItem("180"); - comboHV->addItem("200"); - tipHV = "Set high voltage to 0, 90, 110, 120, 150 or 200V."; - lblHV->setToolTip(tipHV); - comboHV->setToolTip(tipHV); - dacLayout->addWidget(lblHV,(int)(NUM_DAC_WIDGETS/2),1); - dacLayout->addWidget(comboHV,(int)(NUM_DAC_WIDGETS/2),2); - connect(comboHV, SIGNAL(currentIndexChanged(int)), this, SLOT(SetHighVoltage())); - } - layout->addWidget(comboDetector,0,0); - layout->addWidget(boxDacs,1,0); - - //adcs - if(NUM_ADC_WIDGETS) { - int rows = NUM_ADC_WIDGETS/2; - if (NUM_ADC_WIDGETS%2)rows++; - setFixedHeight(20+(50+(NUM_DAC_WIDGETS/2)*35)+(50+rows*35)); - boxAdcs = new QGroupBox("ADCs",this); - boxAdcs->setFixedHeight(25+rows*35); - layout->addWidget(boxAdcs,2,0); - CreateADCWidgets(); - //to make the adcs at the bottom most - if (detType!=slsDetectorDefs::EIGER) { - int diff = 340-height(); - setFixedHeight(340); - layout->setVerticalSpacing(diff/2); - } - //timer to check adcs - /*adcTimer = new QTimer(this); adc timer disabled, display adcs only when refreshing developer tab */ - } - - qDefs::checkErrorMessage(myDet,"qTabDeveloper::SetupWidgetWindow"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::Initialization(){ - /*if(NUM_ADC_WIDGETS) connect(adcTimer, SIGNAL(timeout()), this, SLOT(RefreshAdcs()));*/ - - for(int i=0;isetMinimum(-1); - spinDacs[i]->setMaximum(10000); - lblDacsmV[i]= new QLabel("",boxDacs); - - - dacLayout->addWidget(lblDacs[i],(int)(i/2),((i%2)==0)?1:5); - dacLayout->addWidget(spinDacs[i],(int)(i/2),((i%2)==0)?2:6); - dacLayout->addWidget(lblDacsmV[i],(int)(i/2),((i%2)==0)?3:7); - if(!(i%2)){ - dacLayout->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed),(int)(i/2),0); - dacLayout->addItem(new QSpacerItem(60,20,QSizePolicy::Fixed,QSizePolicy::Fixed),(int)(i/2),4); - dacLayout->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed),(int)(i/2),8); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::CreateADCWidgets(){ - QGridLayout *adcLayout = new QGridLayout(boxAdcs); - - for(int i=0;isetReadOnly(true); - - adcLayout->addWidget(lblAdcs[i],(int)(i/2),((i%2)==0)?1:4); - adcLayout->addWidget(spinAdcs[i],(int)(i/2),((i%2)==0)?2:5); - if(!(i%2)){ - adcLayout->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed),(int)(i/2),0); - adcLayout->addItem(new QSpacerItem(60,20,QSizePolicy::Fixed,QSizePolicy::Fixed),(int)(i/2),3); - adcLayout->addItem(new QSpacerItem(20,20,QSizePolicy::Fixed,QSizePolicy::Fixed),(int)(i/2),6); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::SetDacValues(int id){ -#ifdef VERBOSE - cout << "Setting dac:" << dacNames[id] << " : " << spinDacs[id]->value() << endl; -#endif - - int detid = comboDetector->currentIndex(); - if(detid) - det = myDet->getSlsDetector(detid-1); - - //all detectors - if(!detid){ - myDet->setDAC((dacs_t)spinDacs[id]->value(),getSLSIndex(id),0); - lblDacsmV[id]->setText(QString("%1mV").arg(myDet->setDAC(-1,getSLSIndex(id),1),-10)); - qDefs::checkErrorMessage(myDet,"qTabDeveloper::SetDacValues"); - } - //specific detector - else{ - det->setDAC((dacs_t)spinDacs[id]->value(),getSLSIndex(id),0); - lblDacsmV[id]->setText(QString("%1mV").arg(det->setDAC(-1,getSLSIndex(id),1),-10)); - qDefs::checkErrorMessage(det,"qTabDeveloper::SetDacValues"); - } - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::SetHighVoltage(){ -#ifdef VERBOSE - cout << "Setting high voltage:" << comboHV->currentText().toAscii().constData() << endl; -#endif - - int detid = comboDetector->currentIndex(); - if(detid) - det = myDet->getSlsDetector(detid-1); - - int highvoltage = comboHV->currentText().toInt(); - int ret; - - //all detectors - if(!detid){ - ret = myDet->setDAC(highvoltage,slsDetectorDefs::HV_POT,0); - qDefs::checkErrorMessage(myDet,"qTabDeveloper::SetHighVoltage"); - } - //specific detector - else{ - ret = det->setDAC(highvoltage,slsDetectorDefs::HV_POT,0); - qDefs::checkErrorMessage(det,"qTabDeveloper::SetHighVoltage"); - } - - - //error - if(ret != highvoltage){ - qDefs::Message(qDefs::CRITICAL,"High Voltage could not be set to this value.","qTabDeveloper::SetHighVoltage"); - lblHV->setPalette(red); - lblHV->setText("High Voltage:*"); - QString errTip = tipHV+QString("

High Voltage could not be set. The return value is ")+ - QString::number(ret)+ QString(""); - lblHV->setToolTip(errTip); - comboHV->setToolTip(errTip); - }else{ - lblHV->setPalette(lblDacs[0]->palette()); - lblHV->setText("High Voltage:"); - lblHV->setToolTip(tipHV); - comboHV->setToolTip(tipHV); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -slsDetectorDefs::dacIndex qTabDeveloper::getSLSIndex(int index){ - switch(detType){ - case slsDetectorDefs::MYTHEN: - switch(index){ - case 0: return slsDetectorDefs::TRIMBIT_SIZE; - case 1: return slsDetectorDefs::THRESHOLD; - case 2: return slsDetectorDefs::SHAPER1; - case 3: return slsDetectorDefs::SHAPER2; - case 4: return slsDetectorDefs::CALIBRATION_PULSE; - case 5: return slsDetectorDefs::PREAMP; - default: - qDefs::Message(qDefs::CRITICAL,"Unknown DAC/ADC Index. Weird Error Index:"+ index,"qTabDeveloper::getSLSIndex"); - Refresh(); - break; - } - break; - case slsDetectorDefs::EIGER: - switch(index){ - case 0: return slsDetectorDefs::E_SvP; - case 1: return slsDetectorDefs::E_SvN; - case 2: return slsDetectorDefs::E_Vrf; - case 3: return slsDetectorDefs::E_Vrs; - case 4: return slsDetectorDefs::E_Vtr; - case 5: return slsDetectorDefs::E_Vtgstv; - case 6: return slsDetectorDefs::E_cal; - case 7: return slsDetectorDefs::E_Vcp; - case 8: return slsDetectorDefs::E_Vcn; - case 9: return slsDetectorDefs::E_Vis; - case 10:return slsDetectorDefs::E_rxb_lb; - case 11:return slsDetectorDefs::E_rxb_rb; - case 12:return slsDetectorDefs::E_Vcmp_ll; - case 13:return slsDetectorDefs::E_Vcmp_lr; - case 14:return slsDetectorDefs::E_Vcmp_rl; - case 15:return slsDetectorDefs::E_Vcmp_rr; - case 16:return slsDetectorDefs::THRESHOLD; - case 17:return slsDetectorDefs::TEMPERATURE_FPGAEXT; - case 18:return slsDetectorDefs::TEMPERATURE_10GE; - case 19:return slsDetectorDefs::TEMPERATURE_DCDC; - case 20:return slsDetectorDefs::TEMPERATURE_SODL; - case 21:return slsDetectorDefs::TEMPERATURE_SODR; - case 22:return slsDetectorDefs::TEMPERATURE_FPGA; - default: - qDefs::Message(qDefs::CRITICAL,"Unknown DAC/ADC Index. Weird Error Index:"+ index,"qTabDeveloper::getSLSIndex"); - Refresh(); - break; - } - break; - case slsDetectorDefs::MOENCH: - switch(index){ - case 0: return slsDetectorDefs::V_DAC0; - case 1: return slsDetectorDefs::V_DAC1; - case 2: return slsDetectorDefs::V_DAC2; - case 3: return slsDetectorDefs::V_DAC3; - case 4: return slsDetectorDefs::V_DAC4; - case 5: return slsDetectorDefs::V_DAC5; - case 6: return slsDetectorDefs::V_DAC6; - case 7: return slsDetectorDefs::V_DAC7; - case 8: return slsDetectorDefs::TEMPERATURE_ADC; - case 9:return slsDetectorDefs::TEMPERATURE_FPGA; - - default: - qDefs::Message(qDefs::CRITICAL,"Unknown DAC/ADC Index. Weird Error. Index:"+ index,"qTabDeveloper::getSLSIndex"); - Refresh(); - break; - } - break; - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: - switch(index){ - case 0: return slsDetectorDefs::G_VREF_DS; - case 1: return slsDetectorDefs::G_VCASCN_PB; - case 2: return slsDetectorDefs::G_VCASCP_PB; - case 3: return slsDetectorDefs::G_VOUT_CM; - case 4: return slsDetectorDefs::G_VCASC_OUT; - case 5: return slsDetectorDefs::G_VIN_CM; - case 6: return slsDetectorDefs::G_VREF_COMP; - case 7: return slsDetectorDefs::G_IB_TESTC; - case 8: return slsDetectorDefs::TEMPERATURE_ADC; - case 9:return slsDetectorDefs::TEMPERATURE_FPGA; - default: - qDefs::Message(qDefs::CRITICAL,"Unknown DAC/ADC Index. Weird Error Index:"+ index,"qTabDeveloper::getSLSIndex"); - Refresh(); - break; - } - break; - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - - switch(index){ - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - return (slsDetectorDefs::dacIndex)index; - break; - case 8: return slsDetectorDefs::TEMPERATURE_ADC; - default: - qDefs::Message(qDefs::CRITICAL,"Unknown DAC/ADC Index. Weird Error Index:"+ index,"qTabDeveloper::getSLSIndex"); - Refresh(); - break; - } - break; - default: - cout << "Unknown detector type:" + myDet->slsDetectorBase::getDetectorType(detType) << endl; - qDefs::Message(qDefs::CRITICAL,string("Unknown detector type:")+myDet->slsDetectorBase::getDetectorType(detType),"qTabDeveloper::getSLSIndex"); - qDefs::checkErrorMessage(myDet,"qTabDeveloper::getSLSIndex"); - exit(-1); - break; - } - return slsDetectorDefs::HUMIDITY; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::RefreshAdcs(){ - if(!thisParent->isCurrentlyTabDeveloper()) - return; - -#ifdef VERYVERBOSE - cout << "Updating ADCs" <stop();*/ - - int detid = comboDetector->currentIndex(); - if(detid) - det = myDet->getSlsDetector(detid-1); - - for(int i=0;igetADC(getSLSIndex(i+NUM_DAC_WIDGETS),-1); - - if(value == -1) - spinAdcs[i]->setText(QString("Different values")); - else { - if(detType == slsDetectorDefs::EIGER || detType == slsDetectorDefs::JUNGFRAU || detType == slsDetectorDefs::JUNGFRAUCTB) - value/=1000.00; - spinAdcs[i]->setText(QString::number(value,'f',2)+0x00b0+QString("C")); - } - } - //specific detector - else{ - double value = (double)det->getADC(getSLSIndex(i+NUM_DAC_WIDGETS)); - - if(detType == slsDetectorDefs::EIGER || detType == slsDetectorDefs::JUNGFRAU || detType == slsDetectorDefs::JUNGFRAUCTB) - value/=1000.00; - spinAdcs[i]->setText(QString::number(value,'f',2)+0x00b0+QString("C")); - } - } - - - /*adcTimer->start(ADC_TIMEOUT);*/ - qDefs::checkErrorMessage(myDet,"qTabDeveloper::RefreshAdcs"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabDeveloper::Refresh(){ -#ifdef VERBOSE - cout << endl << "**Updating Developer Tab" << endl; -#endif - - - int detid = comboDetector->currentIndex(); - if(detid) - det = myDet->getSlsDetector(detid-1); - - - //dacs -#ifdef VERBOSE - cout << "Getting DACs" << NUM_DAC_WIDGETS <setValue((double)myDet->setDAC(-1,getSLSIndex(i),0)); - lblDacsmV[i]->setText(QString("%1mV").arg(myDet->setDAC(-1,getSLSIndex(i),1),-10)); - } - //specific detector - else{ - spinDacs[i]->setValue((double)det->setDAC(-1,getSLSIndex(i),0)); - lblDacsmV[i]->setText(QString("%1mV").arg(det->setDAC(-1,getSLSIndex(i),1),-10)); - } - } - - - //adcs - if(NUM_ADC_WIDGETS) RefreshAdcs(); - - //gotthard -high voltage - if((detType == slsDetectorDefs::GOTTHARD) || - (detType == slsDetectorDefs::PROPIX) || - (detType == slsDetectorDefs::MOENCH)){ - disconnect(comboHV, SIGNAL(currentIndexChanged(int)), this, SLOT(SetHighVoltage())); - - //default should be correct - lblHV->setPalette(lblDacs[0]->palette()); - lblHV->setText("High Voltage:"); - lblHV->setToolTip(tipHV); - comboHV->setToolTip(tipHV); - //getting hv value - int ret; - if(!detid) ret = (int)myDet->setDAC(-1,slsDetectorDefs::HV_POT,0); - else ret = (int)det->setDAC(-1,slsDetectorDefs::HV_POT,0); - - switch(ret){ - case 0: comboHV->setCurrentIndex(0);break; - case 90: comboHV->setCurrentIndex(1);break; - case 110: comboHV->setCurrentIndex(2);break; - case 120: comboHV->setCurrentIndex(3);break; - case 150: comboHV->setCurrentIndex(4);break; - case 180: comboHV->setCurrentIndex(5);break; - case 200: comboHV->setCurrentIndex(6);break; - default: comboHV->setCurrentIndex(0);//error - lblHV->setPalette(red); - lblHV->setText("High Voltage:*"); - QString errTip = tipHV+QString("

High Voltage could not be set. The return value is ")+ - QString::number(ret)+ QString(""); - lblHV->setToolTip(errTip); - comboHV->setToolTip(errTip); - break; - } - - connect(comboHV, SIGNAL(currentIndexChanged(int)), this, SLOT(SetHighVoltage())); - } - -#ifdef VERBOSE - cout << "**Updated Developer Tab" << endl << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qTabDeveloper::Refresh"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorGui/src/qTabMeasurement.cpp b/slsDetectorGui/src/qTabMeasurement.cpp deleted file mode 100644 index caa3995c9..000000000 --- a/slsDetectorGui/src/qTabMeasurement.cpp +++ /dev/null @@ -1,926 +0,0 @@ -/* - * qTabMeasurement.cpp - * - * Created on: May 2, 2012 - * Author: l_maliakal_d - */ - -//Qt Project Class Headers -#include "qTabMeasurement.h" -#include "qDetectorMain.h" -//Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -//C++ Include Headers -#include -using namespace std; - - - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabMeasurement::qTabMeasurement(qDetectorMain *parent,multiSlsDetector*& detector, qDrawPlot*& plot): - thisParent(parent),myDet(detector),myPlot(plot),expertMode(false){ - setupUi(this); - SetupWidgetWindow(); - Initialization(); - SetupTimingMode(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabMeasurement::~qTabMeasurement(){ - delete myDet; - delete myPlot; - delete thisParent; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::SetupWidgetWindow(){ - - detType = myDet->getDetectorsType(); - - //Number of measurements - spinNumMeasurements->setValue((int)myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,-1)); - //Number of frames - spinNumFrames->setValue((int)myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,-1)); - //Exp Time - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,-1)*(1E-9)))); - spinExpTime->setValue(time); - comboExpUnit->setCurrentIndex((int)unit); - //period - time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::FRAME_PERIOD,-1)*(1E-9)))); - spinPeriod->setValue(time); - comboPeriodUnit->setCurrentIndex((int)unit); - //Number of Triggers - spinNumTriggers->setValue((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,-1)); - //delay - if (detType == slsDetectorDefs::EIGER) { - lblDelay->setEnabled(false); - spinDelay->setEnabled(false); - comboDelayUnit->setEnabled(false); - } else { - time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::DELAY_AFTER_TRIGGER,-1)*(1E-9)))); - spinDelay->setValue(time); - comboDelayUnit->setCurrentIndex((int)unit); - } - //gates - if ((detType == slsDetectorDefs::EIGER) || (detType == slsDetectorDefs::JUNGFRAU) || (detType == slsDetectorDefs::JUNGFRAUCTB)) { - lblNumGates->setEnabled(false); - spinNumGates->setEnabled(false); - } else - spinNumGates->setValue((int)myDet->setTimer(slsDetectorDefs::GATES_NUMBER,-1)); - //probes - if(detType == slsDetectorDefs::MYTHEN) - spinNumProbes->setValue((int)myDet->setTimer(slsDetectorDefs::PROBES_NUMBER,-1)); - //File Name - dispFileName->setText(QString(myDet->getFileName().c_str())); - //File Index - spinIndex->setValue(myDet->getFileIndex()); - //only initially - lblProgressIndex->setText(QString::number(0)); - //ly initially - progressBar->setValue(0); - //file write enabled/disabled - chkFile->setChecked(myDet->enableWriteToFile()); - dispFileName->setEnabled(myDet->enableWriteToFile()); - - //Timer to update the progress bar - progressTimer = new QTimer(this); - - //Hide the error message - red = QPalette(); - red.setColor(QPalette::Active,QPalette::WindowText,Qt::red); - acqPeriodTip = spinPeriod->toolTip(); - errPeriodTip = QString("Frame period between exposures.
" - " #period#

")+ - QString("Acquisition Period should be" - " greater than or equal to Exposure Time."); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::SetupWidgetWindow"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::SetExpertMode(bool enable){ - expertMode = enable; - qDefs::checkErrorMessage(myDet,"qTabMeasurement::SetExpertMode"); - - EnableProbes(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::SetupTimingMode(){ - //To be able to index items on a combo box - model = qobject_cast(comboTimingMode->model()); - QModelIndex index[NumTimingModes]; - QStandardItem* item[NumTimingModes]; - if (model) { - for(int i=0;iindex(i, comboTimingMode->modelColumn(), comboTimingMode->rootModelIndex()); - item[i] = model->itemFromIndex(index[i]); - } - //Enabling/Disabling depending on the detector type - switch(detType){ - case slsDetectorDefs::MYTHEN: - item[(int)Trigger_Exp_Series]->setEnabled(true); - item[(int)Trigger_Readout]->setEnabled(true); - item[(int)Gated]->setEnabled(true); - item[(int)Gated_Start]->setEnabled(true); - item[(int)Burst_Trigger]->setEnabled(false); - break; - case slsDetectorDefs::EIGER: - item[(int)Trigger_Exp_Series]->setEnabled(true); - item[(int)Trigger_Readout]->setEnabled(false); - item[(int)Gated]->setEnabled(true); - item[(int)Gated_Start]->setEnabled(false); - item[(int)Burst_Trigger]->setEnabled(true); - break; - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - item[(int)Trigger_Exp_Series]->setEnabled(true); - item[(int)Trigger_Readout]->setEnabled(false); - item[(int)Gated]->setEnabled(false); - item[(int)Gated_Start]->setEnabled(false); - item[(int)Burst_Trigger]->setEnabled(false); - break; - default: - cout << "Unknown detector type." << endl; - qDefs::Message(qDefs::CRITICAL,"Unknown detector type.","qTabMeasurement::SetupTimingMode"); - exit(-1); - break; - } - } - - GetModeFromDetector(true); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::GetModeFromDetector(bool startup){ -#ifdef VERBOSE - cout << "Getting timing mode" << endl; -#endif - //Get timing mode from detector - slsDetectorDefs::externalCommunicationMode mode = myDet->setExternalCommunicationMode(); - - //Setting the timing mode in gui - if(model && model->itemFromIndex(model->index(mode+1,comboTimingMode->modelColumn(), comboTimingMode->rootModelIndex()))->isEnabled()){ - - //these are things checked in setuptimingmode - - // to let qdrawplot know that triggers or frames are used - myPlot->setFrameEnabled(lblNumFrames->isEnabled()); - myPlot->setTriggerEnabled(lblNumTriggers->isEnabled()); - if((!startup) && (comboTimingMode->currentIndex() == (mode+1))){ - if(lblPeriod->isEnabled()) - CheckAcqPeriodGreaterThanExp(); - else{ - spinPeriod->setToolTip(acqPeriodTip); - lblPeriod->setToolTip(acqPeriodTip); - lblPeriod->setPalette(lblTimingMode->palette()); - lblPeriod->setText("Acquisition Period:"); - } - EnableProbes(); - emit CheckPlotIntervalSignal(); - return; - } - - //if the timing mode is Auto and - // number of Frames and number of triggers is 1, - // then the timing mode is 'None'. - // This is for the inexperienced user - if(mode==slsDetectorDefs::AUTO_TIMING){ - int frames = spinNumFrames->value(); - int triggers = spinNumTriggers->value(); - int storagecells = 0; - if (detType == slsDetectorDefs::JUNGFRAU) - storagecells = myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER, -1); - if((frames==1)&&(triggers==1)&&(storagecells==0)){ - comboTimingMode->setCurrentIndex((int)None); - SetTimingMode((int)None); - }else{ - comboTimingMode->setCurrentIndex((int)Auto); - SetTimingMode((int)Auto); - } - }else{ - //mode +1 since the detector class has no timingmode as "None" - comboTimingMode->setCurrentIndex((int)mode+1); - SetTimingMode((int)mode+1); - } - } - // Mode NOT ENABLED. - // This should not happen -only if the server and gui has a mismatch - // on which all modes are allowed in detectors - else{ - //check if the detector is not even connected - string offline = myDet->checkOnline(); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::GetModeFromDetector"); - - if(!offline.empty()){ - qDefs::Message(qDefs::CRITICAL,string("The detector(s) ")+offline+string(" is/are not connected. Exiting GUI."),"Main"); - cout << "The detector(s) " << offline << " is/are not connected. Exiting GUI." << endl; - exit(-1); - } - cout << "Unknown Timing Mode " << mode << " detected from detector" << endl; - qDefs::Message(qDefs::WARNING,"Unknown Timing Mode detected from detector." - "\n\nSetting the following defaults:\nTiming Mode \t: None\n" - "Number of Frames \t: 1\nNumber of Triggers \t: 1","qTabMeasurement::GetModeFromDetector"); - comboTimingMode->setCurrentIndex((int)None); - SetTimingMode((int)None); - } - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::GetModeFromDetector"); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - - -void qTabMeasurement::Initialization(){ - //Number of Measurements - connect(spinNumMeasurements,SIGNAL(valueChanged(int)), this, SLOT(setNumMeasurements(int))); - //File Name - connect(dispFileName, SIGNAL(editingFinished()),this, SLOT(setFileName())); - //File Index - connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - //Start Acquisition - connect(btnStart, SIGNAL(clicked()), this, SLOT(startAcquisition())); - //Stop Acquisition - connect(btnStop, SIGNAL(clicked()), this, SLOT(stopAcquisition())); - //Timing Mode - connect(comboTimingMode, SIGNAL(currentIndexChanged(int)), this, SLOT(SetTimingMode(int)));// - //progress bar - connect(progressTimer, SIGNAL(timeout()), this, SLOT(UpdateProgress())); - //enable write to file - connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - //Number of Frames - connect(spinNumFrames,SIGNAL(valueChanged(int)), this, SLOT(setNumFrames(int))); - //Exposure Time - connect(spinExpTime,SIGNAL(valueChanged(double)), this, SLOT(setExposureTime())); - connect(comboExpUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(setExposureTime())); - //Frame Period between exposures - connect(spinPeriod,SIGNAL(valueChanged(double)), this, SLOT(setAcquisitionPeriod())); - connect(comboPeriodUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(setAcquisitionPeriod())); - //Number of Triggers - connect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - - //Delay After Trigger - if (detType != slsDetectorDefs::EIGER) { - connect(spinDelay,SIGNAL(valueChanged(double)), this, SLOT(setDelay())); - connect(comboDelayUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(setDelay())); - } - - //Number of Gates - if ((detType != slsDetectorDefs::EIGER) && (detType != slsDetectorDefs::JUNGFRAU) && (detType != slsDetectorDefs::JUNGFRAUCTB)) - connect(spinNumGates,SIGNAL(valueChanged(int)), this, SLOT(setNumGates(int))); - - //Number of Probes - connect(spinNumProbes,SIGNAL(valueChanged(int)), this, SLOT(setNumProbes(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::Enable(bool enable){ - frameTimeResolved->setEnabled(enable); - frameNotTimeResolved->setEnabled(enable); - - //shortcut each time, else it doesnt work a second time - btnStart->setShortcut(QApplication::translate("TabMeasurementObject", "Shift+Space", 0, QApplication::UnicodeUTF8)); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::startAcquisition(){ - btnStart->setEnabled(false); - //if file write enabled and output dir doesnt exist - if((chkFile->isChecked())&&(thisParent->DoesOutputDirExist() == slsDetectorDefs::FAIL)){ - if(qDefs::Message(qDefs::QUESTION, - "Your data will not be saved.
Disable File write and Proceed with acquisition anyway?", - "qTabMeasurement::startAcquisition") == slsDetectorDefs::FAIL){ - btnStart->setEnabled(true); - return; - }else{ - //done because for receiver it cant save a file with blank file path and returns without acquiring even to the gui - disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - chkFile->setChecked(false); - EnableFileWrite(false); - connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - } - } - -#ifdef VERBOSE - cout << endl << endl << "Starting Acquisition" << endl; -#endif - lblProgressIndex->setText(QString::number(0)); - Enable(0); - progressBar->setValue(0); - progressTimer->start(100); - - emit StartSignal(); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::startAcquisition"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::stopAcquisition(){ -#ifdef VERBOSE - cout << "Stopping Acquisition" << endl<< endl; -#endif - myDet->stopAcquisition(); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::stopAcquisition"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::UpdateFinished(){ - UpdateProgress(); - disconnect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - spinIndex->setValue(myDet->getFileIndex()); - connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - progressTimer->stop(); - - Enable(1); - btnStart->setEnabled(true); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::UpdateFinished"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::SetCurrentMeasurement(int val){ - if((val)value()) - lblCurrentMeasurement->setText(QString::number(val)); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::UpdateProgress(){ - progressBar->setValue((int)myPlot->GetProgress()); - lblProgressIndex->setText(QString::number(myPlot->GetFrameIndex())); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::UpdateProgress"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setFileName(){ - QString fName = dispFileName->text(); -#ifdef VERBOSE - cout << "Setting File name to " << fName.toAscii().constData() << endl; -#endif - myDet->setFileName(fName.toAscii().data()); - - disconnect(dispFileName, SIGNAL(editingFinished()),this, SLOT(setFileName())); - dispFileName->setText(QString(myDet->getFileName().c_str())); - connect(dispFileName, SIGNAL(editingFinished()),this, SLOT(setFileName())); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setFileName"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabMeasurement::setRunIndex(int index){ -#ifdef VERBOSE - cout << "Setting File Index to " << index << endl; -#endif - myDet->setFileIndex(index); - - disconnect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - spinIndex->setValue(myDet->getFileIndex()); - connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setRunIndex"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setNumMeasurements(int val){ -#ifdef VERBOSE - cout << "Setting Number of Measurements to " << val << endl; -#endif - myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,val); - - disconnect(spinNumMeasurements,SIGNAL(valueChanged(int)), this, SLOT(setNumMeasurements(int))); - spinNumMeasurements->setValue((int)myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,-1)); - connect(spinNumMeasurements,SIGNAL(valueChanged(int)), this, SLOT(setNumMeasurements(int))); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setNumMeasurements"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setNumFrames(int val){ -#ifdef VERBOSE - cout << "Setting number of frames to " << val << endl; -#endif - myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,val); - - disconnect(spinNumFrames,SIGNAL(valueChanged(int)), this, SLOT(setNumFrames(int))); - spinNumFrames->setValue((int)myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,-1)); - connect(spinNumFrames,SIGNAL(valueChanged(int)), this, SLOT(setNumFrames(int))); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setNumFrames"); - - EnableProbes(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::CheckAcqPeriodGreaterThanExp(){ - double exptimeNS = qDefs::getNSTime((qDefs::timeUnit)comboExpUnit->currentIndex(),spinExpTime->value()); - double acqtimeNS = qDefs::getNSTime((qDefs::timeUnit)comboPeriodUnit->currentIndex(),spinPeriod->value()); - if(exptimeNS>acqtimeNS) { - spinPeriod->setToolTip(errPeriodTip); - lblPeriod->setToolTip(errPeriodTip); - lblPeriod->setPalette(red); - lblPeriod->setText("Acquisition Period:*"); - } - else { - spinPeriod->setToolTip(acqPeriodTip); - lblPeriod->setToolTip(acqPeriodTip); - lblPeriod->setPalette(lblTimingMode->palette()); - lblPeriod->setText("Acquisition Period:"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setExposureTime(){ - //Get the value of timer in ns - double exptimeNS = qDefs::getNSTime((qDefs::timeUnit)comboExpUnit->currentIndex(),spinExpTime->value()); -#ifdef VERBOSE - cout << "Setting acquisition time to " << exptimeNS << " clocks" << "/" << spinExpTime->value() << qDefs::getUnitString((qDefs::timeUnit)comboExpUnit->currentIndex()) << endl; -#endif - myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,(int64_t)exptimeNS); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setExposureTime"); - - if(lblPeriod->isEnabled()) - CheckAcqPeriodGreaterThanExp(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setAcquisitionPeriod(){ - //Get the value of timer in ns - double acqtimeNS = qDefs::getNSTime((qDefs::timeUnit)comboPeriodUnit->currentIndex(),spinPeriod->value()); -#ifdef VERBOSE - cout << "Setting frame period between exposures to " << acqtimeNS << " clocks"<< "/" << spinPeriod->value() << qDefs::getUnitString((qDefs::timeUnit)comboPeriodUnit->currentIndex()) << endl; -#endif - myDet->setTimer(slsDetectorDefs::FRAME_PERIOD,(int64_t)acqtimeNS); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setAcquisitionPeriod"); - - CheckAcqPeriodGreaterThanExp(); - //Check if the interval between plots is ok - emit CheckPlotIntervalSignal(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setNumTriggers(int val){ -#ifdef VERBOSE - cout << "Setting number of triggers to " << val << endl; -#endif - myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,val); - - disconnect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - spinNumTriggers->setValue((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,-1)); - connect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setNumTriggers"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setDelay(){ - //Get the value of timer in ns - double exptimeNS = qDefs::getNSTime((qDefs::timeUnit)comboDelayUnit->currentIndex(),spinDelay->value()); -#ifdef VERBOSE - cout << "Setting delay after trigger to " << exptimeNS << " clocks" << "/" << spinDelay->value() << qDefs::getUnitString((qDefs::timeUnit)comboDelayUnit->currentIndex()) << endl; -#endif - myDet->setTimer(slsDetectorDefs::DELAY_AFTER_TRIGGER,(int64_t)exptimeNS); -/* - //updating value set - disconnect(spinDelay,SIGNAL(valueChanged(double)), this, SLOT(setDelay())); - disconnect(comboDelayUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(setDelay())); - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::DELAY_AFTER_TRIGGER,-1)*(1E-9)))); - spinDelay->setValue(time); - comboDelayUnit->setCurrentIndex((int)unit); - connect(spinDelay,SIGNAL(valueChanged(double)), this, SLOT(setDelay())); - connect(comboDelayUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(setDelay())); -*/ - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setDelay"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setNumGates(int val){ -#ifdef VERBOSE - cout << "Setting number of gates to " << val << endl; -#endif - myDet->setTimer(slsDetectorDefs::GATES_NUMBER,val); - - disconnect(spinNumGates,SIGNAL(valueChanged(int)), this, SLOT(setNumGates(int))); - spinNumGates->setValue((int)myDet->setTimer(slsDetectorDefs::GATES_NUMBER,-1)); - connect(spinNumGates,SIGNAL(valueChanged(int)), this, SLOT(setNumGates(int))); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setNumGates"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::setNumProbes(int val){ -#ifdef VERBOSE - cout << "Setting number of probes to " << val << endl; -#endif - disconnect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - disconnect(spinNumProbes,SIGNAL(valueChanged(int)), this, SLOT(setNumProbes(int))); - - //set probes - int ret = myDet->setTimer(slsDetectorDefs::PROBES_NUMBER,val); - if(ret != val) - ret = myDet->setTimer(slsDetectorDefs::PROBES_NUMBER,-1); - spinNumProbes->setValue(ret); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setNumProbes"); - - - //Setting number of probes should reset number of triggers to 1, need to check if enabled, cuz its updated when refresh - if((spinNumProbes->isEnabled()) && (ret > 0) && (spinNumTriggers->value() != 1)){ - qDefs::Message(qDefs::INFORMATION,"Number of Triggers has been reset to 1.
" - "This is mandatory to use probes.","qTabMeasurement::setNumProbes"); - cout << "Resetting Number of triggers to 1" << endl; - spinNumTriggers->setValue(1); - } - qDefs::checkErrorMessage(myDet,"qTabMeasurement::setNumProbes"); - - connect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - connect(spinNumProbes,SIGNAL(valueChanged(int)), this, SLOT(setNumProbes(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::SetTimingMode(int mode){ -#ifdef VERBOSE - cout << "Setting Timing mode to " << comboTimingMode->currentText().toAscii().data() << endl; -#endif - //Default settings - lblNumFrames->setEnabled(false); spinNumFrames->setEnabled(false); - lblExpTime->setEnabled(false); spinExpTime->setEnabled(false); comboExpUnit->setEnabled(false); - lblPeriod->setEnabled(false); spinPeriod->setEnabled(false); comboPeriodUnit->setEnabled(false); - lblNumTriggers->setEnabled(false); spinNumTriggers->setEnabled(false); - lblDelay->setEnabled(false); spinDelay->setEnabled(false); comboDelayUnit->setEnabled(false); - lblNumGates->setEnabled(false); spinNumGates->setEnabled(false); - lblNumProbes->setEnabled(false); spinNumProbes->setEnabled(false); - - bool success = false; - switch(mode){ - case None://Exposure Time - lblExpTime->setEnabled(true); spinExpTime->setEnabled(true); comboExpUnit->setEnabled(true); - spinNumTriggers->setValue(1); - spinNumFrames->setValue(1); - if (detType == slsDetectorDefs::JUNGFRAU) - myDet->setTimer(slsReceiverDefs::STORAGE_CELL_NUMBER, 0); - if(myDet->setExternalCommunicationMode(slsDetectorDefs::AUTO_TIMING)==slsDetectorDefs::AUTO_TIMING) - success = true; - break; - case Auto://#Frames, ExpTime, Period - spinNumTriggers->setValue(1); - lblNumFrames->setEnabled(true); spinNumFrames->setEnabled(true); - lblExpTime->setEnabled(true); spinExpTime->setEnabled(true); comboExpUnit->setEnabled(true); - lblPeriod->setEnabled(true); spinPeriod->setEnabled(true); comboPeriodUnit->setEnabled(true); - if(myDet->setExternalCommunicationMode(slsDetectorDefs::AUTO_TIMING)==slsDetectorDefs::AUTO_TIMING) - success = true; - break; - case Trigger_Exp_Series://#(Frames), #Triggers, ExpTime, Period, (Delay) - if(detType == slsDetectorDefs::EIGER) //only 1 frame for each trigger for eiger - spinNumFrames->setValue(1); - else{ - lblNumFrames->setEnabled(true); spinNumFrames->setEnabled(true); - lblDelay->setEnabled(true); spinDelay->setEnabled(true); comboDelayUnit->setEnabled(true); - lblPeriod->setEnabled(true); spinPeriod->setEnabled(true); comboPeriodUnit->setEnabled(true); - } - lblExpTime->setEnabled(true); spinExpTime->setEnabled(true); comboExpUnit->setEnabled(true); - lblNumTriggers->setEnabled(true); spinNumTriggers->setEnabled(true); - if(myDet->setExternalCommunicationMode(slsDetectorDefs::TRIGGER_EXPOSURE)==slsDetectorDefs::TRIGGER_EXPOSURE) - success = true; - break; - case Trigger_Readout://#Frames, ExpTime, Period, (Delay) - spinNumTriggers->setValue(1); - lblNumFrames->setEnabled(true); spinNumFrames->setEnabled(true); - lblExpTime->setEnabled(true); spinExpTime->setEnabled(true); comboExpUnit->setEnabled(true); - lblPeriod->setEnabled(true); spinPeriod->setEnabled(true); comboPeriodUnit->setEnabled(true); - if(myDet->setExternalCommunicationMode(slsDetectorDefs::TRIGGER_READOUT)==slsDetectorDefs::TRIGGER_READOUT) - success = true; - break; - case Gated://#Frames, #(Gates) - if(detType != slsDetectorDefs::EIGER){ - lblNumGates->setEnabled(true); spinNumGates->setEnabled(true); - } - spinNumTriggers->setValue(1); - lblNumFrames->setEnabled(true); spinNumFrames->setEnabled(true); - - - if(myDet->setExternalCommunicationMode(slsDetectorDefs::GATE_FIX_NUMBER)==slsDetectorDefs::GATE_FIX_NUMBER) - success = true; - break; - case Gated_Start://#Frames, #Triggers, #Gates, ExpTime, Period - lblNumFrames->setEnabled(true); spinNumFrames->setEnabled(true); - lblExpTime->setEnabled(true); spinExpTime->setEnabled(true); comboExpUnit->setEnabled(true); - lblPeriod->setEnabled(true); spinPeriod->setEnabled(true); comboPeriodUnit->setEnabled(true); - lblNumTriggers->setEnabled(true); spinNumTriggers->setEnabled(true); - lblNumGates->setEnabled(true); spinNumGates->setEnabled(true); - if(myDet->setExternalCommunicationMode(slsDetectorDefs::GATE_WITH_START_TRIGGER)==slsDetectorDefs::GATE_WITH_START_TRIGGER) - success = true; - break; - case Burst_Trigger://#Frames, ExpTime, Period, (Delay) - spinNumTriggers->setValue(1); - if(detType != slsDetectorDefs::EIGER){ - lblDelay->setEnabled(true); spinDelay->setEnabled(true); comboDelayUnit->setEnabled(true); - } - lblNumFrames->setEnabled(true); spinNumFrames->setEnabled(true); - lblExpTime->setEnabled(true); spinExpTime->setEnabled(true); comboExpUnit->setEnabled(true); - lblPeriod->setEnabled(true); spinPeriod->setEnabled(true); comboPeriodUnit->setEnabled(true); - if(myDet->setExternalCommunicationMode(slsDetectorDefs::BURST_TRIGGER)==slsDetectorDefs::BURST_TRIGGER) - success = true; - break; - default: - cout << "Timing mode unknown to GUI" << endl; - //This should never happen - qDefs::Message(qDefs::CRITICAL,"Timing mode unknown to GUI","qTabMeasurement::SetTimingMode"); - qDefs::checkErrorMessage(myDet,"qTabMeasurement::SetTimingMode"); - exit(-1); - } - qDefs::checkErrorMessage(myDet,"qTabMeasurement::SetTimingMode"); - if(!success){ - qDefs::Message(qDefs::WARNING,"The detector timing mode could not be set.\n" - "Please check the external flags." - "\n\nSetting the following defaults:\nTiming Mode \t: None\n" - "Number of Frames \t: 1\nNumber of Triggers \t: 1","qTabMeasurement::SetTimingMode"); - spinNumFrames->setValue(1); - spinNumTriggers->setValue(1); - if (detType == slsReceiverDefs::JUNGFRAU) - myDet->setTimer(slsDetectorDefs::STORAGE_CELL_NUMBER, 0); - comboTimingMode->setCurrentIndex((int)None); - return; - } - - - //Frame Period between exposures - if(lblPeriod->isEnabled()) - CheckAcqPeriodGreaterThanExp(); - else{ - spinPeriod->setToolTip(acqPeriodTip); - lblPeriod->setToolTip(acqPeriodTip); - lblPeriod->setPalette(lblTimingMode->palette()); - lblPeriod->setText("Acquisition Period:"); - } - - - //Check if Number of Probes should be enabled - EnableProbes(); - - // to let qdrawplot know that triggers or frames are used - myPlot->setFrameEnabled(lblNumFrames->isEnabled()); - myPlot->setTriggerEnabled(lblNumTriggers->isEnabled()); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::SetTimingMode"); - - emit CheckPlotIntervalSignal(); - - return; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::EnableFileWrite(bool enable){ -#ifdef VERBOSE - cout << "Enable File Write:" << enable << endl; -#endif - myDet->enableWriteToFile(enable); - dispFileName->setEnabled(enable); - if(enable) setFileName(); - myPlot->SetEnableFileWrite(enable); - - disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - chkFile->setChecked(myDet->enableWriteToFile()); - connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::EnableFileWrite"); -}; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::Refresh(){ -#ifdef VERBOSE - cout << endl << "**Updating Measurement Tab" << endl; -#endif - - if(!myPlot->isRunning()){ - //to prevent it from recalculating forever - disconnect(spinNumMeasurements, SIGNAL(valueChanged(int)), this, SLOT(setNumMeasurements(int))); - disconnect(dispFileName, SIGNAL(editingFinished()), this, SLOT(setFileName())); - disconnect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - disconnect(progressTimer, SIGNAL(timeout()), this, SLOT(UpdateProgress())); - disconnect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - disconnect(spinNumFrames, SIGNAL(valueChanged(int)), this, SLOT(setNumFrames(int))); - disconnect(spinExpTime, SIGNAL(valueChanged(double)), this, SLOT(setExposureTime())); - disconnect(comboExpUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(setExposureTime())); - disconnect(spinPeriod, SIGNAL(valueChanged(double)), this, SLOT(setAcquisitionPeriod())); - disconnect(comboPeriodUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(setAcquisitionPeriod())); - disconnect(spinNumTriggers, SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - if (detType != slsDetectorDefs::EIGER) { - disconnect(spinDelay, SIGNAL(valueChanged(double)), this, SLOT(setDelay())); - disconnect(comboDelayUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(setDelay())); - } - if ((detType != slsDetectorDefs::EIGER) && (detType != slsDetectorDefs::JUNGFRAU) && (detType != slsDetectorDefs::JUNGFRAUCTB)) - disconnect(spinNumGates, SIGNAL(valueChanged(int)), this, SLOT(setNumGates(int))); - -#ifdef VERBOSE - cout << "Getting number of measurements & frames" << endl; -#endif - //Number of measurements - spinNumMeasurements->setValue((int)myDet->setTimer(slsDetectorDefs::MEASUREMENTS_NUMBER,-1)); - //Number of frames - spinNumFrames->setValue((int)myDet->setTimer(slsDetectorDefs::FRAME_NUMBER,-1)); - - -#ifdef VERBOSE - cout << "Getting Exposure time and Acquisition Period" << endl; -#endif - //Exp Time - qDefs::timeUnit unit; - double time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,-1)*(1E-9)))); - spinExpTime->setValue(time); - comboExpUnit->setCurrentIndex((int)unit); - //period - time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::FRAME_PERIOD,-1)*(1E-9)))); - spinPeriod->setValue(time); - comboPeriodUnit->setCurrentIndex((int)unit); - - -#ifdef VERBOSE - cout << "Getting delay after trigger, number of triggers and number of gates" << endl; -#endif - //delay - if (detType != slsDetectorDefs::EIGER) - time = qDefs::getCorrectTime(unit,((double)(myDet->setTimer(slsDetectorDefs::DELAY_AFTER_TRIGGER,-1)*(1E-9)))); - - //gates - if ((detType != slsDetectorDefs::EIGER) && (detType != slsDetectorDefs::JUNGFRAU) && (detType != slsDetectorDefs::JUNGFRAUCTB) ) - spinNumGates->setValue((int)myDet->setTimer(slsDetectorDefs::GATES_NUMBER,-1)); - - - //Number of Triggers - spinNumTriggers->setValue((int)myDet->setTimer(slsDetectorDefs::CYCLES_NUMBER,-1)); - -#ifdef VERBOSE - cout << "Getting file name prefix, file index, file write enable and progress index" << endl; -#endif - //File Name - dispFileName->setText(QString(myDet->getFileName().c_str())); - //File Index - spinIndex->setValue(myDet->getFileIndex()); - //file write enabled/disabled - chkFile->setChecked(myDet->enableWriteToFile()); - - //progress label index - if(myDet->getFrameIndex()==-1) - lblProgressIndex->setText("0"); - else - lblProgressIndex->setText(QString::number(myDet->getFrameIndex())); - - connect(spinNumMeasurements,SIGNAL(valueChanged(int)), this, SLOT(setNumMeasurements(int))); - connect(dispFileName, SIGNAL(editingFinished()), this, SLOT(setFileName())); - connect(spinIndex, SIGNAL(valueChanged(int)), this, SLOT(setRunIndex(int))); - connect(progressTimer, SIGNAL(timeout()), this, SLOT(UpdateProgress())); - connect(chkFile, SIGNAL(toggled(bool)), this, SLOT(EnableFileWrite(bool))); - connect(spinNumFrames, SIGNAL(valueChanged(int)), this, SLOT(setNumFrames(int))); - connect(spinExpTime, SIGNAL(valueChanged(double)), this, SLOT(setExposureTime())); - connect(comboExpUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(setExposureTime())); - connect(spinPeriod, SIGNAL(valueChanged(double)), this, SLOT(setAcquisitionPeriod())); - connect(comboPeriodUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(setAcquisitionPeriod())); - connect(spinNumTriggers, SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - if (detType != slsDetectorDefs::EIGER) { - connect(spinDelay, SIGNAL(valueChanged(double)), this, SLOT(setDelay())); - connect(comboDelayUnit, SIGNAL(currentIndexChanged(int)), this, SLOT(setDelay())); - } - if ((detType != slsDetectorDefs::EIGER) && (detType != slsDetectorDefs::JUNGFRAU) && (detType != slsDetectorDefs::JUNGFRAUCTB)) - connect(spinNumGates, SIGNAL(valueChanged(int)), this, SLOT(setNumGates(int))); - - //timing mode - will also check if exptime>acq period and also enableprobes() - GetModeFromDetector(); - - // to let qdrawplot know that triggers or frames are used - myPlot->setFrameEnabled(lblNumFrames->isEnabled()); - myPlot->setTriggerEnabled(lblNumTriggers->isEnabled()); - - qDefs::checkErrorMessage(myDet,"qTabMeasurement::Refresh"); - } - -#ifdef VERBOSE - cout << "**Updated Measurement Tab" << endl << endl; -#endif -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabMeasurement::EnableProbes(){ - - //disconnect(spinNumProbes,SIGNAL(valueChanged(int)), this, SLOT(setNumProbes(int))); - disconnect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - - - //enabled only in expert mode and if #Frames > 1 - if((expertMode)&&(detType==slsDetectorDefs::MYTHEN)&&(spinNumFrames->value()>1)){ - lblNumProbes->setEnabled(true); - spinNumProbes->setEnabled(true); - spinNumProbes->setValue((int)myDet->setTimer(slsDetectorDefs::PROBES_NUMBER,-1)); -#ifdef VERBOSE - cout << "Getting number of probes : " << spinNumProbes->value() << endl; -#endif - - //Setting number of probes should reset number of triggers to 1, need to check if enabled, cuz its updated when refresh - if((spinNumProbes->isEnabled()) && (spinNumProbes->value() > 0) && (spinNumTriggers->value() != 1)){ - qDefs::Message(qDefs::INFORMATION,"Number of Triggers has been reset to 1.
" - "This is mandatory to use probes.","qTabMeasurement::EnableProbes"); - cout << "Resetting Number of triggers to 1" << endl; - spinNumTriggers->setValue(1); - } - qDefs::checkErrorMessage(myDet,"qTabMeasurement::EnableProbes"); - - connect(spinNumProbes, SIGNAL(valueChanged(int)), this, SLOT(setNumProbes(int))); - connect(spinNumTriggers, SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); - return; - } - cout << "Probes not enabled" << endl; - if(detType==slsDetectorDefs::MYTHEN) - spinNumProbes->setValue(0); - lblNumProbes->setEnabled(false); - spinNumProbes->setEnabled(false); - - //connect(spinNumProbes,SIGNAL(valueChanged(int)), this, SLOT(setNumProbes(int))); - connect(spinNumTriggers,SIGNAL(valueChanged(int)), this, SLOT(setNumTriggers(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorGui/src/qTabMessages.cpp b/slsDetectorGui/src/qTabMessages.cpp deleted file mode 100644 index 460351164..000000000 --- a/slsDetectorGui/src/qTabMessages.cpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - * qTabMessages.cpp - * - * Created on: Jun 26, 2012 - * Author: l_maliakal_d - */ - -/** Qt Project Class Headers */ -#include "qTabMessages.h" -#include "qDetectorMain.h" -/** Project Class Headers */ -/** Qt Include Headers */ -#include -#include -#include -#include - - -/** C++ Include Headers */ -#include -#include -using namespace std; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qTabMessages::qTabMessages(qDetectorMain* m):myMainTab(m),qout(0),qerr(0){ - SetupWidgetWindow(); - Initialization(); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qTabMessages::~qTabMessages(){ - delete myMainTab; - delete dispLog; - delete qout; - delete qerr; -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabMessages::SetupWidgetWindow(){ - /** Layout */ - QGridLayout *gridLayout = new QGridLayout(this); - - dispLog = new QTextEdit(this); - dispLog->setReadOnly(true); - dispLog->setFocusPolicy(Qt::NoFocus); - dispLog->setTextColor(Qt::darkBlue); - - - btnSave = new QPushButton("Save Log ",this); - btnSave->setFocusPolicy(Qt::NoFocus); - btnSave->setFixedWidth(100); - btnSave->setIcon(QIcon( ":/icons/images/save.png" )); - - btnClear = new QPushButton("Clear ",this); - btnClear->setFocusPolicy(Qt::NoFocus); - btnClear->setFixedWidth(100); - btnClear->setIcon(QIcon( ":/icons/images/erase.png" )); - - gridLayout->addItem(new QSpacerItem(15,10,QSizePolicy::Fixed,QSizePolicy::Fixed),0,0); - gridLayout->addWidget(btnSave,1,0,1,1); - gridLayout->addWidget(btnClear,1,4,1,1); - gridLayout->addItem(new QSpacerItem(15,10,QSizePolicy::Fixed,QSizePolicy::Fixed),2,0); - gridLayout->addWidget(dispLog,3,0,1,5); - - errMsg = " Please check Messages Tab. Following message was caught:

"; - qout=new qDebugStream(std::cout,this); - qerr=new qDebugStream(std::cerr,this); - -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabMessages::Initialization(){ - connect(btnSave,SIGNAL(clicked()),this,SLOT(SaveLog())); - connect(btnClear,SIGNAL(clicked()),this,SLOT(ClearLog())); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabMessages::customEvent(QEvent *e) { - if (e->type() == (STREAMEVENT)){ - QString temp = ((qStreamEvent*)e)->getString(); - dispLog->append(temp); - } - -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabMessages::SaveLog() { - QString fName = QString(myMainTab->GetFilePath()); - fName = fName+"/LogFile.txt"; - fName = QFileDialog::getSaveFileName(this,tr("Save Snapshot "), - fName,tr("Text files (*.txt);;All Files(*)")); - if (!fName.isEmpty()){ - QFile outfile; - outfile.setFileName(fName); - if(outfile.open(QIODevice::WriteOnly | QIODevice::Text)){//Append - QTextStream out(&outfile); - out<toPlainText() << endl; - qDefs::Message(qDefs::INFORMATION,string("The Log has been successfully saved to " - "")+fName.toAscii().constData(),"qTabMessages::SaveLog"); - } - else qDefs::Message(qDefs::WARNING,"Attempt to save log file failed.","qTabMessages::SaveLog"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabMessages::ClearLog() { - dispLog->clear(); -#ifdef VERBOSE - cout<<"Log Cleared"< -// C++ Include Headers -#include -#include -#include -using namespace std; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -const QString qTabPlot::modeNames[5]={"None","Energy Scan","Threshold Scan","Trimbits Scan","Custom Script Scan"}; - -QString qTabPlot::defaultPlotTitle(""); -QString qTabPlot::defaultHistXAxisTitle("Channel Number"); -QString qTabPlot::defaultHistYAxisTitle("Counts"); -QString qTabPlot::defaultImageXAxisTitle("Pixel"); -QString qTabPlot::defaultImageYAxisTitle("Pixel"); -QString qTabPlot::defaultImageZAxisTitle("Intensity"); - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabPlot::qTabPlot(QWidget *parent,multiSlsDetector*& detector, qDrawPlot*& plot): - QWidget(parent), - myDet(detector), - myPlot(plot), - isOneD(false), - isOriginallyOneD(false), - wrongInterval(0), - stackedLayout(0), - spinNthFrame(0), - spinTimeGap(0), - comboTimeGapUnit(0), - btnGroupScan(0), - btnGroupPlotType(0), - btnGroupHistogram(0){ - setupUi(this); - SetupWidgetWindow(); - Initialization(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -qTabPlot::~qTabPlot(){ - delete myDet; - delete myPlot; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetupWidgetWindow(){ - //error for interval between plots - red = new QPalette();; - red->setColor(QPalette::Active,QPalette::WindowText,Qt::red); - intervalTip = boxFrequency->toolTip(); - - -//scan arguments - btnGroupScan = new QButtonGroup(this); - btnGroupScan->addButton(radioLevel0,0); - btnGroupScan->addButton(radioLevel1,1); - btnGroupScan->addButton(radioFileIndex,2); - btnGroupScan->addButton(radioAllFrames,3); - -//plot type - btnGroupPlotType = new QButtonGroup(this); - btnGroupPlotType->addButton(radioNoPlot,0); - btnGroupPlotType->addButton(radioDataGraph,1); - btnGroupPlotType->addButton(radioHistogram,2); - -//histogram arguments - btnGroupHistogram = new QButtonGroup(this); - btnGroupHistogram->addButton(radioHistIntensity,0); - btnGroupHistogram->addButton(radioHistLevel0,1); - btnGroupHistogram->addButton(radioHistLevel1,2); - -// Plot Axis - dispTitle->setEnabled(false); - dispXAxis->setEnabled(false); - dispYAxis->setEnabled(false); - dispZAxis->setEnabled(false); - dispXMin->setEnabled(false); - dispYMin->setEnabled(false); - dispZMin->setEnabled(false); - dispXMax->setEnabled(false); - dispYMax->setEnabled(false); - dispZMax->setEnabled(false); - dispXMin->setValidator(new QDoubleValidator(dispXMin)); - dispYMin->setValidator(new QDoubleValidator(dispYMin)); - dispZMin->setValidator(new QDoubleValidator(dispZMin)); - dispXMax->setValidator(new QDoubleValidator(dispXMax)); - dispYMax->setValidator(new QDoubleValidator(dispYMax)); - dispZMax->setValidator(new QDoubleValidator(dispZMax)); - - //default titles - dispTitle->setText(""); - myPlot->SetPlotTitlePrefix(""); - dispXAxis->setText(defaultHistXAxisTitle); - dispYAxis->setText(defaultHistYAxisTitle); - myPlot->SetHistXAxisTitle(defaultHistXAxisTitle); - myPlot->SetHistYAxisTitle(defaultHistYAxisTitle); - dispXAxis->setText(defaultImageXAxisTitle); - dispYAxis->setText(defaultImageYAxisTitle); - dispZAxis->setText(defaultImageZAxisTitle); - myPlot->SetImageXAxisTitle(defaultImageXAxisTitle); - myPlot->SetImageYAxisTitle(defaultImageYAxisTitle); - myPlot->SetImageZAxisTitle(defaultImageZAxisTitle); - - // Plotting Frequency - - stackedLayout = new QStackedLayout; - stackedLayout->setSpacing(0); - spinNthFrame = new QSpinBox; - spinNthFrame->setMinimum(1); - spinNthFrame->setMaximum(2000000000); - spinTimeGap = new QDoubleSpinBox; - spinTimeGap->setMinimum(0); - spinTimeGap->setDecimals(3); - spinTimeGap->setMaximum(999999); - spinTimeGap->setValue(myPlot->GetMinimumPlotTimer()); - comboTimeGapUnit = new QComboBox; - comboTimeGapUnit->addItem("hr"); - comboTimeGapUnit->addItem("min"); - comboTimeGapUnit->addItem("s"); - comboTimeGapUnit->addItem("ms"); - comboTimeGapUnit->setCurrentIndex(3); - QWidget *w = new QWidget; - QHBoxLayout *h1 = new QHBoxLayout; - w->setLayout(h1); - h1->setContentsMargins(0,0,0,0); - h1->setSpacing(3); - h1->addWidget(spinTimeGap); - h1->addWidget(comboTimeGapUnit); - - stackedLayout->addWidget(w); - stackedLayout->addWidget(spinNthFrame); - stackWidget->setLayout(stackedLayout); - - stackedWidget->setCurrentIndex(0); - stackedWidget_2->setCurrentIndex(0); - - // Depending on whether the detector is 1d or 2d - switch(myDet->getDetectorsType()){ - case slsDetectorDefs::MYTHEN: - isOriginallyOneD = true; - pagePedestal->setEnabled(false); - pagePedestal_2->setEnabled(false); - chkBinary->setEnabled(false); - chkBinary_2->setEnabled(false); - break; - case slsDetectorDefs::EIGER: - isOriginallyOneD = false; - pagePedestal->setEnabled(false); - pagePedestal_2->setEnabled(false); - chkBinary->setEnabled(false); - chkBinary_2->setEnabled(false); - chkGapPixels->setEnabled(true); - break; - case slsDetectorDefs::GOTTHARD: - isOriginallyOneD = true; - break; - case slsDetectorDefs::PROPIX: - isOriginallyOneD = false; - break; - case slsDetectorDefs::MOENCH: - isOriginallyOneD = false; - break; - case slsDetectorDefs::JUNGFRAU: - case slsDetectorDefs::JUNGFRAUCTB: - isOriginallyOneD = false; - chkGainPlot->setEnabled(true); - break; - default: - cout << "ERROR: Detector Type is Generic" << endl; - exit(-1); - } - - Select1DPlot(isOriginallyOneD); - - //to check if this should be enabled - EnableScanBox(); - - //disable histogram initially - boxHistogram->hide(); - - if (chkGapPixels->isEnabled()) { - int ret = myDet->enableGapPixels(-1); - qDefs::checkErrorMessage(myDet,"qTabPlot::SetupWidgetWindow"); - chkGapPixels->setChecked((ret == 1) ? true : false); - } - - qDefs::checkErrorMessage(myDet,"qTabPlot::SetupWidgetWindow"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetPlotOptionsRightPage(){ - if(isOneD){ - int i = stackedWidget->currentIndex(); - if(i == (stackedWidget->count()-1)) - stackedWidget->setCurrentIndex(0); - else - stackedWidget->setCurrentIndex(i+1); - box1D->setTitle(QString("1D Plot Options %1").arg(stackedWidget->currentIndex()+1)); - } - else{ - int i = stackedWidget_2->currentIndex(); - if(i == (stackedWidget_2->count()-1)) - stackedWidget_2->setCurrentIndex(0); - else - stackedWidget_2->setCurrentIndex(i+1); - box2D->setTitle(QString("2D Plot Options %1").arg(stackedWidget_2->currentIndex()+1)); - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetPlotOptionsLeftPage(){ - if(isOneD){ - int i = stackedWidget->currentIndex(); - if(i == 0) - stackedWidget->setCurrentIndex(stackedWidget->count()-1); - else - stackedWidget->setCurrentIndex(i-1); - box1D->setTitle(QString("1D Plot Options %1").arg(stackedWidget->currentIndex()+1)); - } - else{ - int i = stackedWidget_2->currentIndex(); - if(i == 0) - stackedWidget_2->setCurrentIndex(stackedWidget_2->count()-1); - else - stackedWidget_2->setCurrentIndex(i-1); - box2D->setTitle(QString("2D Plot Options %1").arg(stackedWidget_2->currentIndex()+1)); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::Select1DPlot(bool b){ -#ifdef VERBOSE - if(b) - cout << "Selecting 1D Plot" << endl; - else - cout << "Selecting 2D Plot" << endl; -#endif - isOneD = b; - lblFrom->setEnabled(false); - lblTo->setEnabled(false); - lblFrom_2->setEnabled(false); - lblTo_2->setEnabled(false); - spinFrom->setEnabled(false); - spinFrom_2->setEnabled(false); - spinTo->setEnabled(false); - spinTo_2->setEnabled(false); - if(b){ - box1D->show(); - box2D->hide(); - chkZAxis->setEnabled(false); - chkZMin->setEnabled(false); - chkZMax->setEnabled(false); - myPlot->Select1DPlot(); - }else{ - box1D->hide(); - box2D->show(); - chkZAxis->setEnabled(true); - chkZMin->setEnabled(true); - chkZMax->setEnabled(true); - myPlot->Select2DPlot(); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::Initialization(){ -// Plot arguments box - connect(btnGroupPlotType,SIGNAL(buttonClicked(int)),this, SLOT(SetPlot())); -// Histogram arguments box - connect(btnGroupHistogram,SIGNAL(buttonClicked(int)),this, SLOT(SetHistogramOptions())); -// Scan box - connect(boxScan, SIGNAL(toggled(bool)), this, SLOT(EnableScanBox())); -// Snapshot box - connect(btnClone, SIGNAL(clicked()),myPlot, SLOT(ClonePlot())); - connect(btnCloseClones, SIGNAL(clicked()),myPlot, SLOT(CloseClones())); - connect(btnSaveClones, SIGNAL(clicked()),myPlot, SLOT(SaveClones())); -// 1D Plot box - //to change pages - connect(btnRight, SIGNAL(clicked()), this, SLOT(SetPlotOptionsRightPage())); - connect(btnLeft, SIGNAL(clicked()), this, SLOT(SetPlotOptionsLeftPage())); - - connect(chkSuperimpose, SIGNAL(toggled(bool)), this, SLOT(EnablePersistency(bool))); - connect(spinPersistency,SIGNAL(valueChanged(int)), myPlot,SLOT(SetPersistency(int))); - connect(chkPoints, SIGNAL(toggled(bool)), myPlot, SLOT(SetMarkers(bool))); - connect(chkLines, SIGNAL(toggled(bool)), myPlot, SLOT(SetLines(bool))); - connect(chk1DLog, SIGNAL(toggled(bool)), myPlot, SIGNAL(LogySignal(bool))); - connect(chkStatistics, SIGNAL(toggled(bool)), myPlot, SLOT(DisplayStatistics(bool))); - -// 2D Plot box - connect(chkInterpolate, SIGNAL(toggled(bool)),myPlot, SIGNAL(InterpolateSignal(bool))); - connect(chkContour, SIGNAL(toggled(bool)),myPlot, SIGNAL(ContourSignal(bool))); - connect(chkLogz, SIGNAL(toggled(bool)),myPlot, SIGNAL(LogzSignal(bool))); - connect(chkStatistics_2,SIGNAL(toggled(bool)),myPlot, SLOT(DisplayStatistics(bool))); -// Plotting frequency box - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - connect(comboTimeGapUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - connect(spinTimeGap, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); -// Plot Axis * - connect(chkTitle, SIGNAL(toggled(bool)), this, SLOT(EnableTitles())); - connect(chkXAxis, SIGNAL(toggled(bool)), this, SLOT(EnableTitles())); - connect(chkYAxis, SIGNAL(toggled(bool)), this, SLOT(EnableTitles())); - connect(chkZAxis, SIGNAL(toggled(bool)), this, SLOT(EnableTitles())); - connect(dispTitle, SIGNAL(textChanged(const QString&)), this, SLOT(SetTitles())); - connect(dispXAxis, SIGNAL(textChanged(const QString&)), this, SLOT(SetTitles())); - connect(dispYAxis, SIGNAL(textChanged(const QString&)), this, SLOT(SetTitles())); - connect(dispZAxis, SIGNAL(textChanged(const QString&)), this, SLOT(SetTitles())); - - connect(chkXMin, SIGNAL(toggled(bool)), this, SLOT(EnableXRange())); - connect(chkXMax, SIGNAL(toggled(bool)), this, SLOT(EnableXRange())); - connect(chkYMin, SIGNAL(toggled(bool)), this, SLOT(EnableYRange())); - connect(chkYMax, SIGNAL(toggled(bool)), this, SLOT(EnableYRange())); - connect(chkZMin, SIGNAL(toggled(bool)), this, SLOT(EnableZRange())); - connect(chkZMax, SIGNAL(toggled(bool)), this, SLOT(EnableZRange())); - connect(chkAspectRatio, SIGNAL(toggled(bool)), this, SLOT(checkAspectRatio())); - connect(this, SIGNAL(ResetZMinZMaxSignal(bool,bool,double,double)), myPlot, SIGNAL(ResetZMinZMaxSignal(bool,bool,double,double))); - - connect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - connect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - connect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - connect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - connect(dispZMin, SIGNAL(editingFinished()), this, SLOT(SetZRange())); - connect(dispZMax, SIGNAL(editingFinished()), this, SLOT(SetZRange())); -// Save - connect(btnSave, SIGNAL(clicked()), myPlot, SLOT(SavePlot())); - connect(chkSaveAll, SIGNAL(toggled(bool)), myPlot, SLOT(SaveAll(bool))); - -//pedstal - connect(chkPedestal, SIGNAL(toggled(bool)), myPlot, SLOT(SetPedestal(bool))); - connect(btnRecalPedestal, SIGNAL(clicked()), myPlot, SLOT(RecalculatePedestal())); - connect(chkPedestal_2, SIGNAL(toggled(bool)), myPlot, SLOT(SetPedestal(bool))); - connect(btnRecalPedestal_2, SIGNAL(clicked()), myPlot, SLOT(RecalculatePedestal())); - -//accumulate - connect(chkAccumulate, SIGNAL(toggled(bool)), myPlot, SLOT(SetAccumulate(bool))); - connect(btnResetAccumulate, SIGNAL(clicked()), myPlot, SLOT(ResetAccumulate())); - connect(chkAccumulate_2, SIGNAL(toggled(bool)), myPlot, SLOT(SetAccumulate(bool))); - connect(btnResetAccumulate_2, SIGNAL(clicked()), myPlot, SLOT(ResetAccumulate())); - - //binary - connect(chkBinary, SIGNAL(toggled(bool)), this, SLOT(SetBinary())); - connect(chkBinary_2, SIGNAL(toggled(bool)), this, SLOT(SetBinary())); - connect(spinFrom, SIGNAL(valueChanged(int)), this, SLOT(SetBinary())); - connect(spinFrom_2, SIGNAL(valueChanged(int)), this, SLOT(SetBinary())); - connect(spinTo, SIGNAL(valueChanged(int)), this, SLOT(SetBinary())); - connect(spinTo_2, SIGNAL(valueChanged(int)), this, SLOT(SetBinary())); - - //gainplot - if (chkGainPlot->isEnabled()) - connect(chkGainPlot, SIGNAL(toggled(bool)),myPlot, SIGNAL(GainPlotSignal(bool))); - - // gap pixels - if (chkGapPixels->isEnabled()) - connect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::EnablePersistency(bool enable){ -#ifdef VERBOSE - if(enable) - cout << "Enabling Persistency" << endl; - else - cout << "Disabling Persistency" << endl; -#endif - lblPersistency->setEnabled(enable); - spinPersistency->setEnabled(enable); - if(enable) myPlot->SetPersistency(spinPersistency->value()); - else myPlot->SetPersistency(0); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetTitles(){ -#ifdef VERBOSE - cout << "Setting Plot Titles" << endl; -#endif - // Plot Title - if(dispTitle->isEnabled()) - myPlot->SetPlotTitlePrefix(dispTitle->text()); - // X Axis - if(dispXAxis->isEnabled()){ - if(isOneD) myPlot->SetHistXAxisTitle(dispXAxis->text()); - else myPlot->SetImageXAxisTitle(dispXAxis->text()); - } - // Y Axis - if(dispYAxis->isEnabled()){ - if(isOneD) myPlot->SetHistYAxisTitle(dispYAxis->text()); - else myPlot->SetImageYAxisTitle(dispYAxis->text()); - } - // Z Axis - if(dispZAxis->isEnabled()) - myPlot->SetImageZAxisTitle(dispZAxis->text()); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::EnableTitles(){ - // Plot Title - dispTitle->setEnabled(chkTitle->isChecked()); - if(!chkTitle->isChecked()){ - myPlot->SetPlotTitlePrefix(""); - dispTitle->setText(""); - } - // X Axis - dispXAxis->setEnabled(chkXAxis->isChecked()); - if(!chkXAxis->isChecked()){ - if(isOneD){ - myPlot->SetHistXAxisTitle(defaultHistXAxisTitle); - dispXAxis->setText(defaultHistXAxisTitle); - } - else{ - myPlot->SetImageXAxisTitle(defaultImageXAxisTitle); - dispXAxis->setText(defaultImageXAxisTitle); - } - } - // Y Axis - dispYAxis->setEnabled(chkYAxis->isChecked()); - if(!chkYAxis->isChecked()){ - if(isOneD){ - myPlot->SetHistYAxisTitle(defaultHistYAxisTitle); - dispYAxis->setText(defaultHistYAxisTitle); - }else{ - myPlot->SetImageYAxisTitle(defaultImageYAxisTitle); - dispYAxis->setText(defaultImageYAxisTitle); - } - } - // Z Axis - dispZAxis->setEnabled(chkZAxis->isChecked()); - if(!chkZAxis->isChecked()){ - myPlot->SetImageZAxisTitle(defaultImageZAxisTitle); - dispZAxis->setText(defaultImageZAxisTitle); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::checkAspectRatio() { - if (chkAspectRatio->isChecked()) { - maintainAspectRatio(-1); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::maintainAspectRatio(int axis) { -#ifdef VERBOSE - cout << "Maintaining Aspect Ratio" << endl; -#endif - disconnect(chkXMin, SIGNAL(toggled(bool)), this, SLOT(EnableXRange())); - disconnect(chkXMax, SIGNAL(toggled(bool)), this, SLOT(EnableXRange())); - disconnect(chkYMin, SIGNAL(toggled(bool)), this, SLOT(EnableYRange())); - disconnect(chkYMax, SIGNAL(toggled(bool)), this, SLOT(EnableYRange())); - disconnect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - disconnect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - disconnect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - disconnect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - - double ranges[4]; - //get previous plot limits - ranges[qDefs::XMINIMUM] = myPlot->GetXMinimum(); - ranges[qDefs::XMAXIMUM] = myPlot->GetXMaximum(); - ranges[qDefs::YMINIMUM] = myPlot->GetYMinimum(); - ranges[qDefs::YMAXIMUM] = myPlot->GetYMaximum(); -#ifdef VERYVERBOSE - cprintf(BLUE,"ideal values: xmin:%f, xmax:%f ymin:%f ymax:%f\n",ranges[qDefs::XMINIMUM],ranges[qDefs::XMAXIMUM],ranges[qDefs::YMINIMUM],ranges[qDefs::YMAXIMUM]); -#endif - double idealAspectratio = (ranges[qDefs::XMAXIMUM] - ranges[qDefs::XMINIMUM]) / (ranges[qDefs::YMAXIMUM] - ranges[qDefs::YMINIMUM]); - - // enable all - chkXMin->setChecked(true); dispXMin->setEnabled(true); - chkXMax->setChecked(true); dispXMax->setEnabled(true); - chkYMin->setChecked(true); dispYMin->setEnabled(true); - chkYMax->setChecked(true); dispYMax->setEnabled(true); - - // if any empty, set it to previous plots boundaries - if (dispXMin->text().isEmpty()) dispXMin->setText(QString::number(myPlot->GetXMinimum())); - if (dispXMax->text().isEmpty()) dispXMax->setText(QString::number(myPlot->GetXMaximum())); - if (dispYMin->text().isEmpty()) dispYMin->setText(QString::number(myPlot->GetYMinimum())); - if (dispYMax->text().isEmpty()) dispYMax->setText(QString::number(myPlot->GetYMaximum())); - - //get actual limits - ranges[qDefs::XMINIMUM] = dispXMin->text().toDouble(); - ranges[qDefs::XMAXIMUM] = dispXMax->text().toDouble(); - ranges[qDefs::YMINIMUM] = dispYMin->text().toDouble(); - ranges[qDefs::YMAXIMUM] = dispYMax->text().toDouble(); -#ifdef VERYVERBOSE - cprintf(BLUE,"new limits: xmin:%f, xmax:%f ymin:%f ymax:%f\n",ranges[qDefs::XMINIMUM],ranges[qDefs::XMAXIMUM],ranges[qDefs::YMINIMUM],ranges[qDefs::YMAXIMUM]); -#endif - // calcualte new aspect ratio - double newAspectRatio = (ranges[qDefs::XMAXIMUM] - ranges[qDefs::XMINIMUM]) / (ranges[qDefs::YMAXIMUM] - ranges[qDefs::YMINIMUM]); - - // if not ideal aspect ratio - if (newAspectRatio != idealAspectratio) { - - // find the larger difference - if (axis == -1) { - if ((ranges[qDefs::XMAXIMUM] - ranges[qDefs::XMINIMUM]) > (ranges[qDefs::YMAXIMUM] - ranges[qDefs::YMINIMUM])) { - //change x - axis = 0; - } else { - //change y - axis = 1; - } - } - - // if x changed: y adjusted, y changed: x adjusted, aspect ratio clicked: larger one adjusted - double newval=0; - switch(axis) { - case 0: - //change x - newval = idealAspectratio * (ranges[qDefs::YMAXIMUM] - ranges[qDefs::YMINIMUM]) + ranges[qDefs::XMINIMUM]; - if (newval <= myPlot->GetXMaximum()) { - dispXMax->setText(QString::number(newval)); -#ifdef VERYVERBOSE - cprintf(BLUE,"new xmax: %f\n",newval); -#endif - } else { - newval = ranges[qDefs::XMAXIMUM] - (idealAspectratio * (ranges[qDefs::YMAXIMUM] - ranges[qDefs::YMINIMUM])); - dispXMin->setText(QString::number(newval)); -#ifdef VERYVERBOSE - cprintf(BLUE,"new xmin: %f\n",newval); -#endif - } - - break; - case 1: - // change y - newval = ((ranges[qDefs::XMAXIMUM] - ranges[qDefs::XMINIMUM]) / idealAspectratio) + ranges[qDefs::YMINIMUM]; - if (newval <= myPlot->GetYMaximum()) { - dispYMax->setText(QString::number(newval)); - //#ifdef VERYVERBOSE - cprintf(BLUE,"new ymax: %f\n",newval); - //#endif - } else { - newval = ranges[qDefs::YMAXIMUM] - ((ranges[qDefs::XMAXIMUM] - ranges[qDefs::XMINIMUM]) / idealAspectratio); - dispYMin->setText(QString::number(newval)); -#ifdef VERYVERBOSE - cprintf(BLUE,"new ymin: %f\n",newval); -#endif - } - break; - default: - break; - } - } - - connect(chkXMin, SIGNAL(toggled(bool)), this, SLOT(EnableXRange())); - connect(chkXMax, SIGNAL(toggled(bool)), this, SLOT(EnableXRange())); - connect(chkYMin, SIGNAL(toggled(bool)), this, SLOT(EnableYRange())); - connect(chkYMax, SIGNAL(toggled(bool)), this, SLOT(EnableYRange())); - connect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - connect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - connect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - connect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - - // disable mouse zooming if any checked - myPlot->DisableZoom(true); - emit DisableZoomSignal(true); - - // set XY values in plot - myPlot->SetXYRangeValues(dispXMin->text().toDouble(),qDefs::XMINIMUM); - myPlot->SetXYRangeValues(dispXMax->text().toDouble(),qDefs::XMAXIMUM); - myPlot->SetXYRangeValues(dispYMin->text().toDouble(),qDefs::YMINIMUM); - myPlot->SetXYRangeValues(dispYMax->text().toDouble(),qDefs::YMAXIMUM); - - - myPlot->IsXYRangeValues(true,qDefs::XMINIMUM); - myPlot->IsXYRangeValues(true,qDefs::XMAXIMUM); - myPlot->IsXYRangeValues(true,qDefs::YMINIMUM); - myPlot->IsXYRangeValues(true,qDefs::YMAXIMUM); - - // To remind the updateplot in qdrawplot to set range after updating plot - myPlot->SetXYRange(true); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabPlot::EnableXRange(){ -#ifdef VERBOSE - cout << "Enable X Axis Range" << endl; -#endif - // keeping aspect ratio - if (chkAspectRatio->isChecked()) { - maintainAspectRatio(1); - return; - } - disconnect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - disconnect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - - // enable/disable lineedit - if(chkXMin->isChecked()) { - dispXMin->setEnabled(true); - // if any empty, set it to previous plots boundaries - if (dispXMin->text().isEmpty()) - dispXMin->setText(QString::number(myPlot->GetXMinimum())); - } else { - dispXMin->setEnabled(false); - } - // enable/disable lineedit - if(chkXMax->isChecked()) { - dispXMax->setEnabled(true); - // if any empty, set it to previous plots boundaries - if (dispXMax->text().isEmpty()) - dispXMax->setText(QString::number(myPlot->GetXMaximum())); - } else { - dispXMax->setEnabled(false); - } - - connect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - connect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - - EnableRange(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::EnableYRange(){ -#ifdef VERBOSE - cout << "Enable Y Axis Range" << endl; -#endif - // keeping aspect ratio - if (chkAspectRatio->isChecked()) { - maintainAspectRatio(0); - return; - } - disconnect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - disconnect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - - // enable/disable lineedit - if(chkYMin->isChecked()) { - dispYMin->setEnabled(true); - // if any empty, set it to previous plots boundaries - if (dispYMin->text().isEmpty()) - dispYMin->setText(QString::number(myPlot->GetYMinimum())); - } else { - dispYMin->setEnabled(false); - } - // enable/disable lineedit - if(chkYMax->isChecked()) { - dispYMax->setEnabled(true); - // if any empty, set it to previous plots boundaries - if (dispYMax->text().isEmpty()) - dispYMax->setText(QString::number(myPlot->GetYMaximum())); - } else { - dispYMax->setEnabled(false); - } - - connect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - connect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - - EnableRange(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::EnableRange(){ -#ifdef VERBOSE - cout << "Enable Axes Range" << endl; -#endif - // disable mouse zooming if any checked - bool disableZoom= false; - if(chkYMin->isChecked() || chkYMax->isChecked() || chkYMin->isChecked() || chkYMax->isChecked()) - disableZoom = true; - emit DisableZoomSignal(disableZoom); - SetAxesRange(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetXAxisRange(){ -#ifdef VERBOSE - cout << "Setting X Axis Range" << endl; -#endif - - disconnect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - disconnect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - - if (dispXMin->text().toDouble() < myPlot->GetXMinimum()) { - qDefs::Message(qDefs::WARNING,"Outside Plot Range","qTabPlot::CheckZRange"); - dispXMin->setText(QString::number(myPlot->GetXMinimum())); - } - - if (dispXMax->text().toDouble() > myPlot->GetXMaximum()) { - qDefs::Message(qDefs::WARNING,"Outside Plot Range","qTabPlot::CheckZRange"); - dispXMax->setText(QString::number(myPlot->GetXMaximum())); - } - - connect(dispXMin, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - connect(dispXMax, SIGNAL(editingFinished()), this, SLOT(SetXAxisRange())); - - // keeping aspect ratio - if (chkAspectRatio->isChecked()) { - maintainAspectRatio(1); - return; - } - - SetAxesRange(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetYAxisRange(){ -#ifdef VERBOSE - cout << "Setting Y Axis Range" << endl; -#endif - - disconnect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - disconnect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - - if (dispYMin->text().toDouble() < myPlot->GetYMinimum()) { - qDefs::Message(qDefs::WARNING,"Outside Plot Range","qTabPlot::CheckZRange"); - dispYMin->setText(QString::number(myPlot->GetYMinimum())); - } - - if (dispYMax->text().toDouble() > myPlot->GetYMaximum()) { - qDefs::Message(qDefs::WARNING,"Outside Plot Range","qTabPlot::CheckZRange"); - dispYMax->setText(QString::number(myPlot->GetYMaximum())); - } - - connect(dispYMin, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - connect(dispYMax, SIGNAL(editingFinished()), this, SLOT(SetYAxisRange())); - - - // keeping aspect ratio - if (chkAspectRatio->isChecked()) { - maintainAspectRatio(0); - return; - } - - SetAxesRange(); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetAxesRange(){ -#ifdef VERBOSE - cout << "Setting Axes Range" << endl; -#endif - - // x min - if (dispXMin->isEnabled()) { - myPlot->SetXYRangeValues(dispXMin->text().toDouble(),qDefs::XMINIMUM); - myPlot->IsXYRangeValues(true,qDefs::XMINIMUM); - } - else - myPlot->IsXYRangeValues(false,qDefs::XMINIMUM); - // x max - if (dispXMax->isEnabled()) { - myPlot->SetXYRangeValues(dispXMax->text().toDouble(),qDefs::XMAXIMUM); - myPlot->IsXYRangeValues(true,qDefs::XMAXIMUM); - } - else - myPlot->IsXYRangeValues(false,qDefs::XMAXIMUM); - // y min - if (dispYMin->isEnabled()) { - myPlot->SetXYRangeValues(dispYMin->text().toDouble(),qDefs::YMINIMUM); - myPlot->IsXYRangeValues(true,qDefs::YMINIMUM); - } - else - myPlot->IsXYRangeValues(false,qDefs::YMINIMUM); - // y max - if (dispYMax->isEnabled()) { - myPlot->SetXYRangeValues(dispYMax->text().toDouble(),qDefs::YMAXIMUM); - myPlot->IsXYRangeValues(true,qDefs::YMAXIMUM); - } - else - myPlot->IsXYRangeValues(false,qDefs::YMAXIMUM); - - // To remind the updateplot in qdrawplot to set range after updating plot - myPlot->SetXYRange(true); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetZRange(){ - emit ResetZMinZMaxSignal( - (chkZMin->isChecked() && CheckZRange(dispZMin->text())), - (chkZMax->isChecked() && CheckZRange(dispZMax->text())), - dispZMin->text().toDouble(), - dispZMax->text().toDouble()); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::EnableZRange(){ - - disconnect(dispZMin, SIGNAL(editingFinished()), this, SLOT(SetZRange())); - disconnect(dispZMax, SIGNAL(editingFinished()), this, SLOT(SetZRange())); - - dispZMin->setEnabled(chkZMin->isChecked()); - dispZMax->setEnabled(chkZMax->isChecked()); - emit ResetZMinZMaxSignal( - (chkZMin->isChecked() && CheckZRange(dispZMin->text())), - (chkZMax->isChecked() && CheckZRange(dispZMax->text())), - dispZMin->text().toDouble(), - dispZMax->text().toDouble()); - - connect(dispZMin, SIGNAL(editingFinished()), this, SLOT(SetZRange())); - connect(dispZMax, SIGNAL(editingFinished()), this, SLOT(SetZRange())); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -bool qTabPlot::CheckZRange(QString value){ - if(value.isEmpty()) - return false; - - bool ok; - value.toDouble(&ok); - if(!ok) { - qDefs::Message(qDefs::WARNING,"Check Z Range
" - "Zmin and Zmax should be in double","qTabPlot::CheckZRange"); - return false; - } - - return true; -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetPlot(){ -#ifdef VERBOSE - cout << "Entering Set Plot()" ; -#endif - if(radioNoPlot->isChecked()){ - cout << " - No Plot" << endl; - - boxScan->show(); - boxHistogram->hide(); - myPlot->EnablePlot(false); - boxSnapshot->setEnabled(false); - boxSave->setEnabled(false); - boxFrequency->setEnabled(false); - boxPlotAxis->setEnabled(false); - boxScan->setEnabled(false); - - }else if(radioDataGraph->isChecked()){ - cout << " - DataGraph" << endl; - - boxScan->show(); - boxHistogram->hide(); - myPlot->EnablePlot(true); - Select1DPlot(isOriginallyOneD); - boxSnapshot->setEnabled(true); - boxSave->setEnabled(true); - boxFrequency->setEnabled(true); - boxPlotAxis->setEnabled(true); - if(!myPlot->isRunning()) - EnableScanBox(); - // To remind the updateplot in qdrawplot to set range after updating plot - myPlot->SetXYRange(true); - } - else{ - //histogram and 2d scans dont work - if(boxScan->isChecked()){ - qDefs::Message(qDefs::WARNING,"Histogram cannot be used together with 2D Scan Plots.
" - "Uncheck 2D Scan plots to plot Histograms", "qTabPlot::SetPlot"); - radioDataGraph->setChecked(true); - boxScan->show(); - boxHistogram->hide(); - return; - } - - cout << " - Histogram" << endl; - - if(radioHistIntensity->isChecked()){ - pageHistogram->setEnabled(true); - pageHistogram_2->setEnabled(true); - }else{ - pageHistogram->setEnabled(false); - pageHistogram_2->setEnabled(false); - } - boxScan->hide(); - boxHistogram->show(); - myPlot->EnablePlot(true); - Select1DPlot(isOriginallyOneD); - boxSnapshot->setEnabled(true); - boxSave->setEnabled(true); - boxFrequency->setEnabled(true); - boxPlotAxis->setEnabled(true); - if(!myPlot->isRunning()) - EnableScanBox(); - - //qDefs::Message(qDefs::INFORMATION,"Please check the Plot Histogram Options below " - // "before Starting Acquitision","qTabPlot::SetPlot"); - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabPlot::SetFrequency(){ -#ifdef VERBOSE - cout << "Setting Plot Interval Frequency" << endl; -#endif - disconnect(comboTimeGapUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - disconnect(spinTimeGap, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - disconnect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - disconnect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - double timeMS,acqPeriodMS; - double minPlotTimer = myPlot->GetMinimumPlotTimer(); - char cMin[200]; - sprintf(cMin,"%f ms",minPlotTimer); - - - acqPeriodMS = (myDet->setTimer(slsDetectorDefs::FRAME_PERIOD,-1)*(1E-6)); - //if period is 0, check exptime, if that is also 0, give warning and set to min timer - if(acqPeriodMS==0){ - acqPeriodMS = (myDet->setTimer(slsDetectorDefs::ACQUISITION_TIME,-1)*(1E-6)); - - if(acqPeriodMS==0){ - //to reduce the warnings displayed - if((comboFrequency->currentIndex() == 0) && (spinTimeGap->value() == minPlotTimer)); - else - qDefs::Message(qDefs::WARNING,"Interval between Plots:
" - "Every Nth Image: Period betwen Frames and Exposure Time cannot both be 0 ms.
" - "Resetting to minimum plotting time interval","qTabPlot::SetFrequency"); - comboFrequency->setCurrentIndex(0); - stackedLayout->setCurrentIndex(comboFrequency->currentIndex()); - spinTimeGap->setValue(minPlotTimer); - comboTimeGapUnit->setCurrentIndex(qDefs::MILLISECONDS); - timeMS=minPlotTimer; - //This is done so that its known which one was selected - myPlot->SetFrameFactor(0); - // Setting the timer value(ms) between plots - myPlot->SetPlotTimer(timeMS); - - connect(comboTimeGapUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - connect(spinTimeGap, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - qDefs::checkErrorMessage(myDet,"qTabPlot::SetFrequency"); - return; - } - } - - - stackedLayout->setCurrentIndex(comboFrequency->currentIndex()); - switch(comboFrequency->currentIndex()){ - case 0: - // Get the time interval from gui in ms - timeMS = (qDefs::getNSTime((qDefs::timeUnit)comboTimeGapUnit->currentIndex(),spinTimeGap->value()))/(1e6); - - if((int)timeMS==0){ - qDefs::Message(qDefs::WARNING,"Interval between Plots:
" - "Time Interval must be atleast >= 1 ms. Resetting to minimum plotting time interval.","qTabPlot::SetFrequency"); - spinTimeGap->setValue(minPlotTimer); - comboTimeGapUnit->setCurrentIndex(qDefs::MILLISECONDS); - timeMS=minPlotTimer; - } - - - //show red if min intervalInterval between Plots: You might be losing Images!","Plot"); - boxFrequency->setPalette(*red); - boxFrequency->setTitle("Interval between Plots*"); - QString errTip = intervalTip + QString("

" - "Time Interval Condition: min of ")+QString("%1").arg(minPlotTimer)+ - QString("ms.
You might be losing images!
"); - boxFrequency->setToolTip(errTip); - } - //show red if acqPeriodInterval between Plots: You might be losing Images!","Plot"); - boxFrequency->setPalette(*red); - boxFrequency->setTitle("Interval between Plots*"); - QString errTip = intervalTip + QString("

" - "Time Interval Acquisition Period should be >= Time Interval between plots.
" - "You might be losing images!
"); - boxFrequency->setToolTip(errTip); - } - //correct - else{ - boxFrequency->setPalette(boxSnapshot->palette()); - boxFrequency->setTitle("Interval between Plots"); - boxFrequency->setToolTip(intervalTip); - } - - //This is done so that its known which one was selected - myPlot->SetFrameFactor(0); - // Setting the timer value(ms) between plots - myPlot->SetPlotTimer(timeMS); -#ifdef VERBOSE - cout << "Plotting Frequency: Time Gap - " << spinTimeGap->value() << qDefs::getUnitString((qDefs::timeUnit)comboTimeGapUnit->currentIndex()) << endl; -#endif - break; - - - - - case 1: - - // gets the acq period * number of nth frames - timeMS = (spinNthFrame->value())*acqPeriodMS; - - //Show red to make sure the period between plotting is not less than minimum plot timer in ms - if(timeMSInterval between Plots: You might be losing Images!","Plot"); - boxFrequency->setPalette(*red); - boxFrequency->setTitle("Interval between Plots*"); - QString errTip = intervalTip + QString("

" - "Every nth Image Condition: min nth Image for this time period: ")+QString("%1").arg(minFrame)+ - QString(".
You might be losing images!
"); - boxFrequency->setToolTip(errTip); - }else{ - boxFrequency->setPalette(boxSnapshot->palette()); - boxFrequency->setTitle("Interval between Plots"); - boxFrequency->setToolTip(intervalTip); - } - - // Setting the timer value (nth frames) between plots - myPlot->SetFrameFactor(spinNthFrame->value()); - - -#ifdef VERBOSE - cout << "Plotting Frequency: Nth Frame - " << spinNthFrame->value() << endl; -#endif - break; - } - - connect(comboTimeGapUnit,SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - connect(spinTimeGap, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - qDefs::checkErrorMessage(myDet,"qTabPlot::SetFrequency"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabPlot::EnableScanBox(){ -#ifdef VERBOSE - cout << "Entering Enable Scan Box"<< endl; -#endif - disconnect(btnGroupPlotType,SIGNAL(buttonClicked(int)),this, SLOT(SetPlot())); - disconnect(boxScan, SIGNAL(toggled(bool)), this, SLOT(EnableScanBox())); - - int oldfreqvalue = myDet->setReadReceiverFrequency(); - - int mode0 = myDet->getScanMode(0); - int mode1 = myDet->getScanMode(1); - - radioHistLevel0->setEnabled(mode0); - radioHistLevel1->setEnabled(mode1); - int ang; - bool angConvert = myDet->getAngularConversion(ang); - myPlot->EnableAnglePlot(angConvert); - - radioDataGraph->setEnabled(true); - radioHistogram->setEnabled(true); - chkSuperimpose->setEnabled(true); - pageAccumulate->setEnabled(true); - pageAccumulate_2->setEnabled(true); - if((myDet->getDetectorsType() == slsDetectorDefs::GOTTHARD) || - (myDet->getDetectorsType() == slsDetectorDefs::PROPIX) || - (myDet->getDetectorsType() == slsDetectorDefs::JUNGFRAU) || - (myDet->getDetectorsType() == slsDetectorDefs::JUNGFRAUCTB) || - (myDet->getDetectorsType() == slsDetectorDefs::MOENCH)){ - pagePedestal->setEnabled(true); - pagePedestal_2->setEnabled(true); - chkBinary->setEnabled(true); - chkBinary_2->setEnabled(true); - } - - - - - //if angle plot or originally 2d, uncheck and disable scanbox - if ((angConvert) || (!isOriginallyOneD)){ - boxScan->setChecked(false); - boxScan->setEnabled(false); - - /**Newly added*/ - // To remind the updateplot in qdrawplot to set range after updating plot - if(!isOriginallyOneD) - myPlot->SetXYRange(true); - - //2d scans read every frame, not compulsory, but for historgrams - if((!isOriginallyOneD) && (mode0 || mode1)){ - //read every frame - disconnect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - disconnect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - comboFrequency->setCurrentIndex(1); - spinNthFrame->setValue(1); - SetFrequency(); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - } - - //persistency, accumulate, pedestal, binary - if(angConvert){ - if(chkSuperimpose->isChecked()) chkSuperimpose->setChecked(false); - if(chkPedestal->isChecked()) chkPedestal->setChecked(false); - if(chkPedestal_2->isChecked()) chkPedestal_2->setChecked(false); - if(chkAccumulate->isChecked()) chkAccumulate->setChecked(false); - if(chkAccumulate_2->isChecked())chkAccumulate_2->setChecked(false); - if(chkBinary->isChecked()) chkBinary->setChecked(false); - if(chkBinary_2->isChecked()) chkBinary_2->setChecked(false); - pagePedestal->setEnabled(false); - pagePedestal_2->setEnabled(false); - chkBinary->setEnabled(false); - chkBinary_2->setEnabled(false); - pageAccumulate->setEnabled(false); - pageAccumulate_2->setEnabled(false); - } - - if(angConvert){ - boxScan->setToolTip("Only 1D Plots enabled for Angle Plots"); - //disable histogram - if(radioHistogram->isChecked()){ - radioDataGraph->setChecked(true); - radioHistogram->setEnabled(false); - // To remind the updateplot in qdrawplot to set range after updating plot - myPlot->SetXYRange(true); - boxScan->show(); - boxHistogram->hide(); - } - } - } - - - - - //originally1d && not angle plot - else{ - boxScan->setToolTip(""); - boxScan->setEnabled(true); - /*if(mode0 || mode1) - boxScan->setChecked(true);*/ - - //2d enabled with boxscan - if(boxScan->isChecked()){ - - //2d for 1d detctors and histogram dont go - if(radioHistogram->isChecked()){ - radioDataGraph->setChecked(true); - // To remind the updateplot in qdrawplot to set range after updating plot - myPlot->SetXYRange(true); - boxScan->show(); - boxHistogram->hide(); - } - - //read every frame - disconnect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - disconnect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - comboFrequency->setCurrentIndex(1); - spinNthFrame->setValue(1); - SetFrequency(); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - - //enabling options - radioFileIndex->setEnabled(mode0||mode1); - if(mode0 && mode1){ - radioLevel0->setEnabled(false); - radioLevel1->setEnabled(false); - }else{ - radioLevel0->setEnabled(mode0); - radioLevel1->setEnabled(mode1); - } - //default is allframes if checked button is disabled - if(!btnGroupScan->checkedButton()->isEnabled()) - radioAllFrames->setChecked(true); - } - } - - - //histogram - if(radioHistogram->isChecked()){ - if(radioHistIntensity->isChecked()){ - pageHistogram->setEnabled(true); - pageHistogram_2->setEnabled(true); - }else{ - pageHistogram->setEnabled(false); - pageHistogram_2->setEnabled(false); - } - stackedWidget->setCurrentIndex(stackedWidget->count()-1); - stackedWidget_2->setCurrentIndex(stackedWidget_2->count()-1); - box1D->setTitle(QString("1D Plot Options %1 - Histogram").arg(stackedWidget->currentIndex()+1)); - box2D->setTitle(QString("2D Plot Options %1 - Histogram").arg(stackedWidget_2->currentIndex()+1)); - - if(chkSuperimpose->isChecked()) chkSuperimpose->setChecked(false); - if(chkPedestal->isChecked()) chkPedestal->setChecked(false); - if(chkPedestal_2->isChecked()) chkPedestal_2->setChecked(false); - if(chkAccumulate->isChecked()) chkAccumulate->setChecked(false); - if(chkAccumulate_2->isChecked())chkAccumulate_2->setChecked(false); - if(chkBinary->isChecked()) chkBinary->setChecked(false); - if(chkBinary_2->isChecked()) chkBinary_2->setChecked(false); - pagePedestal->setEnabled(false); - pagePedestal_2->setEnabled(false); - chkBinary->setEnabled(false); - chkBinary_2->setEnabled(false); - pageAccumulate->setEnabled(false); - pageAccumulate_2->setEnabled(false); - - //read every frame - disconnect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - disconnect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - comboFrequency->setCurrentIndex(1); - spinNthFrame->setValue(1); - SetFrequency(); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - - - }else{ - pageHistogram->setEnabled(false); - pageHistogram_2->setEnabled(false); - } - - - // if it was set to read every frame - if (oldfreqvalue != 0 && (comboFrequency->currentIndex() != 1 || spinNthFrame->value() != oldfreqvalue)) { - disconnect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - disconnect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - comboFrequency->setCurrentIndex(1); - spinNthFrame->setValue(1); - SetFrequency(); - connect(spinNthFrame, SIGNAL(editingFinished()), this, SLOT(SetFrequency())); - connect(comboFrequency, SIGNAL(currentIndexChanged(int)), this, SLOT(SetFrequency())); - } - - connect(btnGroupPlotType,SIGNAL(buttonClicked(int)),this, SLOT(SetPlot())); - connect(boxScan, SIGNAL(toggled(bool)), this, SLOT(EnableScanBox())); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabPlot::SetScanArgument(){ -#ifdef VERYVERBOSE - cout << "Entering qTabPlot::SetScanArgument()" << endl; -#endif - - //1d - if(isOriginallyOneD){ - dispXAxis->setText(defaultHistXAxisTitle); - dispYAxis->setText(defaultHistYAxisTitle); - myPlot->SetHistXAxisTitle(defaultHistXAxisTitle); - myPlot->SetHistYAxisTitle(defaultHistYAxisTitle); - Select1DPlot(true); - } - //2d - else{ - dispXAxis->setText(defaultImageXAxisTitle); - dispYAxis->setText(defaultImageYAxisTitle); - dispZAxis->setText(defaultImageZAxisTitle); - myPlot->SetImageXAxisTitle(defaultImageXAxisTitle); - myPlot->SetImageYAxisTitle(defaultImageYAxisTitle); - myPlot->SetImageZAxisTitle(defaultImageZAxisTitle); - Select1DPlot(false); - } - - - //histogram default - set before setscanargument - int min = spinHistFrom->value(); - int max = spinHistTo->value(); - double size = spinHistSize->value(); - int histArg = qDefs::Intensity; - if(radioHistogram->isChecked()){ - if(!radioHistIntensity->isChecked()){ - - int mode = 0; - histArg = qDefs::histLevel0; - if(radioHistLevel1->isChecked()){ - mode = 1; - histArg = qDefs::histLevel1; - } - - - int numSteps = myDet->getScanSteps(mode); - double *values = NULL; - min = 0;max = 1;size = 1; - - if(numSteps > 0){ - values = new double[numSteps]; - myDet->getScanSteps(mode,values); - min = values[0]; - max = values[numSteps - 1]; - size = (max - min)/(numSteps - 1); - } - } - - } - - //cout <<"min:"<SetHistogram(radioHistogram->isChecked(),histArg,min,max,size); - - - if(radioHistogram->isChecked()){ - if(radioHistIntensity->isChecked()) - dispXAxis->setText("Intensity"); - else if (radioHistLevel0->isChecked()) - dispXAxis->setText("Level 0"); - else - dispXAxis->setText("Level 1"); - dispYAxis->setText("Frequency"); - myPlot->SetHistXAxisTitle("Intensity"); - myPlot->SetHistYAxisTitle("Frequency"); - Select1DPlot(true); - } - - //angles (1D) - int ang; - if(myDet->getAngularConversion(ang)){ - dispXAxis->setText("Angles"); - myPlot->SetHistXAxisTitle("Angles"); - Select1DPlot(true); - } - - - //1d with scan - if(boxScan->isChecked()){ - myPlot->SetScanArgument(btnGroupScan->checkedId()+1); - - switch(btnGroupScan->checkedId()){ - case 0://level0 - dispYAxis->setText("Scan Level 0"); - myPlot->SetImageYAxisTitle("Scan Level 0"); - break; - case 1://level1 - dispYAxis->setText("Scan Level 1"); - myPlot->SetImageYAxisTitle("Scan Level 1"); - break; - break; - case 2://file index - dispYAxis->setText("Frame Index"); - myPlot->SetImageYAxisTitle("Frame Index"); - break; - case 3://all frames - dispYAxis->setText("All Frames"); - myPlot->SetImageYAxisTitle("All Frames"); - break; - } - Select1DPlot(false); - }else - myPlot->SetScanArgument(qDefs::None); - - //update the from and to labels to be enabled - SetBinary(); - - qDefs::checkErrorMessage(myDet,"qTabPlot::SetScanArgument"); - -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetBinary(){ - //1d - if(isOneD){ - if(chkBinary->isChecked()){ -#ifdef VERBOSE - cout << endl << "Enabling Binary" << endl; -#endif - lblFrom->setEnabled(true); - lblTo->setEnabled(true); - spinFrom->setEnabled(true); - spinTo->setEnabled(true); - myPlot->SetBinary(true,spinFrom->value(),spinTo->value()); - }else{ -#ifdef VERBOSE - cout << endl << "Disabling Binary" << endl; -#endif - lblFrom->setEnabled(false); - lblTo->setEnabled(false); - spinFrom->setEnabled(false); - spinTo->setEnabled(false); - myPlot->SetBinary(false); - } - } - //2d - else{ - if(chkBinary_2->isChecked()){ -#ifdef VERBOSE - cout << endl << "Enabling Binary" << endl; -#endif - lblFrom_2->setEnabled(true); - lblTo_2->setEnabled(true); - spinFrom_2->setEnabled(true); - spinTo_2->setEnabled(true); - myPlot->SetBinary(true,spinFrom_2->value(),spinTo_2->value()); - - }else{ -#ifdef VERBOSE - cout << endl << "Disabling Binary" << endl; -#endif - - lblFrom_2->setEnabled(false); - lblTo_2->setEnabled(false); - spinFrom_2->setEnabled(false); - spinTo_2->setEnabled(false); - myPlot->SetBinary(false); - } - } -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::SetHistogramOptions(){ - if(radioHistIntensity->isChecked()){ - pageHistogram->setEnabled(true); - pageHistogram_2->setEnabled(true); - }else { - pageHistogram->setEnabled(false); - pageHistogram_2->setEnabled(false); - } -} - - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::EnableGapPixels(bool enable) { -#ifdef VERBOSE - cout << "Setting Gap pixels to " << enable << endl; -#endif - disconnect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); - - myDet->enableGapPixels(enable); - int ret = myDet->enableGapPixels(-1); - qDefs::checkErrorMessage(myDet,"qTabPlot::SetScanArgument"); - chkGapPixels->setChecked((ret == 1) ? true : false); - - connect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabPlot::Refresh(){ -#ifdef VERBOSE - cout << endl << "**Updating Plot Tab" << endl; -#endif - if(!myPlot->isRunning()){ - if (!radioNoPlot->isChecked()) - boxFrequency->setEnabled(true); - connect(boxScan, SIGNAL(toggled(bool)), this, SLOT(EnableScanBox())); - EnableScanBox(); - /*if(myDet->getDetectorsType() == slsDetectorDefs::EIGER) - comboFrequency->setCurrentIndex(1);*/ - SetFrequency(); - - if (chkGapPixels->isEnabled()) { - disconnect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); - int ret = myDet->enableGapPixels(-1); - qDefs::checkErrorMessage(myDet,"qTabPlot::Refresh"); - chkGapPixels->setChecked((ret == 1) ? true : false); - connect(chkGapPixels, SIGNAL(toggled(bool)),this, SLOT(EnableGapPixels(bool))); - } - - }else{ - boxFrequency->setEnabled(false); - disconnect(boxScan, SIGNAL(toggled(bool)), this, SLOT(EnableScanBox())); - boxScan->setEnabled(false); - pageHistogram->setEnabled(false); - pageHistogram_2->setEnabled(false); - if(radioHistogram->isChecked()) - radioDataGraph->setEnabled(false); - else - radioHistogram->setEnabled(false); - } -#ifdef VERBOSE - cout << "**Updated Plot Tab" << endl << endl; -#endif -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - diff --git a/slsDetectorGui/src/qTabSettings.cpp b/slsDetectorGui/src/qTabSettings.cpp deleted file mode 100644 index aa3849f4e..000000000 --- a/slsDetectorGui/src/qTabSettings.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* - * qTabSettings.cpp - * - * Created on: May 10, 2012 - * Author: l_maliakal_d - */ - -#include "qTabSettings.h" -// Project Class Headers -#include "slsDetector.h" -#include "multiSlsDetector.h" -// C++ Include Headers -#include -#include -using namespace std; - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -qTabSettings::qTabSettings(QWidget *parent,multiSlsDetector*& detector): - QWidget(parent),myDet(detector),expertMode(false){ - - for(int i=0;igetDetectorsType(); - - // Settings - if (detType != slsReceiverDefs::JUNGFRAUCTB) { - SetupDetectorSettings(); - } else - comboSettings->setEnabled(false); - - //threshold - if((detType == slsDetectorDefs::MYTHEN) || (detType == slsDetectorDefs::EIGER)) - spinThreshold->setValue(myDet->getThresholdEnergy()); - - //expert mode is not enabled initially - lblThreshold->setEnabled(false); - spinThreshold->setEnabled(false); - - // Number of Modules - spinNumModules->setMaximum(myDet->getMaxNumberOfModules()); - spinNumModules->setValue(myDet->setNumberOfModules()); - - Initialization(); - - // Dynamic Range - GetDynamicRange(); - - qDefs::checkErrorMessage(myDet,"qTabSettings::SetupWidgetWindow"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabSettings::GetDynamicRange(int setvalue){ -#ifdef VERBOSE - cout << "Getting dynamic range" << endl; -#endif - int ret = myDet->setDynamicRange(-1); - if(detType == slsDetectorDefs::MYTHEN) { - if(ret==24) - ret=32; - else if(ret==24) - cout<<"ret:"<setCurrentIndex(0); break; - case 16: comboDynamicRange->setCurrentIndex(1); break; - case 8: comboDynamicRange->setCurrentIndex(2); break; - case 4: comboDynamicRange->setCurrentIndex(3); break; - default: comboDynamicRange->setCurrentIndex(0); break; - } - connect(comboDynamicRange, SIGNAL(activated(int)), this, SLOT(SetDynamicRange(int))); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabSettings::SetupDetectorSettings(){ - // Get detector settings from detector - int sett = (int)myDet->getSettings();cout<<"sett:"<(comboSettings->model()); - if (model) { - for(int i=0;iindex(i, comboSettings->modelColumn(), comboSettings->rootModelIndex()); - item[i] = model->itemFromIndex(index[i]); - } - - switch(detType){ - case slsDetectorDefs::MYTHEN: - item[(int)Standard]->setEnabled(true); - item[(int)Fast]->setEnabled(true); - item[(int)HighGain]->setEnabled(true); - item[(int)DynamicGain]->setEnabled(false); - item[(int)LowGain]->setEnabled(false); - item[(int)MediumGain]->setEnabled(false); - item[(int)VeryHighGain]->setEnabled(false); - item[(int)LowNoise]->setEnabled(false); - item[(int)DynamicHG0]->setEnabled(false); - item[(int)FixGain1]->setEnabled(false); - item[(int)FixGain2]->setEnabled(false); - item[(int)ForceSwitchG1]->setEnabled(false); - item[(int)ForceSwitchG2]->setEnabled(false); - item[(int)VeryLowGain]->setEnabled(false); - break; - case slsDetectorDefs::EIGER: - item[(int)Standard]->setEnabled(true); - item[(int)Fast]->setEnabled(false); - item[(int)HighGain]->setEnabled(true); - item[(int)DynamicGain]->setEnabled(false); - item[(int)LowGain]->setEnabled(true); - item[(int)MediumGain]->setEnabled(false); - item[(int)VeryHighGain]->setEnabled(true); - item[(int)LowNoise]->setEnabled(false); - item[(int)DynamicHG0]->setEnabled(false); - item[(int)FixGain1]->setEnabled(false); - item[(int)FixGain2]->setEnabled(false); - item[(int)ForceSwitchG1]->setEnabled(false); - item[(int)ForceSwitchG2]->setEnabled(false); - item[(int)VeryLowGain]->setEnabled(true); - break; - case slsDetectorDefs::MOENCH: - case slsDetectorDefs::PROPIX: - case slsDetectorDefs::GOTTHARD: - item[(int)Standard]->setEnabled(false); - item[(int)Fast]->setEnabled(false); - item[(int)HighGain]->setEnabled(true); - item[(int)DynamicGain]->setEnabled(true); - item[(int)LowGain]->setEnabled(true); - item[(int)MediumGain]->setEnabled(true); - item[(int)VeryHighGain]->setEnabled(true); - item[(int)LowNoise]->setEnabled(false); - item[(int)DynamicHG0]->setEnabled(false); - item[(int)FixGain1]->setEnabled(false); - item[(int)FixGain2]->setEnabled(false); - item[(int)ForceSwitchG1]->setEnabled(false); - item[(int)ForceSwitchG2]->setEnabled(false); - item[(int)VeryLowGain]->setEnabled(false); - break; - case slsDetectorDefs::JUNGFRAU: - item[(int)Standard]->setEnabled(false); - item[(int)Fast]->setEnabled(false); - item[(int)HighGain]->setEnabled(false); - item[(int)DynamicGain]->setEnabled(true); - item[(int)LowGain]->setEnabled(false); - item[(int)MediumGain]->setEnabled(false); - item[(int)VeryHighGain]->setEnabled(false); - item[(int)LowNoise]->setEnabled(false); - item[(int)DynamicHG0]->setEnabled(true); - item[(int)FixGain1]->setEnabled(true); - item[(int)FixGain2]->setEnabled(true); - item[(int)ForceSwitchG1]->setEnabled(true); - item[(int)ForceSwitchG2]->setEnabled(true); - item[(int)VeryLowGain]->setEnabled(false); - break; - default: - cout << "Unknown detector type. Exiting GUI." << endl; - qDefs::Message(qDefs::CRITICAL,"Unknown detector type. Exiting GUI.","qTabSettings::SetupDetectorSettings"); - exit(-1); - break; - } - // detector settings selected NOT ENABLED. - // This should not happen -only if the server and gui has a mismatch - // on which all modes are allowed in detectors - if(!(item[sett]->isEnabled())){ - qDefs::Message(qDefs::CRITICAL,"Unknown Detector Settings retrieved from detector. Exiting GUI.","qTabSettings::SetupDetectorSettings"); -#ifdef VERBOSE - cout << "ERROR: Unknown Detector Settings retrieved from detector." << endl; -#endif - sett= Undefined; - // exit(-1); - } - // Setting the detector settings - else comboSettings->setCurrentIndex(sett); - } -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabSettings::Initialization(){ - // Settings - if (detType != slsReceiverDefs::JUNGFRAUCTB) - connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); - // Number of Modules - connect(spinNumModules, SIGNAL(valueChanged(int)), this, SLOT(SetNumberOfModules(int))); - // Dynamic Range - connect(comboDynamicRange, SIGNAL(activated(int)), this, SLOT(SetDynamicRange(int))); - // Threshold - connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabSettings::setSettings(int index){ - //dont set it if settings is set to undefined or uninitialized - if((index==Undefined)||(index==Uninitialized)){ - qDefs::Message(qDefs::WARNING,"Cannot change settings to Undefined or Uninitialized.","qTabSettings::setSettings"); - disconnect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); - int sett = (int)myDet->getSettings(); - if(sett==-1) sett = Undefined; - if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; - else if(sett == slsDetectorDefs::UNINITIALIZED) sett = Uninitialized; - comboSettings->setCurrentIndex(sett); - connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); - } - - else{ - slsDetectorDefs::detectorSettings sett = myDet->setSettings((slsDetectorDefs::detectorSettings)index); - #ifdef VERBOSE - cout << endl << "Settings have been set to " << myDet->slsDetectorBase::getDetectorSettings(sett) << endl; - #endif - - //threshold - if((detType==slsDetectorDefs::MYTHEN)||(detType==slsDetectorDefs::EIGER)){ - lblThreshold->setEnabled(true); - spinThreshold->setEnabled(true); - SetEnergy(); - //also update trimbits plot - if(expertMode) emit UpdateTrimbitSignal(0); - } - } - - qDefs::checkErrorMessage(myDet,"qTabSettings::setSettings"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - -void qTabSettings::SetNumberOfModules(int index){ -#ifdef VERBOSE - cout << "Setting number of modules to "<< index << endl; -#endif - int i = myDet->setNumberOfModules(index); - if(index!=i) - qDefs::Message(qDefs::WARNING,"Number of modules cannot be set for this value.","qTabSettings::SetNumberOfModules"); -#ifdef VERBOSE - cout << "ERROR: Setting number of modules to "<< i << endl; -#endif - spinNumModules->setValue(i); - - qDefs::checkErrorMessage(myDet,"qTabSettings::SetNumberOfModules"); -} - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabSettings::SetDynamicRange(int index){ - int dr; - switch (index) { - case 0: dr=32; break; - case 1: dr=16; break; - case 2: dr=8; break; - case 3: dr=4; break; - default: dr=32; break; - } - myDet->setDynamicRange(dr); -#ifdef VERBOSE - cout << "Setting dynamic range to "<< dr << endl; -#endif - //check - GetDynamicRange(dr); - qDefs::checkErrorMessage(myDet,"qTabSettings::SetDynamicRange"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabSettings::SetEnergy(){ - int index = spinThreshold->value(); -#ifdef VERBOSE - cout << "Settings threshold energy to "<< index << endl; -#endif - myDet->setThresholdEnergy(index); - int ret = (int)myDet->getThresholdEnergy(); - if((ret-index)>200){ - qDefs::Message(qDefs::WARNING,"Threshold energy could not be set. The difference is greater than 200.","qTabSettings::SetEnergy"); - } - disconnect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); - spinThreshold->setValue(ret); - connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); - - qDefs::checkErrorMessage(myDet,"qTabSettings::SetEnergy"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- - - -void qTabSettings::Refresh(){ -#ifdef VERBOSE - cout << endl << "**Updating Settings Tab" << endl; -#endif - - if (detType != slsReceiverDefs::JUNGFRAUCTB) - disconnect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); - disconnect(spinNumModules, SIGNAL(valueChanged(int)), this, SLOT(SetNumberOfModules(int))); - disconnect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); - - - // Number of Modules -#ifdef VERBOSE - cout << "Getting number of modules:" ; -#endif - int numMod = myDet->setNumberOfModules(); -#ifdef VERBOSE - cout << numMod << endl; -#endif - spinNumModules->setValue(numMod); - - // Dynamic Range - GetDynamicRange(); - - // Settings - if (detType != slsReceiverDefs::JUNGFRAUCTB) { -#ifdef VERBOSE - cout << "Getting settings" << endl; -#endif - int sett = (int)myDet->getSettings(); - if(sett==-1) sett = Undefined;//slsDetectorDefs::UNDEFINED; - if(sett == slsDetectorDefs::UNDEFINED) sett = Undefined; - else if(sett == slsDetectorDefs::UNINITIALIZED) sett = Uninitialized; - comboSettings->setCurrentIndex(sett); - - //threshold - sett = comboSettings->currentIndex(); - if((detType==slsDetectorDefs::MYTHEN)||(detType==slsDetectorDefs::EIGER)){ - if((sett==Undefined)||(sett==Uninitialized)){ - lblThreshold->setEnabled(false); - spinThreshold->setEnabled(false); - }else{ - lblThreshold->setEnabled(true); - spinThreshold->setEnabled(true); -#ifdef VERBOSE - cout << "Getting threshold energy" << endl; -#endif - spinThreshold->setValue(myDet->getThresholdEnergy()); - } - } -} - - if (detType != slsReceiverDefs::JUNGFRAUCTB) - connect(comboSettings, SIGNAL(currentIndexChanged(int)), this, SLOT(setSettings(int))); - connect(spinNumModules, SIGNAL(valueChanged(int)), this, SLOT(SetNumberOfModules(int))); - connect(spinThreshold, SIGNAL(valueChanged(int)), this, SLOT(SetEnergy())); - -#ifdef VERBOSE - cout << "**Updated Settings Tab" << endl << endl; -#endif - - qDefs::checkErrorMessage(myDet,"qTabSettings::Refresh"); -} - - -//------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/slsDetectorGui/updateGitVersion.sh b/slsDetectorGui/updateGitVersion.sh deleted file mode 100755 index f82322712..000000000 --- a/slsDetectorGui/updateGitVersion.sh +++ /dev/null @@ -1,26 +0,0 @@ -MAINDIR=slsDetectorsPackage -SPECDIR=slsDetectorGui -TMPFILE=include/gitInfoGuiTmp.h -INCLFILE=include/gitInfoGui.h -WD=$PWD - -#evaluate the variables -EVALFILE=../evalVersionVariables.sh -source $EVALFILE - -#get modified date -#RDATE1='git log --pretty=format:"%ci" -1' -RDATE1="find . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|build|.git|updateGitVersion|ui*.h|*.o|Makefile.gui' | head -n 1" -RDATE=`eval $RDATE1` -NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') -NEWDATE=${NEWDATE/#/0x} - -#get old date from INCLFILE -OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') -#update INCLFILE if changes -#if [ "$OLDDATE" != "$NEWDATE" ]; then - echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt - cd .. - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -#fi diff --git a/slsDetectorSoftware/.gitignore b/slsDetectorSoftware/.gitignore deleted file mode 100644 index 825dda897..000000000 --- a/slsDetectorSoftware/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -*.o -*~ -#*# -.project diff --git a/slsDetectorSoftware/CMakeLists.txt b/slsDetectorSoftware/CMakeLists.txt deleted file mode 100644 index 7834e25e3..000000000 --- a/slsDetectorSoftware/CMakeLists.txt +++ /dev/null @@ -1,98 +0,0 @@ -set(SOURCES - multiSlsDetector/multiSlsDetector.cpp - sharedMemory/SharedMemory.cpp - slsDetector/slsDetectorUsers.cpp - slsDetector/slsDetectorUtils.cpp - slsDetector/slsDetectorCommand.cpp - slsDetector/slsDetectorActions.cpp - slsDetector/slsDetector.cpp - slsDetectorAnalysis/angularConversion.cpp - slsDetectorAnalysis/angularConversionStatic.cpp - slsDetectorAnalysis/energyConversion.cpp - slsDetectorAnalysis/fileIO.cpp - slsDetectorAnalysis/postProcessing.cpp - slsDetectorAnalysis/postProcessingFuncs.cpp - slsReceiverInterface/receiverInterface.cpp - threadFiles/CondVar.cpp - threadFiles/Mutex.cpp - threadFiles/ThreadPool.cpp - usersFunctions/usersFunctions.cpp -) - -set(HEADERS -) - -include_directories( - commonFiles - multiSlsDetector - sharedMemory - slsDetector - slsDetectorUtils - slsDetectorCommand - slsDetectorAnalysis - slsReceiverInterface - threadFiles - usersFunctions - ../slsReceiverSoftware/include - ../slsReceiverSoftware/MySocketTCP -) - -add_definitions( - -DDACS_INT -) - -add_library(slsDetectorShared SHARED - ${SOURCES} - ${HEADERS} -) - -set(PUBLICHEADERS - commonFiles/sls_detector_defs.h - commonFiles/sls_detector_funcs.h - commonFiles/error_defs.h - commonFiles/versionAPI.h - sharedMemory/SharedMemory.h - slsDetector/slsDetectorUtils.h - slsDetector/slsDetector.h - slsDetector/slsDetectorActions.h - slsDetector/slsDetectorBase.h - slsDetector/slsDetectorUsers.h - slsDetectorAnalysis/postProcessing.h - slsDetectorAnalysis/detectorData.h - slsDetectorAnalysis/angularConversion.h - slsDetectorAnalysis/angularConversionStatic.h - slsDetectorAnalysis/angleConversionConstant.h - slsDetectorAnalysis/badChannelCorrections.h - slsDetectorAnalysis/energyConversion.h - slsDetectorAnalysis/fileIO.h - slsDetectorAnalysis/fileIOStatic.h - multiSlsDetector/multiSlsDetector.h - slsReceiverInterface/receiverInterface.h - ../slsReceiverSoftware/include/sls_receiver_exceptions.h - slsDetector/slsDetectorUsers.h - ../slsReceiverSoftware/include/slsReceiverUsers.h -) -set_target_properties(slsDetectorShared PROPERTIES - LIBRARY_OUTPUT_NAME SlsDetector - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin - PUBLIC_HEADER "${PUBLICHEADERS}" -) - - - -add_subdirectory(slsDetectorClient) - -if(DOXYGEN_FOUND) - add_custom_target(doc - ${DOXYGEN_EXECUTABLE} - ${CMAKE_CURRENT_SOURCE_DIR}/slsDetectorUsers.doxy - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - COMMENT "Generating API documentation with Doxygen" VERBATIM - ) -endif() - -install(TARGETS slsDetectorShared - EXPORT "${TARGETS_EXPORT_NAME}" - LIBRARY DESTINATION lib - PUBLIC_HEADER DESTINATION include - ARCHIVE DESTINATION lib) diff --git a/slsDetectorSoftware/Makefile b/slsDetectorSoftware/Makefile deleted file mode 100644 index 1be7ccc6f..000000000 --- a/slsDetectorSoftware/Makefile +++ /dev/null @@ -1,82 +0,0 @@ -include ../Makefile.include - -DESTDIR ?= ../bin -LIBDIR ?= $(DESTDIR) - - -CFLAGS= -g -DC_ONLY -fPIC -#FLAGS+= #-DVERBOSE -DVERYVERBOSE - -DFLAGS= -g -DDACS_INT - -INCLUDES?= -IcommonFiles -IslsDetector -I../slsReceiverSoftware/MySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis -IslsReceiverInterface -I../slsReceiverSoftware/include -IthreadFiles -IsharedMemory -I$(ASM) - -#EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/$(EPICS_HOST_ARCH) -Wl,-R/usr/local/epics/base/lib/$(EPICS_HOST_ARCH) -lca -lCom - -LIBZMQDIR = ../slsReceiverSoftware/include -LIBZMQ = -L$(LIBZMQDIR) -Wl,-rpath=$(LIBZMQDIR) -lzmq - -SRC_CLNT=slsDetectorAnalysis/fileIO.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp slsDetector/slsDetectorUsers.cpp threadFiles/CondVar.cpp threadFiles/Mutex.cpp threadFiles/ThreadPool.cpp sharedMemory/SharedMemory.cpp #../slsReceiverSoftware/MySocketTCP/MySocketTCP.cpp -DEPSINCLUDES = $(LIBZMQDIR)/sls_receiver_defs.h $(LIBZMQDIR)/sls_receiver_funcs.h $(LIBZMQDIR)/ansi.h commonFiles/sls_detector_defs.h commonFiles/sls_detector_funcs.h commonFiles/error_defs.h slsDetector/slsDetectorBase.h slsDetectorAnalysis/angCalLogClass.h slsDetectorAnalysis/angleConversionConstant.h slsDetectorAnalysis/badChannelCorrections.h slsDetectorAnalysis/detectorData.h slsDetectorAnalysis/enCalLogClass.h slsDetectorAnalysis/fileIOStatic.h slsDetectorAnalysis/movingStat.h slsDetectorAnalysis/runningStat.h slsDetectorAnalysis/single_photon_hit.h threadFiles/Global.h threadFiles/Task.h usersFunctions/angleFunction.h sharedMemory/SharedMemory.h $(LIBZMQDIR)/sls_receiver_exceptions.h commonFiles/versionAPI.h - - - -$(info ) -$(info #######################################) -$(info # In slsDetectorSoftware Makefile #) -$(info #######################################) -$(info ) - - - - -OBJS = $(SRC_CLNT:%.cpp=%.o) - -.PHONY: all package clean - -all: package $(SRC_CLNT) - -mythenVirtualServer: $(SRC_MYTHEN_SVC) - cd mythenDetectorServer && make -f Makefile.virtual DESTDIR=$(DESTDIR) - -gotthardVirtualServer: $(SRC_MYTHEN_SVC) - cd gotthardDetectorServer && make -f Makefile.virtual DESTDIR=$(DESTDIR) - - -%.o : %.cpp %.h $(DEPSINCLUDES) Makefile - $(CXX) -o $@ -c $< $(INCLUDES) $(DFLAGS) -fPIC $(EPICSFLAGS) -pthread -lrt $(LIBZMQ) $(FLAGS) - - -package: versioning $(OBJS) $(DESTDIR)/libSlsDetector.so $(DESTDIR)/libSlsDetector.a - -versioning: - $(call colorecho,`./updateGitVersion.sh`) - -$(DESTDIR)/libSlsDetector.so: $(OBJS) - $(call colorecho,"#######################################") - $(call colorecho,"# Compiling slsDetector Library #") - $(call colorecho,"#######################################") - $(CXX) -shared -Wl,-soname,libSlsDetector.so -o libSlsDetector.so $(OBJS) -lc $(INCLUDES) $(DFLAGS) $(FLAGS) $(EPICSFLAGS) -L/usr/lib64 -pthread -lrt $(LIBZMQ) - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - mv libSlsDetector.so $(DESTDIR) - -$(DESTDIR)/libSlsDetector.a: $(OBJS) - ar rcs libSlsDetector.a $(OBJS) - mv libSlsDetector.a $(DESTDIR) - -clean: - rm -rf $(DESTDIR)/libSlsDetector.a $(DESTDIR)/libSlsDetector.so core $(OBJS) - cd - - - - -#------------------------------------------------------------------------------- - -install: package - -install_inc: - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - cp -P slsDetector/slsDetectorUsers.h slsDetectorAnalysis/detectorData.h $(DESTDIR) - - diff --git a/slsDetectorSoftware/Makefile.Standalone b/slsDetectorSoftware/Makefile.Standalone deleted file mode 100644 index d9a7c0868..000000000 --- a/slsDetectorSoftware/Makefile.Standalone +++ /dev/null @@ -1,68 +0,0 @@ -CFLAGS= -DC_ONLY -#FLAGS= -DVERBOSE -DVERYVERBOSE -INCLUDES= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis - -#EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/SL5-x86/ -Wl,-R/usr/local/epics/base/lib/SL5-x86 -lca -lCom -CC=gcc -CXX=g++ - -SRC_CLNT= slsDetectorAnalysis/FileIO_Standalone.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/AngularConversion_Standalone.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessingFileIO_Standalone.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp - -OBJS = $(SRC_CLNT:.cpp=.o) - -HEADERS = $(SRC_CLNT:.cpp=.h) commonFiles/sls_detector_defs.h slsDetectorAnalysis/detectorData.h slsDetector/slsDetectorBase.h slsDetector/slsDetectorUsers.h multiSlsDetector/multiSlsDetectorCommand.h - - - -SRC_MYTHEN_SVC = mythenDetectorServer/server.c mythenDetectorServer/server_funcs.c mythenDetectorServer/communication_funcs.c mythenDetectorServer/firmware_funcs.c mythenDetectorServer/mcb_funcs.c mythenDetectorServer/trimming_funcs.c - -all: package $(SRC_CLNT) - echo "compiling all" - -doc: $(SRC_H) $(SRC_CLNT) - doxygen doxy.config - - - -mythenServer: $(SRC_MYTHEN_SVC) - $(CC) $(SRC_MYTHEN_SVC) $(CFLAGS) $(FLAGS) $(INCLUDES) -ImythenDetectorServer -DVIRTUAL -lm -D MCB_FUNCS -DC_ONLY -DVERBOSE - mv a.out mythenServer - - -picassoServer: $(SRC_MYTHEN_SVC) - $(CC) $(SRC_MYTHEN_SVC) $(CFLAGS) $(FLAGS) $(INCLUDES) -ImythenDetectorServer -D VIRTUAL -lm -DMCB_FUNCS -DPICASSOD -DC_ONLY - mv a.out picassoServer - - - - - -%.o : %.cpp %.h - $(CXX) -Wall -o $@ -c $< $(INCLUDES) $(FLAGS) $(EPICSFLAGS) - - -package: $(OBJS) - $(CXX) -shared -Wl,-soname,libSlsDetector.so -o libSlsDetector.so $(OBJS) -lc $(INCLUDES) $(FLAGS) $(EPICSFLAGS) - ar rcs libSlsDetector.a $(OBJS) - -clean: - rm -rf libSlsDetector.a libSlsDetector.so core docs/* $(OBJS) - - -#------------------------------------------------------------------------------- -lib: package - - -# added install target, HBl -install_lib: lib - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - cp -P libSlsDetector.so $(DESTDIR) - -install_inc: - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - cp -P $(HEADERS) $(DESTDIR) - - -install_doc: doc - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - cp -Pr docs/* $(DESTDIR) diff --git a/slsDetectorSoftware/Makefile.x04sa b/slsDetectorSoftware/Makefile.x04sa deleted file mode 100644 index 59755550f..000000000 --- a/slsDetectorSoftware/Makefile.x04sa +++ /dev/null @@ -1,87 +0,0 @@ -CFLAGS= -DC_ONLY -fPIC -#FLAGS+= #-DVERBOSE -DVERYVERBOSE - -DFLAGS= -DDACS_INT -DTHIS_PATH='"$(shell pwd)"' -DSLS_RECEIVER_FUNCTION_LIST - -#ASM=$(shell echo "/lib/modules/`uname -r`/build/include") - -INCLUDES?= -IcommonFiles -IslsDetector -IMySocketTCP -IusersFunctions -ImultiSlsDetector -IslsDetectorUtils -IslsDetectorCommand -IslsDetectorAnalysis -IslsReceiverInterface -IslsReceiver -I$(ASM) - -EPICSFLAGS=-D EPICS -I/usr/local/epics/base/include/ -I /usr/local/epics/base/include/os/Linux/ -L /usr/local/epics/base/lib/SL5-x86/ -Wl,-R/usr/local/epics/base/lib/SL5-x86 -lca -lCom -CC=g++ - - -SRC_CLNT= slsDetectorAnalysis/fileIO.cpp MySocketTCP/MySocketTCP.cpp usersFunctions/usersFunctions.cpp slsDetector/slsDetectorUtils.cpp slsDetector/slsDetectorCommand.cpp slsDetectorAnalysis/angularConversion.cpp slsDetectorAnalysis/angularConversionStatic.cpp slsDetectorAnalysis/energyConversion.cpp slsDetector/slsDetectorActions.cpp slsDetectorAnalysis/postProcessing.cpp slsDetector/slsDetector.cpp multiSlsDetector/multiSlsDetector.cpp slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/postProcessingFuncs.cpp slsReceiverInterface/receiverInterface.cpp slsReceiver/slsReceiverFunctionList.cpp slsReceiver/slsReceiver_funcs.cpp slsReceiver/slsReceiverUsers.cpp - -OBJS = $(SRC_CLNT:.cpp=.o) - -HEADERS = $(SRC_CLNT:.cpp=.h) commonFiles/sls_detector_defs.h slsDetectorAnalysis/detectorData.h slsDetector/slsDetectorBase.h multiSlsDetector/multiSlsDetectorCommand.h slsDetectorAnalysis/enCalLogClass.h slsDetectorAnalysis/angCalLogClass.h slsDetectorAnalysis/angleConversionConstant.h usersFunctions/angleFunction.h slsReceiverInterface/receiverInterface.h slsDetector/svnInfoLib.h slsReceiver/circularFifo.h slsReceiver/slsReceiver_funcs.h slsReceiver/svnInfoReceiverTmp.h slsReceiver/receiver_defs.h slsReceiver/slsReceiverFunctionList.h slsReceiver/slsReceiverUsers.h slsReceiver/svnInfoReceiver.h - - - -DESTDIR ?= bin -DOCDIR ?= docs - - -all: package $(SRC_CLNT) - echo "compiling all" - -intdoc: $(SRC_H) $(SRC_CLNT) - doxygen doxy.config - -doc: $(DOCDIR)/pdf/slsDetectorUsersDocs.pdf - -$(DOCDIR)/pdf/slsDetectorUsersDocs.pdf: slsDetectorUsersDocs - cd slsDetectorUsersDocs/latex && make - $(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR)) - $(shell test -d $(DOCDIR)/pdf || mkdir -p $(DOCDIR)/pdf) - cp slsDetectorUsersDocs/latex/refman.pdf $(DOCDIR)/pdf/slsDetectorUsersDocs.pdf - - -htmldoc: $(DOCDIR)/html/slsDetectorUsersDocs - -$(DOCDIR)/html/slsDetectorUsersDocs: slsDetectorUsersDocs - $(shell test -d $(DOCDIR) || mkdir -p $(DOCDIR)) - $(shell test -d $(DOCDIR)/html || mkdir -p $(DOCDIR)/html) - $(shell test -d $(DOCDIR)/html/slsDetectorUsersDocs && rm -r $(DOCDIR)/html/slsDetectorUsersDocs) - cp -r slsDetectorUsersDocs/html $(DOCDIR)/html/slsDetectorUsersDocs - -slsDetectorUsersDocs: slsDetectorUsers.doxy slsDetector/slsDetectorUsers.h slsDetector/slsDetectorUsers.cpp slsDetectorAnalysis/detectorData.h - doxygen slsDetectorUsers.doxy - - -mythenVirtualServer: $(SRC_MYTHEN_SVC) - cd mythenDetectorServer && make -f Makefile.virtual DESTDIR=$(DESTDIR) - -gotthardVirtualServer: $(SRC_MYTHEN_SVC) - cd gotthardDetectorServer && make -f Makefile.virtual DESTDIR=$(DESTDIR) - - - -%.o : %.cpp %.h Makefile - $(CXX) -Wall -o $@ -c $< $(INCLUDES) $(DFLAGS) $(FLAGS) -fPIC $(EPICSFLAGS) -L/usr/lib64/ - -package: $(OBJS) $(DESTDIR)/libSlsDetector.so $(DESTDIR)/libSlsDetector.a - -$(DESTDIR)/libSlsDetector.so: $(OBJS) - $(CXX) -shared -Wl,-soname,libSlsDetector.so -o libSlsDetector.so $(OBJS) -lc $(INCLUDES) $(DFLAGS) $(FLAGS) $(EPICSFLAGS) -L/usr/lib64/ - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - mv libSlsDetector.so $(DESTDIR) - -$(DESTDIR)/libSlsDetector.a: $(OBJS) - ar rcs libSlsDetector.a $(OBJS) - mv libSlsDetector.a $(DESTDIR) - -clean: - rm -rf libSlsDetector.a libSlsDetector.so core docs/* slsDetectorUsersDocs $(OBJS) - - -#------------------------------------------------------------------------------- - -install: package - -install_inc: - $(shell test -d $(DESTDIR) || mkdir -p $(DESTDIR)) - cp -P slsDetector/slsDetectorUsers.h slsDetectorAnalysis/detectorData.h $(DESTDIR) slsReceiver/slsReceiverUsers.h - - diff --git a/slsDetectorSoftware/README b/slsDetectorSoftware/README deleted file mode 100644 index b1cfea7a7..000000000 --- a/slsDetectorSoftware/README +++ /dev/null @@ -1,19 +0,0 @@ -This subversion repository contains - -Common directories -Please inform Anna or Dhanya if you make modifications to these directories -- MySocketTCP : socket class -- commonFiles : header file common to server and client -- slsDetector : base class with all main detector functionalities (client side) - - -Mythen specific directories -Please inform Anna if you make modifications to these directories -- mythenDetector : mythen specific funcs (mainly files I/O and angular conversion) -- mythenDetectorServer : mythen server (for etrax compiler) -- firmware lib might be added in the future - -Other Detector specific directories -Please inform Dhanya if you make modifications to these directories - -make doc diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.c b/slsDetectorSoftware/commonFiles/communication_funcs.c deleted file mode 100755 index 487b2c66e..000000000 --- a/slsDetectorSoftware/commonFiles/communication_funcs.c +++ /dev/null @@ -1,676 +0,0 @@ - - -#include "communication_funcs.h" -//#include -#include /* for TCP_NODELAY */ -#include -#include -#include -#include - -#include -char lastClientIP[INET_ADDRSTRLEN]; -char thisClientIP[INET_ADDRSTRLEN]; -int lockStatus; -int differentClients; - -//int socketDescriptor, file_des; -const int send_rec_max_size=SEND_REC_MAX_SIZE; -extern int errno; - - -char dummyClientIP[INET_ADDRSTRLEN]; - - -fd_set readset, tempset; -int isock=0, maxfd; - - -int myport=-1; - -//struct sockaddr_in address; -//#define VERBOSE - - -int bindSocket(unsigned short int port_number) { - int i; - - struct sockaddr_in addressS; - int socketDescriptor; - //int file_des; - - //file_des= -1; - - - - - - - - - - - if (myport==port_number) - return -10; - - - - - - socketDescriptor = socket(AF_INET, SOCK_STREAM,0); //tcp - - //socketDescriptor = socket(PF_INET, SOCK_STREAM, 0); - - - - if (socketDescriptor < 0) { - printf("Can not create socket\n"); - } else { - - i = 1; - setsockopt(socketDescriptor, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i)); - // setsockopt(socketDescriptor, IPPROTO_TCP, TCP_NODELAY, (char *) &i, sizeof(i)); - // TCP_CORK - - // Set some fields in the serverAddress structure. - addressS.sin_family = AF_INET; - addressS.sin_addr.s_addr = htonl(INADDR_ANY); - addressS.sin_port = htons(port_number); - - // memset(&address.sin_addr, 0, sizeof(address.sin_addr)); - - - if(bind(socketDescriptor,(struct sockaddr *) &addressS,sizeof(addressS))<0){ - - printf("Can not create socket\n"); - - socketDescriptor=-1; - } else { - if (listen(socketDescriptor, 5)==0) { - - if (isock==0) { - FD_ZERO(&readset); - } - - - FD_SET(socketDescriptor, &readset); - isock++; - maxfd = socketDescriptor; - printf ("%d port %d fd %d\n",isock, port_number,socketDescriptor); - myport=port_number; - } else - printf("error on listen"); - } - } - - - - //int getrlimit(int resource, struct rlimit *rlim); - - - - return socketDescriptor; - -} - - - - - -int getServerError(int socketDescriptor) -{ - if (socketDescriptor<0) return 1; - else return 0; -}; - - -int acceptConnection(int socketDescriptor) { - - - int j; - - - struct sockaddr_in addressC; - int file_des=-1; - struct timeval tv; - int result; - - - //socklen_t address_length; - socklen_t address_length=sizeof(struct sockaddr_in); - - if (socketDescriptor<0) - return -1; - - memcpy(&tempset, &readset, sizeof(tempset)); - tv.tv_sec = 10000000; - tv.tv_usec = 0; - result = select(maxfd + 1, &tempset, NULL, NULL, &tv); - - if (result == 0) { - printf("select() timed out!\n"); - } else if (result < 0 && errno != EINTR) { - printf("Error in select(): %s\n", strerror(errno)); - } else if (result > 0) { -#ifdef VERBOSE - printf("select returned!\n"); -#endif - for (j=0; j=0) - close(file_des); - FD_CLR(file_des, &readset); -} - -void exitServer(int socketDescriptor) { - if (socketDescriptor>=0) - close(socketDescriptor); -#ifdef VERY_VERBOSE - printf("Closing server\n"); -#endif - FD_CLR(socketDescriptor, &readset); - socketDescriptor=-1; - isock--; -} - - - - -void swapData(void* val,int length,intType itype){ - int i; - int16_t* c= (int16_t*)val; - int32_t* a= (int32_t*)val; - int64_t* b= (int64_t*)val; - for(i=0; length > 0; i++){ - switch(itype){ - case INT16: - c[i] = ((c[i] & 0x00FF) << 8) | ((c[i] & 0xFF00) >> 8); - length -= sizeof(int16_t); - break; - case INT32: - a[i]=((a[i] << 8) & 0xFF00FF00) | ((a[i] >> 8) & 0xFF00FF ); - a[i]=(a[i] << 16) | ((a[i] >> 16) & 0xFFFF); - length -= sizeof(int32_t); - break; - case INT64: - b[i] = ((b[i] << 8) & 0xFF00FF00FF00FF00ULL ) | ((b[i] >> 8) & 0x00FF00FF00FF00FFULL ); - b[i] = ((b[i] << 16) & 0xFFFF0000FFFF0000ULL ) | ((b[i] >> 16) & 0x0000FFFF0000FFFFULL ); - b[i] = (b[i] << 32) | ((b[i] >> 32) & 0xFFFFFFFFULL); - length -= sizeof(int64_t); - break; - default: - length = 0; - break; - } - } -} - -int sendData(int file_des, void* buf,int length, intType itype){ -#ifndef PCCOMPILE -#ifdef EIGERD - swapData(buf, length, itype); -#endif -#endif - return sendDataOnly(file_des, buf, length); -} - - -int receiveData(int file_des, void* buf,int length, intType itype){ - int ret = receiveDataOnly(file_des, buf, length); -#ifndef PCCOMPILE -#ifdef EIGERD - if (ret >= 0) swapData(buf, length, itype); -#endif -#endif - return ret; -} - - - int sendDataOnly(int file_des, void* buf,int length) { - if (!length) - return 0; - int ret = write(file_des, buf, length); //value of -1 is other end socket crash as sigpipe is ignored - if (ret < 0) cprintf(BG_RED, "Error writing to socket. Possible socket crash\n"); - return ret; -} - - - int receiveDataOnly(int file_des, void* buf,int length) { - - int total_received=0; - int nreceiving; - int nreceived; - if (file_des<0) return -1; -#ifdef VERY_VERBOSE - printf("want to receive %d Bytes\n", length); -#endif - - while(length > 0) { - nreceiving = (length>send_rec_max_size) ? send_rec_max_size:length; // (condition) ? if_true : if_false - nreceived = read(file_des,(char*)buf+total_received,nreceiving); - if(!nreceived){ - if(!total_received) { - return -1; //to handle it - } - break; - } - length-=nreceived; - total_received+=nreceived; - } - - if (total_received>0) - strcpy(thisClientIP,dummyClientIP); - - if (strcmp(lastClientIP,thisClientIP)) - differentClients=1; - else - differentClients=0; - - return total_received; -} - - - - - - - - - - - - - - - -int sendChannel(int file_des, sls_detector_channel *myChan) { - int ts=0; - //sendDataOnly(file_des,myChan, sizeof(sls_detector_channel)); - ts+=sendData(file_des,&(myChan->chan),sizeof(myChan->chan),INT32); - ts+=sendData(file_des,&(myChan->chip),sizeof(myChan->chip),INT32); - ts+=sendData(file_des,&(myChan->module),sizeof(myChan->module),INT32); - ts+=sendData(file_des,&(myChan->reg),sizeof(myChan->reg),INT64); - return ts; -} - -int sendChip(int file_des, sls_detector_chip *myChip) { - int ts=0; - //ts+=sendDataOnly(file_des,myChip,sizeof(sls_detector_chip)); - ts+=sendData(file_des,&(myChip->chip),sizeof(myChip->chip),INT32); - ts+=sendData(file_des,&(myChip->module),sizeof(myChip->module),INT32); - ts+=sendData(file_des,&(myChip->nchan),sizeof(myChip->nchan),INT32); - ts+=sendData(file_des,&(myChip->reg),sizeof(myChip->reg),INT32); - ts+=sendData(file_des,(myChip->chanregs),sizeof(myChip->chanregs),INT32); - ts+=sendData(file_des,myChip->chanregs,myChip->nchan*sizeof(int),INT32); - return ts; -} - - -int sendModule(int file_des, sls_detector_module *myMod) { - return sendModuleGeneral(file_des, myMod, 1); -} - - -int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll) { - int ts=0; -#ifdef VERBOSE - int idac; -#endif - int nChips=myMod->nchip; - int nChans=myMod->nchan; - int nAdcs=myMod->nadc; - int nDacs=myMod->ndac; - //ts+= sendDataOnly(file_des,myMod,sizeof(sls_detector_module)); - ts+=sendData(file_des,&(myMod->module),sizeof(myMod->module),INT32); - ts+=sendData(file_des,&(myMod->serialnumber),sizeof(myMod->serialnumber),INT32); - ts+=sendData(file_des,&(myMod->nchan),sizeof(myMod->nchan),INT32); - ts+=sendData(file_des,&(myMod->nchip),sizeof(myMod->nchip),INT32); - ts+=sendData(file_des,&(myMod->ndac),sizeof(myMod->ndac),INT32); - ts+=sendData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); - ts+=sendData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); - -#ifdef MYTHEND - ts+=sendData(file_des,myMod->dacs,sizeof(myMod->ndac),OTHER); - ts+=sendData(file_des,myMod->adcs,sizeof(myMod->nadc),OTHER); - ts+=sendData(file_des,myMod->chipregs,sizeof(myMod->nchip),OTHER); - ts+=sendData(file_des,myMod->chanregs,sizeof(myMod->nchan),OTHER); - } -#endif - ts+=sendData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); - ts+=sendData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); - -#ifdef VERBOSE - printf("module %d of size %d sent\n",myMod->module, ts); -#endif - ts+= sendData(file_des,myMod->dacs,sizeof(dacs_t)*nDacs,INT32); -#ifdef VERBOSE - printf("dacs %d of size %d sent\n",myMod->module, ts); - int idac; - for (idac=0; idac< nDacs; idac++) - printf("dac %d is %d\n",idac,(int)myMod->dacs[idac]); -#endif - ts+= sendData(file_des,myMod->adcs,sizeof(dacs_t)*nAdcs,INT32); -#ifdef VERBOSE - printf("adcs %d of size %d sent\n",myMod->module, ts); -#endif - - /*some detectors dont require sending all trimbits etc.*/ - if(sendAll){ - ts+=sendData(file_des,myMod->chipregs,sizeof(int)*nChips,INT32); -#ifdef VERBOSE - printf("chips %d of size %d sent\n",myMod->module, ts); -#endif - ts+=sendData(file_des,myMod->chanregs,sizeof(int)*nChans,INT32); -#ifdef VERBOSE - printf("chans %d of size %d sent - %d\n",myMod->module, ts, myMod->nchan); -#endif - } - -#ifdef VERBOSE - printf("module %d of size %d sent register %x\n",myMod->module, ts, myMod->reg); -#endif - return ts; -} - -int receiveChannel(int file_des, sls_detector_channel *myChan) { - int ts=0; - //receiveDataOnly(file_des,myChan,sizeof(sls_detector_channel)); - ts+=receiveData(file_des,&(myChan->chan),sizeof(myChan->chan),INT32); - ts+=receiveData(file_des,&(myChan->chip),sizeof(myChan->chip),INT32); - ts+=receiveData(file_des,&(myChan->module),sizeof(myChan->module),INT32); - ts+=receiveData(file_des,&(myChan->reg),sizeof(myChan->reg),INT32); - return ts; -} - -int receiveChip(int file_des, sls_detector_chip* myChip) { - - int *ptr=myChip->chanregs; - int ts=0; - int nChans, nchanold=myChip->nchan, chdiff; - - //ts+= receiveDataOnly(file_des,myChip,sizeof(sls_detector_chip)); - ts+=receiveData(file_des,&(myChip->chip),sizeof(myChip->chip),INT32); - ts+=receiveData(file_des,&(myChip->module),sizeof(myChip->module),INT32); - ts+=receiveData(file_des,&(myChip->nchan),sizeof(myChip->nchan),INT32); - ts+=receiveData(file_des,&(myChip->reg),sizeof(myChip->reg),INT32); - ts+=receiveData(file_des,(myChip->chanregs),sizeof(myChip->chanregs),INT32); - - myChip->chanregs=ptr; - nChans=myChip->nchan; - chdiff=nChans-nchanold; - if (nchanold!=nChans) { - printf("wrong number of channels received!\n"); - } - - -#ifdef VERBOSE - printf("chip structure received\n"); - printf("now receiving %d channels\n", nChans); -#endif - - if (chdiff<=0) - ts+=receiveData(file_des,myChip->chanregs, sizeof(int)*nChans,INT32); - else { - ptr=(int*)malloc(chdiff*sizeof(int)); - myChip->nchan=nchanold; - ts+=receiveData(file_des,myChip->chanregs, sizeof(int)*nchanold,INT32); - ts+=receiveData(file_des,ptr, sizeof(int)*chdiff,INT32); - free(ptr); - return FAIL; - } - -#ifdef VERBOSE - printf("chip's channels received\n"); -#endif - return ts; -} - - -int receiveModule(int file_des, sls_detector_module* myMod) { - return receiveModuleGeneral(file_des,myMod,1); -} - -int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll) { - int ts=0; - dacs_t *dacptr=myMod->dacs; - dacs_t *adcptr=myMod->adcs; - int *chipptr=myMod->chipregs, *chanptr=myMod->chanregs; - int nChips, nchipold=myMod->nchip, nchipdiff; - int nChans, nchanold=myMod->nchan, nchandiff; - int nDacs, ndold=myMod->ndac, ndacdiff; - int nAdcs, naold=myMod->nadc, nadcdiff; -#ifdef VERBOSE - int id=0; -#endif - // ts+= receiveDataOnly(file_des,myMod,sizeof(sls_detector_module)); - ts+=receiveData(file_des,&(myMod->module),sizeof(myMod->module),INT32); - ts+=receiveData(file_des,&(myMod->serialnumber),sizeof(myMod->serialnumber),INT32); - ts+=receiveData(file_des,&(myMod->nchan),sizeof(myMod->nchan),INT32); - ts+=receiveData(file_des,&(myMod->nchip),sizeof(myMod->nchip),INT32); - ts+=receiveData(file_des,&(myMod->ndac),sizeof(myMod->ndac),INT32); - ts+=receiveData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); - ts+=receiveData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); -#ifdef MYTHEND - ts+=receiveData(file_des,myMod->dacs,sizeof(myMod->ndac),INT32); - ts+=receiveData(file_des,myMod->adcs,sizeof(myMod->nadc),INT32); - ts+=receiveData(file_des,myMod->chipregs,sizeof(myMod->nchip),INT32); - ts+=receiveData(file_des,myMod->chanregs,sizeof(myMod->nchan),INT32); -#endif - ts+=receiveData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); - ts+=receiveData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); - - myMod->dacs=dacptr; - myMod->adcs=adcptr; - myMod->chipregs=chipptr; - myMod->chanregs=chanptr; - -#ifdef EIGERD - //feature to exclude sending of trimbtis, nchips=0,nchans=0 in that case - if(myMod->nchip == 0 && myMod->nchan == 0) { - receiveAll=0; - nchipold=0; - nchanold=0; - } -#endif - - - nChips=myMod->nchip; - nchipdiff=nChips-nchipold; - if (nchipold!=nChips) { - printf("received wrong number of chips\n"); - } -#ifdef VERBOSE - else - printf("received %d chips\n",nChips); -#endif - - nChans=myMod->nchan; - nchandiff=nChans-nchanold; - if (nchanold!=nChans) { - printf("received wrong number of channels\n"); - } -#ifdef VERBOSE - else - printf("received %d chans\n",nChans); -#endif - - - nDacs=myMod->ndac; - ndacdiff=nDacs-ndold; - if (ndold!=nDacs) { - printf("received wrong number of dacs\n"); - } -#ifdef VERBOSE - else - printf("received %d dacs\n",nDacs); -#endif - - nAdcs=myMod->nadc; - nadcdiff=nAdcs-naold; - if (naold!=nAdcs) { - printf("received wrong number of adcs\n"); - } -#ifdef VERBOSE - else - printf("received %d adcs\n",nAdcs); -#endif - if (ndacdiff<=0) { - ts+=receiveData(file_des,myMod->dacs, sizeof(dacs_t)*nDacs,INT32); -#ifdef VERBOSE - printf("dacs received\n"); - int id; - for (id=0; iddacs[id]); - - -#endif - } else { - dacptr=(dacs_t*)malloc(ndacdiff*sizeof(dacs_t)); - myMod->ndac=ndold; - ts+=receiveData(file_des,myMod->dacs, sizeof(dacs_t)*ndold,INT32); - ts+=receiveData(file_des,dacptr, sizeof(dacs_t)*ndacdiff,INT32); - free(dacptr); - return FAIL; - } - - if (nadcdiff<=0) { - ts+=receiveData(file_des,myMod->adcs, sizeof(dacs_t)*nAdcs,INT32); -#ifdef VERBOSE - printf("adcs received\n"); -#endif - } else { - adcptr=(dacs_t*)malloc(nadcdiff*sizeof(dacs_t)); - myMod->nadc=naold; - ts+=receiveData(file_des,myMod->adcs, sizeof(dacs_t)*naold,INT32); - ts+=receiveData(file_des,adcptr, sizeof(dacs_t)*nadcdiff,INT32); - free(adcptr); - return FAIL; - } - - - /*some detectors dont require sending all trimbits etc.*/ - if(receiveAll){ - - if (nchipdiff<=0) { - ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nChips,INT32); -#ifdef VERBOSE - printf("chips received\n"); -#endif - } else { - chipptr=(int*)malloc(nchipdiff*sizeof(int)); - myMod->nchip=nchipold; - ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nchipold,INT32); - ts+=receiveData(file_des,chipptr, sizeof(int)*nchipdiff,INT32); - free(chipptr); - return FAIL; - } - - if (nchandiff<=0) { - ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nChans,INT32); -#ifdef VERBOSE - printf("chans received\n"); -#endif - } else { - chanptr=(int*)malloc(nchandiff*sizeof(int)); - myMod->nchan=nchanold; - ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nchanold,INT32); - ts+=receiveData(file_des,chanptr, sizeof(int)*nchandiff,INT32); - free(chanptr); - return FAIL; - } - } -#ifdef VERBOSE - printf("received module %d of size %d register %x\n",myMod->module,ts,myMod->reg); -#endif - - return ts; -} diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.h b/slsDetectorSoftware/commonFiles/communication_funcs.h deleted file mode 100755 index e4e3fac27..000000000 --- a/slsDetectorSoftware/commonFiles/communication_funcs.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef COMMUNICATION_FUNCS_H -#define COMMUNICATION_FUNCS_H - -#define SEND_REC_MAX_SIZE 4096 -#define DEFAULT_PORTNO 1952 -#include -#include - - -#include -#include -#include -#include - -#include "sls_detector_defs.h" - - - -typedef enum{ - INT16, - INT32, - INT64, - OTHER -}intType; - - - - -int bindSocket(unsigned short int port_number); -int acceptConnection(int socketDescriptor); -void closeConnection(int file_Des); -void exitServer(int socketDescriptor); - -void swapData(void* val,int length,intType itype); -int sendData(int file_des, void* buf,int length, intType itype); -int receiveData(int file_des, void* buf,int length, intType itype); -int sendDataOnly(int file_des, void* buf,int length); -int receiveDataOnly(int file_des, void* buf,int length); - - -int getServerError(int socketDescriptor); -int sendChannel(int file_des, sls_detector_channel *myChan); -int sendChip(int file_des, sls_detector_chip *myChip); -int sendModule(int file_des, sls_detector_module *myMod); -int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll); -int receiveChannel(int file_des, sls_detector_channel *myChan); -int receiveChip(int file_des, sls_detector_chip* myChip); -int receiveModule(int file_des, sls_detector_module* myMod); -int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll); - -#endif diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h deleted file mode 100644 index dc733c2d7..000000000 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - * error_defs.h - * - * Created on: Jan 18, 2013 - * Author: l_maliakal_d - */ - -#ifndef ERROR_DEFS_H_ -#define ERROR_DEFS_H_ - -#include "ansi.h" -#include "sls_detector_defs.h" - -#include -#include -#include -#include -// - -/** Error flags */ -/*Assumption: Only upto 63 detectors */ - -// multi errors -// 0xFFF0000000000000ULL -#define MULTI_DETECTORS_NOT_ADDED 0x8000000000000000ULL -#define MULTI_HAVE_DIFFERENT_VALUES 0x4000000000000000ULL -#define MULTI_CONFIG_FILE_ERROR 0x2000000000000000ULL - -// sls errors -#define CRITICAL_ERROR_MASK 0xFFFFFFF - -// 0xFFFFFFF000000000ULL -#define CANNOT_CONNECT_TO_DETECTOR 0x4000000000000000ULL -#define CANNOT_CONNECT_TO_RECEIVER 0x2000000000000000ULL -#define COULDNOT_SET_CONTROL_PORT 0x1000000000000000ULL -#define COULDNOT_SET_STOP_PORT 0x0800000000000000ULL -#define COULDNOT_SET_DATA_PORT 0x0400000000000000ULL -#define FILE_PATH_DOES_NOT_EXIST 0x0200000000000000ULL -#define COULDNOT_CREATE_UDP_SOCKET 0x0100000000000000ULL -#define COULDNOT_CREATE_FILE 0x0080000000000000ULL -#define COULDNOT_ENABLE_COMPRESSION 0x0040000000000000ULL -#define RECEIVER_DET_HOSTNAME_NOT_SET 0x0020000000000000ULL -#define RECEIVER_DET_HOSTTYPE_NOT_SET 0x0010000000000000ULL -#define DETECTOR_TEN_GIGA 0x0008000000000000ULL -#define DETECTOR_ACTIVATE 0x0004000000000000ULL -#define COULD_NOT_CONFIGURE_MAC 0x0002000000000000ULL -#define COULDNOT_START_RECEIVER 0x0001000000000000ULL // default error like starting threads -#define COULDNOT_STOP_RECEIVER 0x0000800000000000ULL -#define RECEIVER_DET_POSID_NOT_SET 0x0000400000000000ULL -#define RECEIVER_MULTI_DET_SIZE_NOT_SET 0x0000200000000000ULL -#define PREPARE_ACQUISITION 0x0000100000000000ULL -#define CLEANUP_ACQUISITION 0x0000080000000000ULL -#define REGISER_WRITE_READ 0x0000040000000000ULL -#define VERSION_COMPATIBILITY 0x0000020000000000ULL -// 0xFFFFFF0000000000ULL - -// 0x000000FFFFFFFFFFULL -#define COULDNOT_SET_NETWORK_PARAMETER 0x0000000000000001ULL -#define COULDNOT_SET_ROI 0x0000000000000002ULL -#define RECEIVER_READ_FREQUENCY 0x0000000000000004ULL -#define SETTINGS_NOT_SET 0x0000000000000008ULL -#define SETTINGS_FILE_NOT_OPEN 0x0000000000000010ULL -#define DETECTOR_TIMER_VALUE_NOT_SET 0x0000000000000020ULL -#define RECEIVER_ACQ_PERIOD_NOT_SET 0x0000000000000040ULL -#define RECEIVER_FRAME_NUM_NOT_SET 0x0000000000000080ULL -#define RECEIVER_DYNAMIC_RANGE 0x0000000000000100ULL -#define RECEIVER_TEN_GIGA 0x0000000000000200ULL -#define ALLTIMBITS_NOT_SET 0x0000000000000400ULL -#define COULD_NOT_SET_SPEED_PARAMETERS 0x0000000000000800ULL -#define COULD_NOT_SET_READOUT_FLAGS 0x0000000000001000ULL -#define COULD_NOT_SET_FIFO_DEPTH 0x0000000000002000ULL -#define COULD_NOT_SET_COUNTER_BIT 0x0000000000004000ULL -#define COULD_NOT_PULSE_PIXEL 0x0000000000008000ULL -#define COULD_NOT_PULSE_PIXEL_NMOVE 0x0000000000010000ULL -#define COULD_NOT_PULSE_CHIP 0x0000000000020000ULL -#define COULD_NOT_SET_RATE_CORRECTION 0x0000000000040000ULL -#define DETECTOR_NETWORK_PARAMETER 0x0000000000080000ULL -#define RATE_CORRECTION_NOT_32or16BIT 0x0000000000100000ULL -#define RATE_CORRECTION_NO_TAU_PROVIDED 0x0000000000200000ULL -#define PROGRAMMING_ERROR 0x0000000000400000ULL -#define RECEIVER_ACTIVATE 0x0000000000800000ULL -#define DATA_STREAMING 0x0000000001000000ULL -#define RESET_ERROR 0x0000000002000000ULL -#define POWER_CHIP 0x0000000004000000ULL -#define RECEIVER_READ_TIMER 0x0000000008000000ULL -#define RECEIVER_ACQ_TIME_NOT_SET 0x0000000010000000ULL -#define RECEIVER_FLIPPED_DATA_NOT_SET 0x0000000020000000ULL -#define THRESHOLD_NOT_SET 0x0000000040000000ULL -#define RECEIVER_FILE_FORMAT 0x0000000080000000ULL -#define RECEIVER_PARAMETER_NOT_SET 0x0000000100000000ULL -#define RECEIVER_TIMER_NOT_SET 0x0000000200000000ULL -#define RECEIVER_ENABLE_GAPPIXELS_NOT_SET 0x0000000400000000ULL -#define RESTREAM_STOP_FROM_RECEIVER 0x0000000800000000ULL -#define TEMPERATURE_CONTROL 0x0000001000000000ULL -#define AUTO_COMP_DISABLE 0x0000002000000000ULL -#define CONFIG_FILE 0x0000004000000000ULL -#define STORAGE_CELL_START 0x0000008000000000ULL -// 0x000000FFFFFFFFFFULL - - -/** @short class returning all error messages for error mask */ -class errorDefs { - - -public: - - /** Constructor */ - errorDefs():errorMask(0){ - strcpy(notAddedList,""); - }; - - /** Gets the error message - * param errorMask error mask - /returns error message from error mask - */ - static std::string getErrorMessage(int64_t slsErrorMask){ - - std::string retval = ""; - - if(slsErrorMask&CANNOT_CONNECT_TO_DETECTOR) - retval.append("Cannot connect to Detector\n"); - - if(slsErrorMask&CANNOT_CONNECT_TO_RECEIVER) - retval.append("Cannot connect to Receiver\n"); - - if(slsErrorMask&COULDNOT_SET_CONTROL_PORT) - retval.append("Could not set control port\n"); - - if(slsErrorMask&COULDNOT_SET_STOP_PORT) - retval.append("Could not set stop port\n"); - - if(slsErrorMask&COULDNOT_SET_DATA_PORT) - retval.append("Could not set receiver port\n"); - - if(slsErrorMask&FILE_PATH_DOES_NOT_EXIST) - retval.append("Path to Output Directory does not exist\n"); - - if(slsErrorMask&COULDNOT_CREATE_UDP_SOCKET) - retval.append("Could not create UDP socket to start receiver\n"); - - if(slsErrorMask&COULDNOT_CREATE_FILE) - retval.append("Could not create file to start receiver.\nCheck permissions of output directory or the overwrite flag\n"); - - if(slsErrorMask&COULDNOT_ENABLE_COMPRESSION) - retval.append("Could not enable/disable data compression in receiver.\nThread creation failed or recompile code with MYROOT1 flag.\n"); - - if(slsErrorMask&RECEIVER_DET_HOSTNAME_NOT_SET) - retval.append("Could not send the detector hostname to the receiver.\n"); - - if(slsErrorMask&RECEIVER_DET_HOSTTYPE_NOT_SET) - retval.append("Could not send the detector type to the receiver.\n"); - - if(slsErrorMask&DETECTOR_TEN_GIGA) - retval.append("Could not enable/disable 10GbE in the detector.\n"); - - if(slsErrorMask&DETECTOR_ACTIVATE) - retval.append("Could not activate/deactivate detector\n"); - - if(slsErrorMask&RECEIVER_DET_POSID_NOT_SET) - retval.append("Could not set detector position id\n"); - - if(slsErrorMask&RECEIVER_MULTI_DET_SIZE_NOT_SET) - retval.append("Could not set multi detector size\n"); - - if(slsErrorMask&PREPARE_ACQUISITION) - retval.append("Could not prepare acquisition in detector\n"); - - if(slsErrorMask&CLEANUP_ACQUISITION) - retval.append("Could not clean up after acquisition in detector\n"); - - if(slsErrorMask®ISER_WRITE_READ) - retval.append("Could not read/write register in detector\n"); - - if(slsErrorMask&VERSION_COMPATIBILITY) - retval.append("Incompatible versions with detector or receiver. Please check log for more details.\n"); - - - - if(slsErrorMask&COULD_NOT_CONFIGURE_MAC) - retval.append("Could not configure mac\n"); - - if(slsErrorMask&COULDNOT_SET_NETWORK_PARAMETER) - retval.append("Could not set network parameter.\n"); - - if(slsErrorMask&COULDNOT_SET_ROI) - retval.append("Could not set the exact region of interest. Verify ROI set by detector.\n"); - - if(slsErrorMask&RECEIVER_READ_FREQUENCY) - retval.append("Could not set receiver read frequency.\n"); - - if(slsErrorMask&SETTINGS_NOT_SET) - retval.append("Could not set settings.\n"); - - if(slsErrorMask&SETTINGS_FILE_NOT_OPEN) - retval.append("Could not open settings file. Verify if it exists.\n"); - - if(slsErrorMask&COULDNOT_START_RECEIVER) - retval.append("Could not start receiver.\n"); - - if(slsErrorMask&COULDNOT_STOP_RECEIVER) - retval.append("Could not stop receiver.\n"); - - if(slsErrorMask&DETECTOR_TIMER_VALUE_NOT_SET) - retval.append("Could not set one of timer values in detector.\n"); - - if(slsErrorMask&RECEIVER_ACQ_PERIOD_NOT_SET) - retval.append("Could not set acquisition period in receiver.\n"); - - if(slsErrorMask&RECEIVER_FRAME_NUM_NOT_SET) - retval.append("Could not set frame number in receiver.\n"); - - if(slsErrorMask&RECEIVER_DYNAMIC_RANGE) - retval.append("Could not set dynamic range in receiver.\n"); - - if(slsErrorMask&RECEIVER_TEN_GIGA) - retval.append("Could not enable/disable 10GbE in the receiver.\n"); - - if(slsErrorMask&ALLTIMBITS_NOT_SET) - retval.append("Could not set all trimbits to value.\n"); - - if(slsErrorMask&COULD_NOT_SET_SPEED_PARAMETERS) - retval.append("Could not set the speed parameter value\n"); - - if(slsErrorMask&COULD_NOT_SET_READOUT_FLAGS) - retval.append("Could not set the readout flag\n"); - - if(slsErrorMask&COULD_NOT_SET_FIFO_DEPTH) - retval.append("Could not set receiver fifo depth\n"); - - if(slsErrorMask&COULD_NOT_SET_COUNTER_BIT) - retval.append("Could not set/reset counter bit\n"); - - if(slsErrorMask&COULD_NOT_PULSE_PIXEL) - retval.append("Could not pulse pixel\n"); - - if(slsErrorMask&COULD_NOT_PULSE_PIXEL_NMOVE) - retval.append("Could not pulse pixel and move\n"); - - if(slsErrorMask&COULD_NOT_PULSE_CHIP) - retval.append("Could not pulse chip\n"); - - if(slsErrorMask&COULD_NOT_SET_RATE_CORRECTION) - retval.append("Could not set rate correction\n"); - - if(slsErrorMask&DETECTOR_NETWORK_PARAMETER) - retval.append("Could not set/get detector network parameter\n"); - - if(slsErrorMask&RATE_CORRECTION_NOT_32or16BIT) - retval.append("Rate correction Deactivated, must be in 32 or 16 bit mode\n"); - - if(slsErrorMask&RATE_CORRECTION_NO_TAU_PROVIDED) - retval.append("Rate correction Deactivated. No default tau provided in file\n"); - - if(slsErrorMask&PROGRAMMING_ERROR) - retval.append("Could not program FPGA\n"); - - if(slsErrorMask&RECEIVER_ACTIVATE) - retval.append("Could not activate/deactivate receiver\n"); - - if(slsErrorMask&DATA_STREAMING) - retval.append("Could not enable/disable Data Streaming\n"); - - if(slsErrorMask&RESET_ERROR) - retval.append("Could not reset the FPGA\n"); - - if(slsErrorMask&POWER_CHIP) - retval.append("Could not power on/off/get the chip\n"); - - if(slsErrorMask&RECEIVER_READ_TIMER) - retval.append("Could not set receiver read timer\n"); - - if(slsErrorMask&RECEIVER_FLIPPED_DATA_NOT_SET) - retval.append("Could not set receiver flipped data/bottom\n"); - - if(slsErrorMask&THRESHOLD_NOT_SET) - retval.append("Could not set threshold\n"); - - if(slsErrorMask&RECEIVER_FILE_FORMAT) - retval.append("Could not set receiver file format\n"); - - if(slsErrorMask&RECEIVER_TIMER_NOT_SET) - retval.append("Could not set timer in receiver.\n"); - - if(slsErrorMask&RECEIVER_PARAMETER_NOT_SET) - retval.append("Could not set a paramater in receiver.\n"); - - if(slsErrorMask&RECEIVER_ENABLE_GAPPIXELS_NOT_SET) - retval.append("Could not enable/disable gap pixels in receiver.\n"); - - if(slsErrorMask&RESTREAM_STOP_FROM_RECEIVER) - retval.append("Could not restream stop from receiver.\n"); - - if(slsErrorMask&TEMPERATURE_CONTROL) - retval.append("Could not set/get threshold temperature, temp control or temp event.\n"); - - if(slsErrorMask&AUTO_COMP_DISABLE) - retval.append("Could not set/get auto comparator disable\n"); - - if(slsErrorMask&CONFIG_FILE) - retval.append("Could not load/write config file\n"); - - //------------------------------------------------------ length of message - - - return retval; - - } - - - /** Sets multi error mask - @param multi error mask to be set to - /returns multi error mask - */ - int64_t setErrorMask(int64_t i){errorMask=i;return getErrorMask();}; - - /**returns multi error mask */ - int64_t getErrorMask(){return errorMask;}; - - /** Clears error mask - /returns error mask - */ - int64_t clearErrorMask(){errorMask=0;return errorMask;}; - - /** Gets the not added detector list - /returns list - */ - char* getNotAddedList(){return notAddedList;}; - - /** Append the detector to not added detector list - * @param name append to the list - /returns list - */ - void appendNotAddedList(const char* name){strcat(notAddedList,name);strcat(notAddedList,"+");}; - - /** Clears not added detector list - /returns error mask - */ - void clearNotAddedList(){strcpy(notAddedList,"");}; - - -protected: - - /** Error Mask */ - int64_t errorMask; - - /** Detectors Not added List */ - char notAddedList[MAX_STR_LENGTH]; - -}; - -#endif /* ERROR_DEFS_H_ */ diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h deleted file mode 100755 index 0e3a388c0..000000000 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ /dev/null @@ -1,599 +0,0 @@ -#ifndef SLS_DETECTOR_DEFS_H -#define SLS_DETECTOR_DEFS_H - - -#ifdef __CINT__ -#define MYROOT -#define __cplusplus -#endif - -//#include -#include "sls_receiver_defs.h" - -/** default maximum string length */ -#define MAX_SCAN_STEPS 2000 -/** maxmimum number of modules per controller*/ -#define MAXMODS 24 -/** maxmimum number of detectors ina multidetector structure*/ -#define MAXDET 100 -/** header length for data :gotthard*/ -#define HEADERLENGTH 12 - -/** maximum rois */ -#define MAX_ROIS 100 - -/** maximum trim en */ -#define MAX_TRIMEN 100 - -/** maximum unit size of program sent to detector */ -#define MAX_FPGAPROGRAMSIZE (2 * 1024 *1024) - - - -#define MAX_SCAN_LEVELS 2 - -typedef char mystring[MAX_STR_LENGTH]; -typedef double mysteps[MAX_SCAN_STEPS]; - - - -#ifndef DACS_FLOAT -typedef int dacs_t; -#else -typedef float dacs_t; -#endif - -#define DEFAULT_DET_MAC "00:aa:bb:cc:dd:ee" -#define DEFAULT_DET_IP "129.129.202.46" - - -/** - \file sls_detector_defs.h -This file contains all the basic definitions common to the slsDetector class -and to the server programs running on the detector - - - * @author Anna Bergamaschi - * @version 0.1alpha (any string) - * @see slsDetector - -$Revision: 824 $ - -*/ - - -/** get flag form most functions */ -#define GET_FLAG -1 - - -#ifdef __cplusplus - -/** @short class containing all the structures, constants and enum definitions */ -class slsDetectorDefs: public virtual slsReceiverDefs{ - public: - - slsDetectorDefs(){}; - -#endif - - - enum {startScript, scriptBefore, headerBefore, headerAfter,scriptAfter, stopScript, enCalLog, angCalLog, MAX_ACTIONS}; - - - -/** - @short structure for a detector channel - - should not be used by unexperienced users - - \see ::channelRegisterBit -*/ - typedef struct { - int chan; /**< is the channel number */ - int chip; /**< is the chip number */ - int module; /**< is the module number */ - int64_t reg; /**< is the is the channel register (e.g. trimbits, calibration enable, comparator enable...) */ - } sls_detector_channel; - - /** - @short structure for a detector chip - - should not be used by unexperienced users - \see ::chipRegisterBit ::channelRegisterBit -*/ - typedef struct { - int chip; /**< is the chip number */ - int module; /**< is the module number */ - int nchan; /**< is the number of channels in the chip */ - int reg; /***/ - M_vIbias, /**< mythen 3 >*/ - M_vIinSh, /**< mythen 3 >*/ - M_VdcSh, /**< mythen 3 >*/ - M_Vth2, /**< mythen 3 >*/ - M_VPL, /**< mythen 3 >*/ - M_Vth3, /**< mythen 3 >*/ - M_casSh, /**< mythen 3 >*/ - M_cas, /**< mythen 3 >*/ - M_vIbiasSh, /**< mythen 3 >*/ - M_vIcin, /**< mythen 3 >*/ - M_vIpreOut, /**< mythen 3 >*/ - V_POWER_A = 100, /**new chiptest board */ - V_POWER_B = 101, /**new chiptest board */ - V_POWER_C = 102, /**new chiptest board */ - V_POWER_D = 103, /**new chiptest board */ - V_POWER_IO =104, /**new chiptest board */ - V_POWER_CHIP=105 ,/**new chiptest board */ - I_POWER_A=106 , /**new chiptest board */ - I_POWER_B=107 , /**new chiptest board */ - I_POWER_C=108 , /**new chiptest board */ - I_POWER_D=109 , /**new chiptest board */ - I_POWER_IO=110 , /**new chiptest board */ - V_LIMIT=111 /**new chiptest board */ -}; - -/** - detector settings indexes -*/ -enum detectorSettings{ - GET_SETTINGS=-1, /**< return current detector settings */ - STANDARD, /**< standard settings */ - FAST, /**< fast settings */ - HIGHGAIN, /**< highgain settings */ - DYNAMICGAIN, /**< dynamic gain settings */ - LOWGAIN, /**< low gain settings */ - MEDIUMGAIN, /**< medium gain settings */ - VERYHIGHGAIN, /**< very high gain settings */ - LOWNOISE, /**< low noise settings */ - DYNAMICHG0, /**< dynamic high gain 0 */ - FIXGAIN1, /**< fix gain 1 */ - FIXGAIN2, /**< fix gain 2 */ - FORCESWITCHG1, /**< force switch gain 1 */ - FORCESWITCHG2, /**< force switch gain 2 */ - VERYLOWGAIN, /**< very low gain settings */ - UNDEFINED=200, /**< undefined or custom settings */ - UNINITIALIZED /**< uninitialiazed (status at startup) */ -}; -/** - meaning of the channel register bits - \see ::sls_detector_channel -*/ -enum channelRegisterBit { - TRIMBIT_OFF=0, /**< offset of trimbit value in the channel register */ - COMPARATOR_ENABLE=0x100, /**< mask of the comparator enable bit */ - ANALOG_SIGNAL_ENABLE=0x200, /**< mask of the analogue output enable bit */ - CALIBRATION_ENABLE=0x300, /**< mask of the calibration input enable bit */ -}; - -#define TRIMBITMASK 0x3f -/** - meaning of the chip register bits - \see ::sls_detector_chip -*/ -enum chipRegisterBit { - ENABLE_ANALOG_OUTPUT=0x1, /**< mask of the analogue output enable bit */ - CHIP_OUTPUT_WIDTH=0x2 /**< mask of the chip output width */ -}; -/** - meaning of the module register bits -*/ -enum moduleRegisterBit { - MY_MODULE_REGISTER_BIT, /**< possible module register bit meaning */ - MODULE_OUTPUT_WIDTH /**< possibly module dynamic range */ -}; - - -/** - important speed parameters -*/ -enum speedVariable { - CLOCK_DIVIDER, /**< readout clock divider */ - WAIT_STATES, /**< wait states for bus read */ - TOT_CLOCK_DIVIDER, /**< wait states for bus read */ - TOT_DUTY_CYCLE, /**< wait states for bus read */ - SET_SIGNAL_LENGTH, /**< set/clear signal length */ - PHASE_SHIFT, /**< adds phase shift */ - OVERSAMPLING, /**< oversampling for analog detectors */ - ADC_CLOCK, /**< adc clock divider */ - ADC_PHASE, /**< adc clock phase */ - ADC_PIPELINE, /**< adc pipeline */ - DBIT_CLOCK, /**< adc clock divider */ - DBIT_PHASE, /**< adc clock phase */ - DBIT_PIPELINE /**< adc pipeline */ -}; - - -/** - readout flags -*/ -enum readOutFlags { - GET_READOUT_FLAGS=-1, /**< return readout flags */ - NORMAL_READOUT=0, /**< no flag */ - STORE_IN_RAM=0x1, /**< data are stored in ram and sent only after end of acquisition for faster frame rate */ - READ_HITS=0x2, /**< return only the number of the channel which counted ate least one */ - ZERO_COMPRESSION=0x4,/**< returned data are 0-compressed */ - PUMP_PROBE_MODE=0x8,/**
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 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.0.1.22.1 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv4.0.1.22.1 deleted file mode 100755 index 63e32f9fc826da5d13dfe0665ce70b1d4ae38f1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306422 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 diff --git a/slsDetectorSoftware/eigerDetectorServer/communication_funcs.c b/slsDetectorSoftware/eigerDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/communication_funcs.h b/slsDetectorSoftware/eigerDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt b/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt deleted file mode 100644 index b442b6b9a..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/eigerDetectorServer -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: ef3e01b9bdf3a6a08367e2448bcc92bd13cf73ad -Revision: 351 -Branch: 4.0.1-rc -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4068 -Last Changed Date: 2019-02-06 14:44:47.000000002 +0100 ./xparameters.h diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h deleted file mode 100644 index cef8cc341..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEiger.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "ef3e01b9bdf3a6a08367e2448bcc92bd13cf73ad" -#define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4068 -#define GITDATE 0x20190206 -#define GITBRANCH "4.0.1-rc" diff --git a/slsDetectorSoftware/eigerDetectorServer/gitInfoEigerTmp.h b/slsDetectorSoftware/eigerDetectorServer/gitInfoEigerTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/gitInfoEigerTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorSoftware/eigerDetectorServer/renameServer.sh b/slsDetectorSoftware/eigerDetectorServer/renameServer.sh deleted file mode 100644 index 54d5d2622..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/renameServer.sh +++ /dev/null @@ -1,4 +0,0 @@ -mv bin/eigerDetectorServer bin/$2 -cp bin/$2 /tftpboot -git rm -f bin/$1 -git add bin/$2 diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c deleted file mode 100644 index ddfd53164..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ /dev/null @@ -1,1866 +0,0 @@ -//#ifdef SLS_DETECTOR_FUNCTION_LIST - - -#include -#include //to gethostname -#include -#ifdef VIRTUAL -#include -#include -#endif - -#include "slsDetectorFunctionList.h" -#ifndef VIRTUAL -#include "gitInfoEiger.h" -#include "FebControl.h" -#include "Beb.h" -#include "versionAPI.h" -#endif - -int default_tau_from_file= -1; - -#define BEB_NUM 34 - -enum detectorSettings thisSettings; -const char* dac_names[16] = {"SvP","Vtr","Vrf","Vrs","SvN","Vtgstv","Vcmp_ll","Vcmp_lr","cal","Vcmp_rl","rxb_rb","rxb_lb","Vcmp_rr","Vcp","Vcn","Vis"}; - -enum{E_PARALLEL, E_NON_PARALLEL, E_SAFE}; - -sls_detector_module *detectorModules=NULL; -int *detectorChips=NULL; -int *detectorChans=NULL; -dacs_t *detectorDacs=NULL; -dacs_t *detectorAdcs=NULL; - -int eiger_highvoltage = 0; -int eiger_theo_highvoltage = 0; -int eiger_iodelay = 0; -int eiger_photonenergy = 0; -int eiger_dynamicrange = 0; -int eiger_readoutmode = 0; -int eiger_storeinmem = 0; -int eiger_overflow32 = 0; -int eiger_readoutspeed = 0; -int eiger_triggermode = 0; -int eiger_extgating = 0; -int eiger_extgatingpolarity = 0; - - -int eiger_nexposures = 1; -int eiger_ncycles = 1; - - -#ifdef VIRTUAL -//values for virtual server -double eiger_virtual_exptime = 0; -int64_t eiger_virtual_subexptime = 0; -int64_t eiger_virtual_subperiod = 0; -double eiger_virtual_period = 0; -int eiger_virtual_counter_bit=1; -int eiger_virtual_ratecorrection_variable=0; -int64_t eiger_virtual_ratetable_tau_in_ns=-1; -int64_t eiger_virtual_ratetable_period_in_ns=-1; -int eiger_virtual_transmission_delay_left=0; -int eiger_virtual_transmission_delay_right=0; -int eiger_virtual_transmission_delay_frame=0; -int eiger_virtual_transmission_flowcontrol_10g=0; -int eiger_virtual_status=0; -int eiger_virtual_activate=1; -pthread_t eiger_virtual_tid; -int eiger_virtual_stop = 0; -#endif - - -int send_to_ten_gig = 0; -int ndsts_in_use=32; -unsigned int nimages_per_request=1; -int on_dst=0; -int dst_requested[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; - - -int default_gain_values[3] = {517000,517000,517000}; -int default_offset_values[3] = {3851000,3851000,3851000}; - - -enum masterFlags masterMode=IS_SLAVE; -int top = 0; -int master = 0; -int normal = 0; -#ifndef VIRTUAL -uint32_t detid = 0; -#endif - -/* basic tests */ - -int firmware_compatibility = OK; -int firmware_check_done = 0; -char firmware_message[MAX_STR_LENGTH]; - - -int isFirmwareCheckDone() { - return firmware_check_done; -} - -int getFirmwareCheckResult(char** mess) { - *mess = firmware_message; - return firmware_compatibility; -} - -void checkFirmwareCompatibility(int flag){ - firmware_compatibility = OK; - firmware_check_done = 0; - memset(firmware_message, 0, MAX_STR_LENGTH); -#ifdef VIRTUAL - cprintf(BLUE,"\n\n" - "********************************************************\n" - "***************** EIGER Virtual Server *****************\n" - "********************************************************\n"); - firmware_check_done = 1; - return; -#endif - uint32_t ipadd = getDetectorIP(); - uint64_t macadd = getDetectorMAC(); - int64_t fwversion = getDetectorId(DETECTOR_FIRMWARE_VERSION); - int64_t swversion = getDetectorId(DETECTOR_SOFTWARE_VERSION); - int64_t sw_fw_apiversion = getDetectorId(SOFTWARE_FIRMWARE_API_VERSION); - int64_t client_sw_apiversion = getDetectorId(CLIENT_SOFTWARE_API_VERSION); - - cprintf(BLUE,"\n\n" - "********************************************************\n" - "**********************EIGER Server**********************\n" - "********************************************************\n"); - cprintf(BLUE,"\n" - "Detector IP Addr:\t\t 0x%x\n" - "Detector MAC Addr:\t\t 0x%llx\n" - - "Firmware Version:\t\t %lld\n" - "Software Version:\t\t %llx\n" - "F/w-S/w API Version:\t\t %lld\n" - "Required Firmware Version:\t %d\n" - "Client-Software API Version:\t 0x%llx\n" - "\n" - "********************************************************\n", - (unsigned int)ipadd, - (long long unsigned int)macadd, - (long long int)fwversion, - (long long int)swversion, - (long long int)sw_fw_apiversion, - REQUIRED_FIRMWARE_VERSION, - (long long int)client_sw_apiversion); - - // return if flag is not zero, debug mode - if (flag) { - firmware_check_done = 1; - return; - } - - //cant read versions - if(!fwversion || !sw_fw_apiversion){ - strcpy(firmware_message, - "FATAL ERROR: Cant read versions from FPGA. Please update firmware.\n"); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - - //check for API compatibility - old server - if(sw_fw_apiversion > REQUIRED_FIRMWARE_VERSION){ - sprintf(firmware_message, - "FATAL ERROR: This detector software software version (%lld) is incompatible.\n" - "Please update detector software (min. %lld) to be compatible with this firmware.\n", - (long long int)sw_fw_apiversion, - (long long int)REQUIRED_FIRMWARE_VERSION); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - - //check for firmware compatibility - old firmware - if( REQUIRED_FIRMWARE_VERSION > fwversion){ - sprintf(firmware_message, - "FATAL ERROR: This firmware version (%lld) is incompatible.\n" - "Please update firmware (min. %lld) to be compatible with this server.\n", - (long long int)fwversion, - (long long int)REQUIRED_FIRMWARE_VERSION); - cprintf(RED,"%s\n\n", firmware_message); - firmware_compatibility = FAIL; - firmware_check_done = 1; - return; - } - printf("Compatibility - success\n"); - firmware_check_done = 1; -} - - - - - -/* Ids */ - -int64_t getDetectorId(enum idMode arg){ -#ifdef VIRTUAL - return 0; -#else - int64_t retval = -1; - - switch(arg){ - case DETECTOR_SERIAL_NUMBER: - retval = getDetectorNumber();/** to be implemented with mac? */ - break; - case DETECTOR_FIRMWARE_VERSION: - return (int64_t)getFirmwareVersion(); - case SOFTWARE_FIRMWARE_API_VERSION: - return (int64_t)Beb_GetFirmwareSoftwareAPIVersion(); - case DETECTOR_SOFTWARE_VERSION: - return (GITDATE & 0xFFFFFF); - case CLIENT_SOFTWARE_API_VERSION: - return APIEIGER; - default: - break; - } - - return retval; -#endif -} - -u_int64_t getFirmwareVersion() { -#ifdef VIRTUAL - return 0; -#else - return Beb_GetFirmwareRevision(); -#endif -} - - - -u_int32_t getDetectorNumber(){ -#ifdef VIRTUAL - return 0; -#else - return detid; -#endif -} - - -u_int64_t getDetectorMAC() { -#ifdef VIRTUAL - return 0; -#else - char mac[255]=""; - u_int64_t res=0; - - //execute and get address - char output[255]; - FILE* sysFile = popen("more /sys/class/net/eth0/address", "r"); - //FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - //increment by 1 for 10g - if(send_to_ten_gig) - res++; - //printf("mac:%llx\n",res); - - return res; -#endif -} - - -u_int32_t getDetectorIP(){ -#ifdef VIRTUAL - return 0; -#endif - char temp[50]=""; - u_int32_t res=0; - //execute and get address - char output[255]; - FILE* sysFile = popen("ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - - //converting IPaddress to hex. - char* pcword = strtok (output,"."); - while (pcword != NULL) { - sprintf(output,"%02x",atoi(pcword)); - strcat(temp,output); - pcword = strtok (NULL, "."); - } - strcpy(output,temp); - sscanf(output, "%x", &res); - //printf("ip:%x\n",res); - - return res; -} - - - - - -/* initialization */ - -void initControlServer(){ -#ifdef VIRTUAL - getModuleConfiguration(); - setupDetector(); - printf("\n"); - return; -#else - //Feb and Beb Initializations - getModuleConfiguration(); - Feb_Interface_FebInterface(); - Feb_Control_FebControl(); - Feb_Control_Init(master,top,normal, getDetectorNumber()); - //master of 9M, check high voltage serial communication to blackfin - if(master && !normal){ - if(Feb_Control_OpenSerialCommunication()) - ;// Feb_Control_CloseSerialCommunication(); - } - printf("FEB Initialization done\n"); - Beb_Beb(); - Beb_SetDetectorNumber(getDetectorNumber()); - printf("BEB Initialization done\n"); - - - setupDetector(); -#endif - printf("\n"); -} - -void initStopServer(){ -#ifdef VIRTUAL - getModuleConfiguration(); - printf("\n"); - return; -#else - getModuleConfiguration(); - Feb_Interface_FebInterface(); - Feb_Control_FebControl(); - Feb_Control_Init(master,top,normal,getDetectorNumber()); - printf("FEB Initialization done\n"); -#endif - printf("\n"); -} - - -void getModuleConfiguration(){ -#ifdef VIRTUAL -#ifdef VIRTUAL_MASTER - master = 1; - top = 1; -#else - master = 0; - top = 1; -#endif -#ifdef VIRTUAL_9M - normal = 0; -#else - normal = 1; -#endif - if(top) printf("*************** TOP ***************\n"); - else printf("*************** BOTTOM ***************\n"); - if(master) printf("*************** MASTER ***************\n"); - else printf("*************** SLAVE ***************\n"); - if(normal) printf("*************** NORMAL ***************\n"); - else printf("*************** SPECIAL ***************\n"); - return; -#else - int *m=&master; - int *t=⊤ - int *n=&normal; - Beb_GetModuleConfiguration(m,t,n); - if(top) printf("*************** TOP ***************\n"); - else printf("*************** BOTTOM ***************\n"); - if(master) printf("*************** MASTER ***************\n"); - else printf("*************** SLAVE ***************\n"); - if(normal) printf("*************** NORMAL ***************\n"); - else printf("*************** SPECIAL ***************\n"); - - // read detector id - char output[255]; - FILE* sysFile = popen(IDFILECOMMAND, "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - sscanf(output,"%u",&detid); - printf("detector id: %u\n",detid); -#endif -} - - - -/* set up detector */ - -void allocateDetectorStructureMemory(){ - printf("This Server is for 1 Eiger half module (250k)\n"); - - //Allocation of memory - detectorModules=malloc(sizeof(sls_detector_module)); - detectorChips=malloc(NCHIP*sizeof(int)); - detectorChans=malloc(NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(NDAC*sizeof(dacs_t)); - detectorAdcs=malloc(NADC*sizeof(dacs_t)); -#ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); - printf("chips from 0x%x to 0x%x\n",detectorChips, detectorChips+n*NCHIP); - printf("chans from 0x%x to 0x%x\n",detectorChans, detectorChans+n*NCHIP*NCHAN); - printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); - printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); -#endif - (detectorModules)->dacs=detectorDacs; - (detectorModules)->adcs=detectorAdcs; - (detectorModules)->chipregs=detectorChips; - (detectorModules)->chanregs=detectorChans; - (detectorModules)->ndac=NDAC; - (detectorModules)->nadc=NADC; - (detectorModules)->nchip=NCHIP; - (detectorModules)->nchan=NCHIP*NCHAN; - (detectorModules)->module=0; - (detectorModules)->gain=0; - (detectorModules)->offset=0; - (detectorModules)->reg=0; - thisSettings = UNINITIALIZED; - - // if trimval requested, should return -1 to acknowledge unknown - int ichan=0; - for (ichan=0; ichan<(detectorModules->nchan); ichan++) { - *((detectorModules->chanregs)+ichan) = -1; - } -} - - - -void setupDetector() { - - allocateDetectorStructureMemory(); - //set dacs - printf("Setting Default Dac values\n"); - { - int i = 0; - int retval[2]={-1,-1}; - const int defaultvals[NDAC] = DEFAULT_DAC_VALS; - for(i = 0; i < NDAC; ++i) { - setDAC((enum DACINDEX)i,defaultvals[i],0,0,retval); - if (retval[0] != defaultvals[i]) - cprintf(RED, "Warning: Setting dac %d failed, wrote %d, read %d\n",i ,defaultvals[i], retval[0]); - } - } - - //setting default measurement parameters - setTimer(FRAME_NUMBER, DEFAULT_NUM_FRAMES); - setTimer(ACQUISITION_TIME, DEFAULT_EXPTIME); - setTimer(SUBFRAME_ACQUISITION_TIME, DEFAULT_SUBFRAME_EXPOSURE); - setTimer(SUBFRAME_DEADTIME, DEFAULT_SUBFRAME_DEADTIME); - setTimer(FRAME_PERIOD, DEFAULT_PERIOD); - setTimer(CYCLES_NUMBER, DEFAULT_NUM_CYCLES); - setDynamicRange(DEFAULT_DYNAMIC_RANGE); - eiger_photonenergy = DEFAULT_PHOTON_ENERGY; - setReadOutFlags(DEFAULT_READOUT_MODE); - setReadOutFlags(DEFAULT_READOUT_STOREINRAM_MODE); - setReadOutFlags(DEFAULT_READOUT_OVERFLOW32_MODE); - setSpeed(CLOCK_DIVIDER, DEFAULT_CLK_SPEED);//clk_devider,half speed - setIODelay(DEFAULT_IO_DELAY, DEFAULT_MOD_INDEX); - setTiming(DEFAULT_TIMING_MODE); - //SetPhotonEnergyCalibrationParameters(-5.8381e-5,1.838515,5.09948e-7,-4.32390e-11,1.32527e-15); - setRateCorrection(DEFAULT_RATE_CORRECTION); - int enable[2] = {DEFAULT_EXT_GATING_ENABLE, DEFAULT_EXT_GATING_POLARITY}; - setExternalGating(enable);//disable external gating -#ifndef VIRTUAL - Feb_Control_SetInTestModeVariable(DEFAULT_TEST_MODE); -#endif - setHighVoltage(DEFAULT_HIGH_VOLTAGE); -#ifndef VIRTUAL - Feb_Control_CheckSetup(); -#endif -} - - - - -/* advanced read/write reg */ -uint32_t writeRegister(uint32_t offset, uint32_t data) { -#ifdef VIRTUAL - return 0; -#else - return Feb_Control_WriteRegister(offset, data); -#endif -} - -uint32_t readRegister(uint32_t offset) { -#ifdef VIRTUAL - return 0; -#else - return Feb_Control_ReadRegister(offset); -#endif -} - - -/* set parameters - nmod, dr, roi */ - -int setNMod(int nm, enum dimension dim){ - return NMOD; -} - - -int getNModBoard(enum dimension arg){ - return NMAXMOD; -} - -int setDynamicRange(int dr){ -#ifdef VIRTUAL - if(dr > 0){ - printf(" Setting dynamic range: %d\n",dr); - eiger_dynamicrange = dr; - } - return eiger_dynamicrange; -#else - if(dr > 0){ - printf(" Setting dynamic range: %d\n",dr); - if(Feb_Control_SetDynamicRange(dr)){ - - //EigerSetBitMode(dr); - on_dst = 0; - int i; - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested - if(Beb_SetUpTransferParameters(dr)) - eiger_dynamicrange = dr; - else printf("ERROR:Could not set bit mode in the back end\n"); - } - } - //make sure back end and front end have the same bit mode - dr= Feb_Control_GetDynamicRange(); - - return dr; -#endif -} - - - - -/* parameters - readout */ - -int setSpeed(enum speedVariable arg, int val){ - - if (arg != CLOCK_DIVIDER) - return -1; - - if(val != -1){ - printf(" Setting Read out Speed: %d\n",val); -#ifndef VIRTUAL - if(Feb_Control_SetReadoutSpeed(val)) -#endif - eiger_readoutspeed = val; - } - return eiger_readoutspeed; -} - - -enum readOutFlags setReadOutFlags(enum readOutFlags val){ - - enum readOutFlags retval = GET_READOUT_FLAGS; - if(val!=GET_READOUT_FLAGS){ - - - if(val&0xF0000){ - switch(val){ - case PARALLEL: val=E_PARALLEL; printf(" Setting Read out Flag: Parallel\n"); break; - case NONPARALLEL: val=E_NON_PARALLEL; printf(" Setting Read out Flag: Non Parallel\n"); break; - case SAFE: val=E_SAFE; printf(" Setting Read out Flag: Safe\n"); break; - - default: - cprintf(RED,"Cannot set unknown readout flag. 0x%x\n", val); - return -1; - } - printf(" Setting Read out Flag: %d\n",val); -#ifndef VIRTUAL - if(Feb_Control_SetReadoutMode(val)) -#endif - eiger_readoutmode = val; -#ifndef VIRTUAL - else return -1; -#endif - - } - - else if (val&0xF00000) { - switch(val){ - case SHOW_OVERFLOW: val=1; printf(" Setting Read out Flag: Overflow in 32 bit mode\n"); break; - case NOOVERFLOW: val=0; printf(" Setting Read out Flag: No overflow in 32 bit mode\n"); break; - default: - cprintf(RED,"Cannot set unknown readout flag. 0x%x\n", val); - return -1; - } - printf(" Setting Read out Flag: %d\n",val); -#ifndef VIRTUAL - if(Beb_Set32bitOverflow(val) != -1) -#endif - eiger_overflow32 = val; -#ifndef VIRTUAL - else return -1; -#endif - } - - - else{ - switch(val){ - case STORE_IN_RAM: val=1; printf(" Setting Read out Flag: Store in Ram\n"); break; - case CONTINOUS_RO: val=0; printf(" Setting Read out Flag: Continuous Readout\n"); break; - - default: - cprintf(RED,"Cannot set unknown readout flag. 0x%x\n", val); - return -1; - } - printf(" Setting store in ram variable: %d\n",val); - eiger_storeinmem = val; - - } - } - - switch(eiger_readoutmode){ - case E_PARALLEL: retval=PARALLEL; break; - case E_NON_PARALLEL: retval=NONPARALLEL; break; - case E_SAFE: retval=SAFE; break; - } - - switch(eiger_overflow32){ - case 1: retval|=SHOW_OVERFLOW; break; - case 0: retval|=NOOVERFLOW; break; - } - - - switch(eiger_storeinmem){ - case 0: retval|=CONTINOUS_RO; break; - case 1: retval|=STORE_IN_RAM; break; - } - - - - printf("Read out Flag: 0x%x\n",retval); - return retval; -} - - - - - - - - -/* parameters - timer */ - -int64_t setTimer(enum timerIndex ind, int64_t val){ -#ifndef VIRTUAL - int64_t subdeadtime = 0; -#endif - int64_t subexptime = 0; - switch(ind){ - case FRAME_NUMBER: - if(val >= 0){ - printf(" Setting number of frames: %d * %d\n",(unsigned int)val,eiger_ncycles); -#ifndef VIRTUAL - if(Feb_Control_SetNExposures((unsigned int)val*eiger_ncycles)){ - eiger_nexposures = val; - //SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); - on_dst = 0; - int i; - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested - ndsts_in_use = 1; - nimages_per_request = eiger_nexposures * eiger_ncycles; - } -#else - eiger_nexposures = val; - nimages_per_request = eiger_nexposures * eiger_ncycles; -#endif - }return eiger_nexposures; - - case ACQUISITION_TIME: - if(val >= 0){ - printf(" Setting exp time: %fs\n",val/(1E9)); -#ifndef VIRTUAL - Feb_Control_SetExposureTime(val/(1E9)); -#else - eiger_virtual_exptime = (val/(1E9)); -#endif - } -#ifndef VIRTUAL - return (Feb_Control_GetExposureTime()*(1E9)); -#else - return eiger_virtual_exptime*1e9; -#endif - - case SUBFRAME_ACQUISITION_TIME: - if(val >= 0){ - printf(" Setting sub exp time: %lldns\n",(long long int)val); -#ifndef VIRTUAL - // calculate subdeadtime before settings subexptime - subdeadtime = Feb_Control_GetSubFramePeriod() - - Feb_Control_GetSubFrameExposureTime(); - - Feb_Control_SetSubFrameExposureTime(val/10); - // set subperiod - Feb_Control_SetSubFramePeriod((val+subdeadtime)/10); -#else - int64_t subdeadtime = eiger_virtual_subperiod*10 - - eiger_virtual_subexptime*10; - eiger_virtual_subexptime = (val/(10)); - eiger_virtual_subperiod = (val+subdeadtime/10); -#endif - } -#ifndef VIRTUAL - return (Feb_Control_GetSubFrameExposureTime()); -#else - return eiger_virtual_subexptime*10; -#endif - - case SUBFRAME_DEADTIME: -#ifndef VIRTUAL - // get subexptime - subexptime = Feb_Control_GetSubFrameExposureTime(); -#else - subexptime = eiger_virtual_subexptime*10; -#endif - if(val >= 0){ - printf(" Setting sub period: %lldns = subexptime(%lld) + subdeadtime(%lld)\n", - (long long int)(val + subexptime), - (long long int)subexptime, - (long long int)val); - //calculate subperiod - val += subexptime; -#ifndef VIRTUAL - Feb_Control_SetSubFramePeriod(val/10); -#else - eiger_virtual_subperiod = (val/10); -#endif - } -#ifndef VIRTUAL - return (Feb_Control_GetSubFramePeriod() - subexptime); -#else - return (eiger_virtual_subperiod*10 - subexptime); -#endif - - case FRAME_PERIOD: - if(val >= 0){ - printf(" Setting acq period: %fs\n",val/(1E9)); -#ifndef VIRTUAL - Feb_Control_SetExposurePeriod(val/(1E9)); -#else - eiger_virtual_period = (val/(1E9)); -#endif - } -#ifndef VIRTUAL - return (Feb_Control_GetExposurePeriod()*(1E9)); -#else - return eiger_virtual_period*1e9; -#endif - - case CYCLES_NUMBER: - if(val >= 0){ - printf(" Setting number of triggers: %d * %d\n",(unsigned int)val,eiger_nexposures); -#ifndef VIRTUAL - if(Feb_Control_SetNExposures((unsigned int)val*eiger_nexposures)){ - eiger_ncycles = val; - //SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); - on_dst = 0; - int i; - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested - nimages_per_request = eiger_nexposures * eiger_ncycles; - } -#else - eiger_ncycles = val; - nimages_per_request = eiger_nexposures * eiger_ncycles; -#endif - } - return eiger_ncycles; - default: - cprintf(RED,"Warning: Timer Index not implemented for this detector: %d\n", ind); - break; - } - - return -1; -} - - -int64_t getTimeLeft(enum timerIndex ind) { -#ifdef VIRTUAL - return 0; -#else - switch(ind){ - case MEASURED_PERIOD: return Feb_Control_GetMeasuredPeriod(); - case MEASURED_SUBPERIOD: return Feb_Control_GetSubMeasuredPeriod(); - return 0; - default: - cprintf(RED,"This timer left index (%d) not defined for Eiger\n",ind); - return -1; - } -#endif -} - - - - -/* parameters - channel, chip, module, settings */ - - -int setModule(sls_detector_module myMod, int delay){ - int retval[2]; - int i; - - //#ifdef VERBOSE - printf("Setting module with settings %d\n",myMod.reg); - //#endif - - //copy module locally (module number, serial number, gain offset, - //dacs (pointless), trimbit values(if needed) - if (detectorModules) - if (copyModule(detectorModules,&myMod) == FAIL) - return FAIL; - - // settings - setSettings( (enum detectorSettings)myMod.reg,-1); - - // iodelay - if(setIODelay(delay, -1)!= delay){ - cprintf(RED,"could not set iodelay %d\n",delay); - return FAIL; - } - - // dacs - for(i=0;idacs)+i)); - } - - //trimbits - unsigned int* tt; - tt = Feb_Control_GetTrimbits(); - - //exclude gap pixels - int iy,ichip,ix,ip=0,ich=0; - for(iy=0;iy<256;iy++) { - for (ichip=0; ichip<4; ichip++) { - for(ix=0;ix<256;ix++) { - myMod->chanregs[ich++]=tt[ip++]; - } - if (ichip<3) { - ip++; - ip++; - } - } - } -#endif - - //copy local module to myMod - if (detectorModules) { - if (copyModule(myMod, detectorModules) == FAIL) - return FAIL; - } - else - return FAIL; - return OK; -} - - - -enum detectorSettings setSettings(enum detectorSettings sett, int imod){ - if(sett == UNINITIALIZED){ - return thisSettings; - }if(sett != GET_SETTINGS) - thisSettings = sett; - printf(" Settings: %d\n", thisSettings); - return thisSettings; -} - -enum detectorSettings getSettings(){ - return thisSettings; -} - - - - - - -/* parameters - threshold */ - -int getThresholdEnergy(int imod){ - printf(" Getting Threshold energy\n"); - return eiger_photonenergy; -} - - -int setThresholdEnergy(int ev, int imod){ - printf(" Setting threshold energy:%d\n",ev); - if(ev >= 0) - eiger_photonenergy = ev; - return getThresholdEnergy(imod); -} - - - - - -/* parameters - dac, adc, hv */ - -void setDAC(enum DACINDEX ind, int val, int imod, int mV, int retval[]){ - printf("Going to set dac %d to %d of imod %d with mv mode %d \n", (int)ind, val, imod, mV); - if(ind == VTHRESHOLD){ - int ret[5]; - setDAC(VCMP_LL,val,imod,mV,retval); - ret[0] = retval[mV]; - setDAC(VCMP_LR,val,imod,mV,retval); - ret[1] = retval[mV]; - setDAC(VCMP_RL,val,imod,mV,retval); - ret[2] = retval[mV]; - setDAC(VCMP_RR,val,imod,mV,retval); - ret[3] = retval[mV]; - setDAC(VCP,val,imod,mV,retval); - ret[4] = retval[mV]; - - - if((ret[0]== ret[1])&& - (ret[1]==ret[2])&& - (ret[2]==ret[3]) && - (ret[3]==ret[4])) - cprintf(GREEN,"vthreshold match\n"); - else{ - retval[0] = -1;retval[1] = -1; - cprintf(RED,"vthreshold mismatch 0:%d 1:%d 2:%d 3:%d\n", - ret[0],ret[1],ret[2],ret[3]); - } - return; - } - char iname[10]; - - if(((int)ind>=0)&&((int)ind= 0) - printf("Setting dac %d: %s to %d ",ind, iname,val); - else - printf("Getting dac %d: %s ",ind, iname); - if(mV) - printf("in mV\n"); - else - printf("in dac units\n"); -#endif -#ifdef VIRTUAL - if (mV){ - retval[0] = (int)(((val-0)/(2048-0))*(4096-1) + 0.5); - retval[1] = val; - }else - retval[0] = val; - -#else - if(val >= 0) - Feb_Control_SetDAC(iname,val,mV); - int k; - Feb_Control_GetDAC(iname, &k,0); - retval[0] = k; - Feb_Control_GetDAC(iname,&k,1); - retval[1] = k; -#endif - (detectorModules)->dacs[ind] = retval[0]; - -} - - - -int getADC(enum ADCINDEX ind, int imod){ -#ifdef VIRTUAL - return 0; -#else - int retval = -1; - char tempnames[6][20]={"FPGA EXT", "10GE","DCDC", "SODL", "SODR", "FPGA"}; - char cstore[255]; - - switch(ind){ - case TEMP_FPGA: - retval=getBebFPGATemp(); - break; - case TEMP_FPGAFEBL: - retval=Feb_Control_GetLeftFPGATemp(); - break; - case TEMP_FPGAFEBR: - retval=Feb_Control_GetRightFPGATemp(); - break; - case TEMP_FPGAEXT: - case TEMP_10GE: - case TEMP_DCDC: - case TEMP_SODL: - case TEMP_SODR: - sprintf(cstore,"more /sys/class/hwmon/hwmon%d/device/temp1_input",ind); - FILE* sysFile = popen(cstore, "r"); - fgets(cstore, sizeof(cstore), sysFile); - pclose(sysFile); - sscanf(cstore,"%d",&retval); - break; - default: - return -1; - } - - printf("Temperature %s: %f°C\n",tempnames[ind],(double)retval/1000.00); - - return retval; -#endif -} - - -int setHighVoltage(int val){ -#ifdef VIRTUAL - if (master) { - // set - if(val!=-1){ - eiger_theo_highvoltage = val; - } - return eiger_theo_highvoltage; - } - - return SLAVE_HIGH_VOLTAGE_READ_VAL; -#else - - if (master) { - - // set - if(val!=-1){ - eiger_theo_highvoltage = val; - int ret = Feb_Control_SetHighVoltage(val); - if(!ret) //could not set - return -2; - else if (ret == -1) //outside range - return -1; - } - - // get - if (!Feb_Control_GetHighVoltage(&eiger_highvoltage)) { - cprintf(RED,"Warning: Could not read high voltage\n"); - return -3; - } - - // tolerance of 5 - if (abs(eiger_theo_highvoltage-eiger_highvoltage) > HIGH_VOLTAGE_TOLERANCE) { - cprintf(BLUE, "High voltage still ramping: %d\n", eiger_highvoltage); - return eiger_highvoltage; - } - return eiger_theo_highvoltage; - } - - return SLAVE_HIGH_VOLTAGE_READ_VAL; -#endif -} - - - - - - - -/* parameters - timing, extsig */ - -enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ - enum externalCommunicationMode ret=GET_EXTERNAL_COMMUNICATION_MODE; - if(arg != GET_EXTERNAL_COMMUNICATION_MODE){ - switch((int)arg){ - case AUTO_TIMING: ret = 0; break; - case TRIGGER_EXPOSURE: ret = 2; break; - case BURST_TRIGGER: ret = 1; break; - case GATE_FIX_NUMBER: ret = 3; break; - } - printf(" Setting Triggering Mode: %d\n",(int)ret); -#ifndef VIRTUAL - if(Feb_Control_SetTriggerMode(ret,1)) -#endif - eiger_triggermode = ret; - } - - ret = eiger_triggermode; - switch((int)ret){ - case 0: ret = AUTO_TIMING; break; - case 2: ret = TRIGGER_EXPOSURE; break; - case 1: ret = BURST_TRIGGER; break; - case 3: ret = GATE_FIX_NUMBER; break; - default: - printf("Unknown trigger mode found %d\n",ret); - ret = 0; - } - return ret; -} - - - - - - -/* configure mac */ - -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2, int ival) { -#ifndef VIRTUAL - char src_mac[50], src_ip[50],dst_mac[50], dst_ip[50]; - int src_port = 0xE185; - sprintf(src_ip,"%d.%d.%d.%d",(sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff); - sprintf(dst_ip,"%d.%d.%d.%d",(destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((sourcemac>>40)&0xFF), - (unsigned int)((sourcemac>>32)&0xFF), - (unsigned int)((sourcemac>>24)&0xFF), - (unsigned int)((sourcemac>>16)&0xFF), - (unsigned int)((sourcemac>>8)&0xFF), - (unsigned int)((sourcemac>>0)&0xFF)); - sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((destmac>>40)&0xFF), - (unsigned int)((destmac>>32)&0xFF), - (unsigned int)((destmac>>24)&0xFF), - (unsigned int)((destmac>>16)&0xFF), - (unsigned int)((destmac>>8)&0xFF), - (unsigned int)((destmac>>0)&0xFF)); - - printf("src_port:%d\n",src_port); - printf("src_ip:%s\n",src_ip); - printf("dst_ip:%s\n",dst_ip); - printf("src_mac:%s\n",src_mac); - printf("dst_mac:%s\n",dst_mac); - - - int beb_num = BEB_NUM;//Feb_Control_GetModuleNumber(); - int header_number = 0; - int dst_port = udpport; - if(!top) - dst_port = udpport2; - - printf("dst_port:%d\n\n",dst_port); - - int i=0; - /* for(i=0;i<32;i++){ modified for Aldo*/ - if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && - Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) - printf("set up left ok\n"); - else return -1; - /*}*/ - - header_number = 32; - dst_port = udpport2; - if(!top) - dst_port = udpport; - printf("dst_port:%d\n\n",dst_port); - - /*for(i=0;i<32;i++){*//** modified for Aldo*/ - if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && - Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) - printf("set up right ok\n\n"); - else return -1; - /*}*/ - - on_dst = 0; - - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested - nimages_per_request=eiger_nexposures * eiger_ncycles; -#endif - return 0; -} - - - -int setDetectorPosition(int pos[]) { -#ifdef VIRTUAL - return OK; -#else - return Beb_SetDetectorPosition(pos); -#endif -} - - - - - -/* eiger specific - iodelay, 10g, pulse, rate, temp, activate, delay nw parameter */ - -int setIODelay(int val, int imod){ - if(val!=-1){ - printf(" Setting IO Delay: %d\n",val); -#ifndef VIRTUAL - if(Feb_Control_SetIDelays(Feb_Control_GetModuleNumber(),val)) -#endif - eiger_iodelay = val; - } - return eiger_iodelay; -} - - -int enableTenGigabitEthernet(int val){ - if(val!=-1){ - if(val>0) - send_to_ten_gig = 1; - else - send_to_ten_gig = 0; - //configuremac called from client - } -#ifdef VERBOSE - printf("10Gbe:%d\n",send_to_ten_gig); -#endif - return send_to_ten_gig; -} - - -int setCounterBit(int val){ - if(val!=-1){ -#ifdef VIRTUAL - eiger_virtual_counter_bit = val; -#else - Feb_Control_Set_Counter_Bit(val); -#endif -#ifdef VERBOSE - printf("Counter Bit:%d\n",val); -#endif - } -#ifdef VIRTUAL - return eiger_virtual_counter_bit; -#else - return Feb_Control_Get_Counter_Bit(); -#endif -} - - -int pulsePixel(int n, int x, int y){ -#ifndef VIRTUAL - if(!Feb_Control_Pulse_Pixel(n,x,y)) - return FAIL; -#endif - return OK; -} - -int pulsePixelNMove(int n, int x, int y){ -#ifndef VIRTUAL - if(!Feb_Control_PulsePixelNMove(n,x,y)) - return FAIL; -#endif - return OK; -} - -int pulseChip(int n){ -#ifndef VIRTUAL - if(!Feb_Control_PulseChip(n)) - return FAIL; -#endif - return OK; -} - -int64_t setRateCorrection(int64_t custom_tau_in_nsec){//in nanosec (will never be -1) -#ifdef VIRTUAL - //deactivating rate correction - if(custom_tau_in_nsec==0){ - eiger_virtual_ratecorrection_variable = 0; - return 0; - } - - //when dynamic range changes, use old tau - else if(custom_tau_in_nsec == -1) - custom_tau_in_nsec = eiger_virtual_ratetable_tau_in_ns; - - //get period = subexptime if 32bit , else period = exptime if 16 bit - int64_t actual_period = eiger_virtual_subexptime*10; //already in nsec - if(eiger_dynamicrange == 16) - actual_period = eiger_virtual_exptime; - - int64_t ratetable_period_in_nsec = eiger_virtual_ratetable_period_in_ns; - int64_t tau_in_nsec = eiger_virtual_ratetable_tau_in_ns; - - - - //same setting - if((tau_in_nsec == custom_tau_in_nsec) && (ratetable_period_in_nsec == actual_period)){ - if(eiger_dynamicrange == 32) - printf("Rate Table already created before: Same Tau %lldns, Same subexptime %lldns\n", - (long long int)tau_in_nsec,(long long int)ratetable_period_in_nsec); - else - printf("Rate Table already created before: Same Tau %lldns, Same exptime %lldns\n", - (long long int)tau_in_nsec,(long long int)ratetable_period_in_nsec); - } - //different setting, calculate table - else{ - eiger_virtual_ratetable_tau_in_ns = custom_tau_in_nsec; - double period_in_sec = (double)(eiger_virtual_subexptime*10)/(double)1e9; - if(eiger_dynamicrange == 16) - period_in_sec = eiger_virtual_exptime; - eiger_virtual_ratetable_period_in_ns = period_in_sec*1e9; - } - //activating rate correction - eiger_virtual_ratecorrection_variable = 1; - printf("Rate Correction Value set to %lld ns\n",(long long int)eiger_virtual_ratetable_tau_in_ns); - - return eiger_virtual_ratetable_tau_in_ns; -#else - - //deactivating rate correction - if(custom_tau_in_nsec==0){ - Feb_Control_SetRateCorrectionVariable(0); - return 0; - } - - //when dynamic range changes, use old tau - else if(custom_tau_in_nsec == -1) - custom_tau_in_nsec = Feb_Control_Get_RateTable_Tau_in_nsec(); - - - int dr = Feb_Control_GetDynamicRange(); - //get period = subexptime if 32bit , else period = exptime if 16 bit - int64_t actual_period = Feb_Control_GetSubFrameExposureTime(); //already in nsec - if(dr == 16) - actual_period = Feb_Control_GetExposureTime_in_nsec(); - - int64_t ratetable_period_in_nsec = Feb_Control_Get_RateTable_Period_in_nsec(); - int64_t tau_in_nsec = Feb_Control_Get_RateTable_Tau_in_nsec(); - - - //same setting - if((tau_in_nsec == custom_tau_in_nsec) && (ratetable_period_in_nsec == actual_period)){ - if(dr == 32) - printf("Rate Table already created before: Same Tau %lldns, Same subexptime %lldns\n", - tau_in_nsec,ratetable_period_in_nsec); - else - printf("Rate Table already created before: Same Tau %lldns, Same exptime %lldns\n", - tau_in_nsec,ratetable_period_in_nsec); - } - //different setting, calculate table - else{ - int ret = Feb_Control_SetRateCorrectionTau(custom_tau_in_nsec); - if(ret<=0){ - cprintf(RED,"Rate correction failed. Deactivating rate correction\n"); - Feb_Control_SetRateCorrectionVariable(0); - return ret; - } - } - //activating rate correction - Feb_Control_SetRateCorrectionVariable(1); - printf("Rate Correction Value set to %lld ns\n",(long long int)Feb_Control_Get_RateTable_Tau_in_nsec()); -#ifdef VERBOSE - Feb_Control_PrintCorrectedValues(); -#endif - - return Feb_Control_Get_RateTable_Tau_in_nsec(); -#endif -} - -int getRateCorrectionEnable(){ -#ifdef VIRTUAL - return eiger_virtual_ratecorrection_variable; -#else - return Feb_Control_GetRateCorrectionVariable(); -#endif -} - -int getDefaultSettingsTau_in_nsec(){ - return default_tau_from_file; -} - -void setDefaultSettingsTau_in_nsec(int t){ - default_tau_from_file = t; - printf("Default tau set to %d\n",default_tau_from_file); -} - -int64_t getCurrentTau(){ - if(!getRateCorrectionEnable()) - return 0; - else -#ifndef VIRTUAL - return Feb_Control_Get_RateTable_Tau_in_nsec(); -#else - return eiger_virtual_ratetable_tau_in_ns; -#endif -} - -void setExternalGating(int enable[]){ - if(enable>=0){ -#ifndef VIRTUAL - Feb_Control_SetExternalEnableMode(enable[0], enable[1]);//enable = 0 or 1, polarity = 0 or 1 , where 1 is positive -#endif - eiger_extgating = enable[0]; - eiger_extgatingpolarity = enable[1]; - } - enable[0] = eiger_extgating; - enable[1] = eiger_extgatingpolarity; -} - -int setAllTrimbits(int val){ -#ifndef VIRTUAL - if(!Feb_Control_SaveAllTrimbitsTo(val)){ - cprintf(RED,"error in setting all trimbits to value\n"); - return FAIL; - } -#endif -#ifdef VERBOSE - printf("Copying register %x value %d\n",destMod->reg,val); -#endif - if (detectorModules){ - int ichan; - for (ichan=0; ichan<(detectorModules->nchan); ichan++) { - *((detectorModules->chanregs)+ichan)=val; - } - } - - cprintf(GREEN, "All trimbits have been set to %d\n", val); - return OK; -} - -int getAllTrimbits(){ - int ichan=0; - int value = *((detectorModules->chanregs)); - if (detectorModules){ - for (ichan=0; ichan<(detectorModules->nchan); ichan++) { - if(*((detectorModules->chanregs)+ichan) != value) { - value= -1; - break; - } - - } - } - printf("Value of all Trimbits: %d\n", value); - return value; -} - -int getBebFPGATemp(){ -#ifdef VIRTUAL - return 0; -#else - return Beb_GetBebFPGATemp(); -#endif -} - -int activate(int enable){ -#ifdef VIRTUAL - if (enable >=0) - eiger_virtual_activate = enable; - return eiger_virtual_activate; -#else - int ret = Beb_Activate(enable); - Feb_Control_activate(ret); - return ret; -#endif -} - -int setNetworkParameter(enum NETWORKINDEX mode, int value){ -#ifndef VIRTUAL - return Beb_SetNetworkParameter(mode, value); -#else - if (value>-1) { - switch(mode){ - case TXN_LEFT: - eiger_virtual_transmission_delay_left = value; - break; - case TXN_RIGHT: - eiger_virtual_transmission_delay_right = value; - break; - case TXN_FRAME: - eiger_virtual_transmission_delay_frame = value; - break; - case FLOWCTRL_10G: - eiger_virtual_transmission_flowcontrol_10g = value; - if(value>0) value = 1; - break; - default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); - return -1; - } - } - switch(mode){ - case TXN_LEFT: - return eiger_virtual_transmission_delay_left; - case TXN_RIGHT: - return eiger_virtual_transmission_delay_right; - case TXN_FRAME: - return eiger_virtual_transmission_delay_frame; - case FLOWCTRL_10G: - return eiger_virtual_transmission_flowcontrol_10g; - default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); - return -1; - } -#endif -} - - - - - - - -/* aquisition */ - - -int prepareAcquisition(){ -#ifndef VIRTUAL - printf("Going to prepare for acquisition with counter_bit:%d\n",Feb_Control_Get_Counter_Bit()); - Feb_Control_PrepareForAcquisition(); - printf("Going to reset Frame Number\n"); - Beb_ResetFrameNumber(); -#endif - return OK; - -} - - -int startStateMachine(){ -#ifdef VIRTUAL - eiger_virtual_status = 1; - eiger_virtual_stop = 0; - if(pthread_create(&eiger_virtual_tid, NULL, &start_timer, NULL)) { - cprintf(RED,"Could not start Virtual acquisition thread\n"); - eiger_virtual_status = 0; - return FAIL; - } - cprintf(GREEN,"***Virtual Acquisition started\n"); - return OK; -#else - - int ret = OK,prev_flag; - //get the DAQ toggle bit - prev_flag = Feb_Control_AcquisitionStartedBit(); - - printf("Going to start acquisition\n"); - Feb_Control_StartAcquisition(); - - if(!eiger_storeinmem){ - printf("requesting images right after start\n"); - ret = startReadOut(); - } - - //wait for acquisition start - if(ret == OK){ - if(!Feb_Control_WaitForStartedFlag(5000, prev_flag)){ - cprintf(RED,"Error: Acquisition did not start or trouble reading register\n"); - return FAIL; - } - cprintf(GREEN,"***Acquisition started\n"); - } - - /*while(getRunStatus() == IDLE){printf("waiting for being not idle anymore\n");}*/ - - return ret; -#endif -} - -#ifdef VIRTUAL -void* start_timer(void* arg) { - eiger_virtual_status = 1; - int wait_in_s = nimages_per_request * eiger_virtual_period; - cprintf(GREEN,"going to wait for %d s\n", wait_in_s); - while(!eiger_virtual_stop && (wait_in_s >= 0)) { - usleep(1000 * 1000); - wait_in_s--; - } - cprintf(GREEN,"Virtual Timer Done***\n"); - - eiger_virtual_status = 0; - return NULL; -} -#endif - - - -int stopStateMachine(){ - cprintf(BG_RED,"Going to stop acquisition\n"); -#ifdef VIRTUAL - eiger_virtual_stop = 0; - return OK; -#else - - if((Feb_Control_StopAcquisition() == STATUS_IDLE) & Beb_StopAcquisition()) - return OK; - cprintf(BG_RED,"failed to stop acquisition\n"); - return FAIL; -#endif -} - -int softwareTrigger() { -#ifdef VIRTUAL - return OK; -#else - if (!Feb_Control_SoftwareTrigger()) - return FAIL; - return OK; -#endif -} - - -int startReadOut(){ - - printf("Requesting images...\n"); -#ifdef VIRTUAL - return OK; -#else - //RequestImages(); - int ret_val = 0; - dst_requested[0] = 1; - while(dst_requested[on_dst]){ - //waits on data - int beb_num = BEB_NUM;//Feb_Control_GetModuleNumber(); - if ((ret_val = (!Beb_RequestNImages(beb_num,send_to_ten_gig,on_dst,nimages_per_request,0)))) - break; -// for(i=0;imodule>=0) { -#ifdef VERBOSE - printf("Copying module number %d to module number %d\n",srcMod->module,destMod->module); -#endif - destMod->module=srcMod->module; - } - if (srcMod->serialnumber>=0){ - - destMod->serialnumber=srcMod->serialnumber; - } - //no trimbit feature - if (destMod->nchip && ((srcMod->nchip)>(destMod->nchip))) { - printf("Number of chip of source is larger than number of chips of destination\n"); - return FAIL; - } - //no trimbit feature - if (destMod->nchan && ((srcMod->nchan)>(destMod->nchan))) { - printf("Number of channels of source is larger than number of channels of destination\n"); - return FAIL; - } - if ((srcMod->ndac)>(destMod->ndac)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - if ((srcMod->nadc)>(destMod->nadc)) { - printf("Number of dacs of source is larger than number of dacs of destination\n"); - return FAIL; - } - -#ifdef VERBOSE - printf("DACs: src %d, dest %d\n",srcMod->ndac,destMod->ndac); - printf("ADCs: src %d, dest %d\n",srcMod->nadc,destMod->nadc); - printf("Chips: src %d, dest %d\n",srcMod->nchip,destMod->nchip); - printf("Chans: src %d, dest %d\n",srcMod->nchan,destMod->nchan); - -#endif - destMod->ndac=srcMod->ndac; - destMod->nadc=srcMod->nadc; - destMod->nchip=srcMod->nchip; - destMod->nchan=srcMod->nchan; - if (srcMod->reg>=0) - destMod->reg=srcMod->reg; -#ifdef VERBOSE - printf("Copying register %x (%x)\n",destMod->reg,srcMod->reg ); -#endif - if (srcMod->gain>=0) - destMod->gain=srcMod->gain; - if (srcMod->offset>=0) - destMod->offset=srcMod->offset; - - if((destMod->nchip!=0) || (destMod->nchan!=0)) { - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); - } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } - } -#ifdef VERBOSE - else printf("Not Copying trimbits\n"); -#endif - for (idac=0; idac<(srcMod->ndac); idac++) { - if (*((srcMod->dacs)+idac)>=0) { - *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); - } - } - for (iadc=0; iadc<(srcMod->nadc); iadc++) { - if (*((srcMod->adcs)+iadc)>=0) - *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); - } - return ret; -} - - -int calculateDataBytes(){ - if(send_to_ten_gig) - return setDynamicRange(-1) * ONE_GIGA_CONSTANT * TEN_GIGA_BUFFER_SIZE; - else - return setDynamicRange(-1) * TEN_GIGA_CONSTANT * ONE_GIGA_BUFFER_SIZE; -} - - -int getTotalNumberOfChannels(){return ((int)getNumberOfChannelsPerModule() * (int)getTotalNumberOfModules());} -int getTotalNumberOfChips(){return ((int)getNumberOfChipsPerModule() * (int)getTotalNumberOfModules());} -int getTotalNumberOfModules(){return NMOD;} -int getNumberOfChannelsPerModule(){return ((int)getNumberOfChannelsPerChip() * (int)getTotalNumberOfChips());} -int getNumberOfChipsPerModule(){return NCHIP;} -int getNumberOfDACsPerModule(){return NDAC;} -int getNumberOfADCsPerModule(){return NADC;} -int getNumberOfChannelsPerChip(){return NCHAN;} -int getNumberOfGainsPerModule(){return NGAIN;} -int getNumberOfOffsetsPerModule(){return NOFFSET;} - - - - - - -/* sync */ - -enum masterFlags setMaster(enum masterFlags arg){ - return NO_MASTER; -} - - - -enum synchronizationMode setSynchronization(enum synchronizationMode arg){ - return NO_SYNCHRONIZATION; -} - - - - - - - -//#endif diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.h deleted file mode 120000 index 345b8c029..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorFunctionList.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer.c deleted file mode 120000 index a7eb59acb..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer.c +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer.c \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h deleted file mode 100644 index 5eae871d9..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * slsDetectorServer_defs.h - * - * Created on: Jan 24, 2013 - * Author: l_maliakal_d - */ - -#ifndef SLSDETECTORSERVER_DEFS_H_ -#define SLSDETECTORSERVER_DEFS_H_ - -#include "sls_detector_defs.h" -#include - -#define GOODBYE (-200) -#define REQUIRED_FIRMWARE_VERSION (22) -#define IDFILECOMMAND "more /home/root/executables/detid.txt" - -#define STATUS_IDLE 0 -#define STATUS_RUNNING 1 -#define STATUS_ERROR 2 - -/* Enums */ -enum CLK_SPEED_INDEX {FULL_SPEED, HALF_SPEED, QUARTER_SPEED}; -enum DACINDEX {SVP,VTR,VRF,VRS,SVN,VTGSTV,VCMP_LL,VCMP_LR,CAL,VCMP_RL,RXB_RB,RXB_LB,VCMP_RR,VCP,VCN,VIS,VTHRESHOLD}; -#define DEFAULT_DAC_VALS { \ - 0, /* SvP */ \ - 2480, /* Vtr */ \ - 3300, /* Vrf */ \ - 1400, /* Vrs */ \ - 4000, /* SvN */ \ - 2556, /* Vtgstv */ \ - 1000, /* Vcmp_ll */ \ - 1000, /* Vcmp_lr */ \ - 4000, /* cal */ \ - 1000, /* Vcmp_rl */ \ - 1100, /* rxb_rb */ \ - 1100, /* rxb_lb */ \ - 1000, /* Vcmp_rr */ \ - 1000, /* Vcp */ \ - 2000, /* Vcn */ \ - 1550 /* Vis */ \ - }; -enum ADCINDEX {TEMP_FPGAEXT, TEMP_10GE, TEMP_DCDC, TEMP_SODL, TEMP_SODR, TEMP_FPGA, TEMP_FPGAFEBL, TEMP_FPGAFEBR}; -enum NETWORKINDEX {TXN_LEFT, TXN_RIGHT, TXN_FRAME,FLOWCTRL_10G}; - - -/* Hardware Definitions */ -#define NMAXMOD (1) -#define NMOD (1) -#define NCHAN (256 * 256) -#define NCHIP (4) -#define NADC (0) -#define NDAC (16) -#define NGAIN (0) -#define NOFFSET (0) - - -#define TEN_GIGA_BUFFER_SIZE (4112) -#define ONE_GIGA_BUFFER_SIZE (1040) -#define TEN_GIGA_CONSTANT (4) -#define ONE_GIGA_CONSTANT (16) -#define NORMAL_HIGHVOLTAGE_INPUTPORT "/sys/class/hwmon/hwmon5/device/in0_input" -#define NORMAL_HIGHVOLTAGE_OUTPUTPORT "/sys/class/hwmon/hwmon5/device/out0_output" -#define SPECIAL9M_HIGHVOLTAGE_PORT "/dev/ttyS1" -#define SPECIAL9M_HIGHVOLTAGE_BUFFERSIZE (16) - -/** Default Parameters */ -#define DEFAULT_MOD_INDEX (0) -#define DEFAULT_NUM_FRAMES (1) -#define DEFAULT_NUM_CYCLES (1) -#define DEFAULT_EXPTIME (1E9) //ns -#define DEFAULT_PERIOD (1E9) //ns -#define DEFAULT_DELAY (0) -#define DEFAULT_HIGH_VOLTAGE (0) -#define DEFAULT_SETTINGS (DYNAMICGAIN) -#define DEFAULT_SUBFRAME_EXPOSURE (2621440) // 2.6ms -#define DEFAULT_SUBFRAME_DEADTIME (0) -#define DEFAULT_DYNAMIC_RANGE (16) - -#define DEFAULT_READOUT_MODE (NONPARALLEL) -#define DEFAULT_READOUT_STOREINRAM_MODE (CONTINOUS_RO) -#define DEFAULT_READOUT_OVERFLOW32_MODE (NOOVERFLOW) -#define DEFAULT_CLK_SPEED (HALF_SPEED) -#define DEFAULT_IO_DELAY (650) -#define DEFAULT_TIMING_MODE (AUTO_TIMING) -#define DEFAULT_PHOTON_ENERGY (-1) -#define DEFAULT_RATE_CORRECTION (0) -#define DEFAULT_EXT_GATING_ENABLE (0) -#define DEFAULT_EXT_GATING_POLARITY (1) //positive -#define DEFAULT_TEST_MODE (0) -#define DEFAULT_HIGH_VOLTAGE (0) - - -#define MAX_SUBFRAME_EXPOSURE_VAL_IN_10NS (0x1FFFFFFF) /** 29 bit register for max subframe exposure value */ - -#define SLAVE_HIGH_VOLTAGE_READ_VAL (-999) -#define HIGH_VOLTAGE_TOLERANCE (5) - - -#endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.c deleted file mode 120000 index a7532ccd4..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.h deleted file mode 120000 index 7569daf47..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/slsDetectorServer_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/sls_detector_defs.h b/slsDetectorSoftware/eigerDetectorServer/sls_detector_defs.h deleted file mode 120000 index c5062e03f..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/sls_detector_defs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/sls_detector_funcs.h b/slsDetectorSoftware/eigerDetectorServer/sls_detector_funcs.h deleted file mode 120000 index 844b67129..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/sls_detector_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/sls_detector_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/sls_receiver_defs.h b/slsDetectorSoftware/eigerDetectorServer/sls_receiver_defs.h deleted file mode 120000 index 1de31caf5..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/sls_receiver_defs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_defs.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/sls_receiver_funcs.h b/slsDetectorSoftware/eigerDetectorServer/sls_receiver_funcs.h deleted file mode 120000 index c2ea4ded9..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/sls_receiver_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/sls_receiver_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/updateAPIVersion.sh b/slsDetectorSoftware/eigerDetectorServer/updateAPIVersion.sh deleted file mode 100755 index 618a9b601..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/updateAPIVersion.sh +++ /dev/null @@ -1,7 +0,0 @@ -SRCFILE=gitInfoEiger.h -DSTFILE=versionAPI.h - -SRCPATTERN=GITDATE -DSTPATTERN=APIEIGER - -awk -v a="$SRCFILE" -v b="$DSTFILE" -v c="$SRCPATTERN" -v d="$DSTPATTERN" 'FNR==NR&&$2==c{x=$3} NR!=FNR{if($2==d){$3="0x"substr(x,5)}print > b}' $SRCFILE $DSTFILE \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/updateGitVersion.sh b/slsDetectorSoftware/eigerDetectorServer/updateGitVersion.sh deleted file mode 100755 index 509bffaf4..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/updateGitVersion.sh +++ /dev/null @@ -1,32 +0,0 @@ -SERVER=eigerDetectorServer -MAINDIR=slsDetectorsPackage -SPECDIR=slsDetectorSoftware/$SERVER -TMPFILE=gitInfoEigerTmp.h -INCLFILE=gitInfoEiger.h - -#evaluate the variables -EVALFILE=../../evalVersionVariables.sh -source $EVALFILE - - -#get modified date -#RDATE1='git log --pretty=format:"%ci" -1' -RDATE1="find ../slsDetectorServer . -type f -exec stat --format '%Y :%y %n' '{}' \; | sort -nr | cut -d: -f2- | egrep -v 'gitInfo|bin|.git|updateGitVersion|.o' | head -n 1" -RDATE=`eval $RDATE1` -NEWDATE=$(sed "s/-//g" <<< $RDATE | awk '{print $1;}') -NEWDATE=${NEWDATE/#/0x} - - -#get old date from INCLFILE -OLDDATE=$(more $INCLFILE | grep '#define GITDATE' | awk '{print $3}') - - -#update INCLFILE if changes -if [ "$OLDDATE" != "$NEWDATE" ]; then - echo Path: ${MAINDIR}/${SPECDIR} $'\n'URL: ${GITREPO} $'\n'Repository Root: ${GITREPO} $'\n'Repsitory UUID: ${REPUID} $'\n'Revision: ${FOLDERREV} $'\n'Branch: ${BRANCH} $'\n'Last Changed Author: ${AUTH1}_${AUTH2} $'\n'Last Changed Rev: ${REV} $'\n'Last Changed Date: ${RDATE} > gitInfo.txt - cd ../../ - ./genVersionHeader.sh $SPECDIR/gitInfo.txt $SPECDIR/$TMPFILE $SPECDIR/$INCLFILE - cd $WD -fi - - diff --git a/slsDetectorSoftware/eigerDetectorServer/versionAPI.h b/slsDetectorSoftware/eigerDetectorServer/versionAPI.h deleted file mode 120000 index d3bf8d6cf..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/versionAPI.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/versionAPI.h \ No newline at end of file diff --git a/slsDetectorSoftware/eigerDetectorServer/xfs_types.h b/slsDetectorSoftware/eigerDetectorServer/xfs_types.h deleted file mode 100644 index cd092bbd6..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/xfs_types.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef __XFS_TYPES_H__ -#define __XFS_TYPES_H__ - -//#include "types.h" -#include -/******************************************************************************/ -/* types */ -/******************************************************************************/ - -typedef unsigned int xfs_u32; -typedef unsigned short xfs_u16; -typedef unsigned char xfs_u8; - -typedef signed int xfs_i32; -typedef signed short xfs_i16; -typedef signed char xfs_i8; - - -// UDP Header -struct udp_header_type -{ - // ethternet frame (14 byte) - uint8_t dst_mac[6]; - uint8_t src_mac[6]; - uint8_t len_type[2]; - - // ip header (20 byte) - uint8_t ver_headerlen[1]; - uint8_t service_type[1]; - uint8_t total_length[2]; - uint8_t identification[2]; - uint8_t flags[1]; - uint8_t frag_offset[1]; - uint8_t time_to_live[1]; - uint8_t protocol[1]; - uint8_t ip_header_checksum[2]; - uint8_t src_ip[4]; - uint8_t dst_ip[4]; - - // udp header (8 byte) - uint8_t src_port[2]; - uint8_t dst_port[2]; - uint8_t udp_message_len[2]; - uint8_t udp_checksum[2]; - -}; - - - -#endif // __XFS_TYPES_H__ - - diff --git a/slsDetectorSoftware/eigerDetectorServer/xparameters.h b/slsDetectorSoftware/eigerDetectorServer/xparameters.h deleted file mode 100644 index 446c89859..000000000 --- a/slsDetectorSoftware/eigerDetectorServer/xparameters.h +++ /dev/null @@ -1,538 +0,0 @@ -/* ONLY THOSE ARE USED IN THIS SOFTWARE. If one of those is modified in xilinx compilation, this file should be replaced with updated values -XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT_BASEADDR -XPAR_PLB_LL_FIFO_AURORA_RX4_TX1_RIGHT_BASEADDR -XPAR_PLB_LL_FIFO_AURORA_RX4_TX1_LEFT_BASEADDR -XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR -XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT_BASEADDR -XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR -*/ -/******************************************************************* -* -* CAUTION: This file is automatically generated by libgen. -* Version: Xilinx EDK 12.4 EDK_MS4.81d -* DO NOT EDIT. -* -* Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. - -* -* Description: Driver parameters -* -*******************************************************************/ - -#define STDIN_BASEADDRESS 0xC0000000 -#define STDOUT_BASEADDRESS 0xC0000000 - -/******************************************************************/ - - -/* Definitions for peripheral BB_IO_SHIFT_REG_PPC440 */ -#define XPAR_BB_IO_SHIFT_REG_PPC440_BASEADDR 0xD3000000 -#define XPAR_BB_IO_SHIFT_REG_PPC440_HIGHADDR 0xD300FFFF - - -/* Definitions for peripheral EIGER_BEB_SYNCH_IO_PPC440 */ -#define XPAR_EIGER_BEB_SYNCH_IO_PPC440_BASEADDR 0xD3100000 -#define XPAR_EIGER_BEB_SYNCH_IO_PPC440_HIGHADDR 0xD310FFFF - - -/* Definitions for peripheral PLB_BRAM_10G */ -#define XPAR_PLB_BRAM_10G_MEM0_BASEADDR 0xD4100000 -#define XPAR_PLB_BRAM_10G_MEM0_HIGHADDR 0xD410FFFF - - -/* Definitions for peripheral PLB_BRAM_TEMAC */ -#define XPAR_PLB_BRAM_TEMAC_MEM0_BASEADDR 0xD4000000 -#define XPAR_PLB_BRAM_TEMAC_MEM0_HIGHADDR 0xD400FFFF - - -/* Definitions for peripheral PLB_GPIO_SYS */ -#define XPAR_PLB_GPIO_SYS_BASEADDR 0xD1000000 -#define XPAR_PLB_GPIO_SYS_HIGHADDR 0xD100FFFF - -/** Command Generator */ -#define XPAR_CMD_GENERATOR 0xC5000000 - - -/** Version Numbers */ -#define XPAR_VERSION 0xc6000000 - -/* Definitions for peripheral PLB_GPIO_TEST */ -#define XPAR_PLB_GPIO_TEST_BASEADDR 0xD1010000 -#define XPAR_PLB_GPIO_TEST_HIGHADDR 0xD101FFFF - - - -/* Definitions for packet, frame and delay down counters */ -#define XPAR_COUNTER_BASEADDR 0xD1020000 -#define XPAR_COUNTER_HIGHADDR 0xD102FFFF - - -/* Definitions for peripheral PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT */ -#define XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR 0xC4100000 -#define XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_HIGHADDR 0xC410FFFF - -/* Definitions for a new memory */ -//#define XPAR_PLB_LL_NEW_MEMORY 0xD1000000//0xD1000084//0xC4200000 - - -/* Definitions for peripheral PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT */ -#define XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT_BASEADDR 0xC4110000 -#define XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT_HIGHADDR 0xC411FFFF - - -/* Definitions for peripheral PLB_LL_FIFO_AURORA_RX4_TX1_LEFT */ -#define XPAR_PLB_LL_FIFO_AURORA_RX4_TX1_LEFT_BASEADDR 0xC4120000 -#define XPAR_PLB_LL_FIFO_AURORA_RX4_TX1_LEFT_HIGHADDR 0xC412FFFF - - -/* Definitions for peripheral PLB_LL_FIFO_AURORA_RX4_TX1_RIGHT */ -#define XPAR_PLB_LL_FIFO_AURORA_RX4_TX1_RIGHT_BASEADDR 0xC4130000 -#define XPAR_PLB_LL_FIFO_AURORA_RX4_TX1_RIGHT_HIGHADDR 0xC413FFFF - - -/* Definitions for peripheral PLB_LL_FIFO_XAUI_10G */ -#define XPAR_PLB_LL_FIFO_XAUI_10G_BASEADDR 0xC4140000 -#define XPAR_PLB_LL_FIFO_XAUI_10G_HIGHADDR 0xC414FFFF - - -/* Definitions for peripheral PLB_V46_CPU_TO_PLB_V46_BRIDGED */ -#define XPAR_PLB_V46_CPU_TO_PLB_V46_BRIDGED_BRIDGE_BASEADDR 0xCFFF0000 -#define XPAR_PLB_V46_CPU_TO_PLB_V46_BRIDGED_BRIDGE_HIGHADDR 0xCFFFFFFF -#define XPAR_PLB_V46_CPU_TO_PLB_V46_BRIDGED_RNG0_BASEADDR 0xD0000000 -#define XPAR_PLB_V46_CPU_TO_PLB_V46_BRIDGED_RNG0_HIGHADDR 0xDFFFFFFF - - -/* Definitions for peripheral PPC_SRAM */ -#define XPAR_PPC_SRAM_BASEADDR 0x00000000 -#define XPAR_PPC_SRAM_HIGHADDR 0x01FFFFFF - - -/******************************************************************/ - - -/* Definitions for peripheral PFLASH */ -#define XPAR_PFLASH_NUM_BANKS_MEM 1 - - -/******************************************************************/ - -/* Definitions for peripheral PFLASH */ -#define XPAR_PFLASH_MEM0_BASEADDR 0xE0000000 -#define XPAR_PFLASH_MEM0_HIGHADDR 0xE3FFFFFF - -/******************************************************************/ - -/* Canonical definitions for peripheral PFLASH */ -#define XPAR_EMC_0_NUM_BANKS_MEM 1 -#define XPAR_EMC_0_MEM0_BASEADDR 0xE0000000 -#define XPAR_EMC_0_MEM0_HIGHADDR 0xE3FFFFFF - -/******************************************************************/ - -/* Definitions for driver PLB_SHT1X_IF */ -#define XPAR_PLB_SHT1X_IF_NUM_INSTANCES 2 - -/* Definitions for peripheral PLB_SHT1X_IF_CH1 */ -#define XPAR_PLB_SHT1X_IF_CH1_DEVICE_ID 0 -#define XPAR_PLB_SHT1X_IF_CH1_BASEADDR 0xD2200000 -#define XPAR_PLB_SHT1X_IF_CH1_HIGHADDR 0xD220FFFF - - -/* Definitions for peripheral PLB_SHT1X_IF_CH2 */ -#define XPAR_PLB_SHT1X_IF_CH2_DEVICE_ID 1 -#define XPAR_PLB_SHT1X_IF_CH2_BASEADDR 0xD2210000 -#define XPAR_PLB_SHT1X_IF_CH2_HIGHADDR 0xD221FFFF - - -/******************************************************************/ - -/* Definitions for driver UARTLITE */ -#define XPAR_XUARTLITE_NUM_INSTANCES 1 - -/* Definitions for peripheral RS232 */ -#define XPAR_RS232_BASEADDR 0xC0000000 -#define XPAR_RS232_HIGHADDR 0xC000FFFF -#define XPAR_RS232_DEVICE_ID 0 -#define XPAR_RS232_BAUDRATE 115200 -#define XPAR_RS232_USE_PARITY 0 -#define XPAR_RS232_ODD_PARITY 0 -#define XPAR_RS232_DATA_BITS 8 - - -/******************************************************************/ - - -/* Canonical definitions for peripheral RS232 */ -#define XPAR_UARTLITE_0_DEVICE_ID XPAR_RS232_DEVICE_ID -#define XPAR_UARTLITE_0_BASEADDR 0xC0000000 -#define XPAR_UARTLITE_0_HIGHADDR 0xC000FFFF -#define XPAR_UARTLITE_0_BAUDRATE 115200 -#define XPAR_UARTLITE_0_USE_PARITY 0 -#define XPAR_UARTLITE_0_ODD_PARITY 0 -#define XPAR_UARTLITE_0_DATA_BITS 8 -#define XPAR_UARTLITE_0_SIO_CHAN 1 - - -/******************************************************************/ - -/* Definitions for driver SPI */ -#define XPAR_XSPI_NUM_INSTANCES 2 - -/* Definitions for peripheral SPI_FLASH */ -#define XPAR_SPI_FLASH_DEVICE_ID 0 -#define XPAR_SPI_FLASH_BASEADDR 0xD2000000 -#define XPAR_SPI_FLASH_HIGHADDR 0xD200FFFF -#define XPAR_SPI_FLASH_FIFO_EXIST 1 -#define XPAR_SPI_FLASH_SPI_SLAVE_ONLY 0 -#define XPAR_SPI_FLASH_NUM_SS_BITS 1 -#define XPAR_SPI_FLASH_NUM_TRANSFER_BITS 8 - - -/* Definitions for peripheral XPS_SPI_FEB_CFG */ -#define XPAR_XPS_SPI_FEB_CFG_DEVICE_ID 1 -#define XPAR_XPS_SPI_FEB_CFG_BASEADDR 0xD2010000 -#define XPAR_XPS_SPI_FEB_CFG_HIGHADDR 0xD201FFFF -#define XPAR_XPS_SPI_FEB_CFG_FIFO_EXIST 1 -#define XPAR_XPS_SPI_FEB_CFG_SPI_SLAVE_ONLY 0 -#define XPAR_XPS_SPI_FEB_CFG_NUM_SS_BITS 2 -#define XPAR_XPS_SPI_FEB_CFG_NUM_TRANSFER_BITS 8 - - -/******************************************************************/ - - -/* Canonical definitions for peripheral SPI_FLASH */ -#define XPAR_SPI_0_DEVICE_ID XPAR_SPI_FLASH_DEVICE_ID -#define XPAR_SPI_0_BASEADDR 0xD2000000 -#define XPAR_SPI_0_HIGHADDR 0xD200FFFF -#define XPAR_SPI_0_FIFO_EXIST 1 -#define XPAR_SPI_0_SPI_SLAVE_ONLY 0 -#define XPAR_SPI_0_NUM_SS_BITS 1 -#define XPAR_SPI_0_NUM_TRANSFER_BITS 8 - - -/* Canonical definitions for peripheral XPS_SPI_FEB_CFG */ -#define XPAR_SPI_1_DEVICE_ID XPAR_XPS_SPI_FEB_CFG_DEVICE_ID -#define XPAR_SPI_1_BASEADDR 0xD2010000 -#define XPAR_SPI_1_HIGHADDR 0xD201FFFF -#define XPAR_SPI_1_FIFO_EXIST 1 -#define XPAR_SPI_1_SPI_SLAVE_ONLY 0 -#define XPAR_SPI_1_NUM_SS_BITS 2 -#define XPAR_SPI_1_NUM_TRANSFER_BITS 8 - - -/******************************************************************/ - -/* Definitions for driver LLTEMAC */ -#define XPAR_XLLTEMAC_NUM_INSTANCES 1 - -/* Definitions for peripheral TEMAC_INST Channel 0 */ -#define XPAR_TEMAC_INST_CHAN_0_DEVICE_ID 0 -#define XPAR_TEMAC_INST_CHAN_0_BASEADDR 0xC3000000 -#define XPAR_TEMAC_INST_CHAN_0_HIGHADDR 0xC30FFFFF -#define XPAR_TEMAC_INST_CHAN_0_TXCSUM 0 -#define XPAR_TEMAC_INST_CHAN_0_RXCSUM 0 -#define XPAR_TEMAC_INST_CHAN_0_PHY_TYPE 4 -#define XPAR_TEMAC_INST_CHAN_0_TXVLAN_TRAN 0 -#define XPAR_TEMAC_INST_CHAN_0_RXVLAN_TRAN 0 -#define XPAR_TEMAC_INST_CHAN_0_TXVLAN_TAG 0 -#define XPAR_TEMAC_INST_CHAN_0_RXVLAN_TAG 0 -#define XPAR_TEMAC_INST_CHAN_0_TXVLAN_STRP 0 -#define XPAR_TEMAC_INST_CHAN_0_RXVLAN_STRP 0 -#define XPAR_TEMAC_INST_CHAN_0_MCAST_EXTEND 0 - -/* Canonical definitions for peripheral TEMAC_INST Channel 0 */ -#define XPAR_LLTEMAC_0_DEVICE_ID 0 -#define XPAR_LLTEMAC_0_BASEADDR 0xC3000000 -#define XPAR_LLTEMAC_0_HIGHADDR 0xC30FFFFF -#define XPAR_LLTEMAC_0_TXCSUM 0 -#define XPAR_LLTEMAC_0_RXCSUM 0 -#define XPAR_LLTEMAC_0_PHY_TYPE 4 -#define XPAR_LLTEMAC_0_TXVLAN_TRAN 0 -#define XPAR_LLTEMAC_0_RXVLAN_TRAN 0 -#define XPAR_LLTEMAC_0_TXVLAN_TAG 0 -#define XPAR_LLTEMAC_0_RXVLAN_TAG 0 -#define XPAR_LLTEMAC_0_TXVLAN_STRP 0 -#define XPAR_LLTEMAC_0_RXVLAN_STRP 0 -#define XPAR_LLTEMAC_0_MCAST_EXTEND 0 -#define XPAR_LLTEMAC_0_INTR 1 - - -/* LocalLink TYPE Enumerations */ -#define XPAR_LL_FIFO 1 -#define XPAR_LL_DMA 2 - - -/* Canonical LocalLink parameters for TEMAC_INST */ - - -/******************************************************************/ - - -/* Definitions for peripheral XPS_BRAM_IF_CNTLR_PPC440 */ -#define XPAR_XPS_BRAM_IF_CNTLR_PPC440_BASEADDR 0xFFFC0000 -#define XPAR_XPS_BRAM_IF_CNTLR_PPC440_HIGHADDR 0xFFFFFFFF - - -/******************************************************************/ - -#define XPAR_INTC_MAX_NUM_INTR_INPUTS 5 -#define XPAR_XINTC_HAS_IPR 1 -#define XPAR_XINTC_USE_DCR 0 -/* Definitions for driver INTC */ -#define XPAR_XINTC_NUM_INSTANCES 1 - -/* Definitions for peripheral XPS_INTC_PPC440 */ -#define XPAR_XPS_INTC_PPC440_DEVICE_ID 0 -#define XPAR_XPS_INTC_PPC440_BASEADDR 0xC1000000 -#define XPAR_XPS_INTC_PPC440_HIGHADDR 0xC100FFFF -#define XPAR_XPS_INTC_PPC440_KIND_OF_INTR 0xFFFFFFF4 - - -/******************************************************************/ - -#define XPAR_INTC_SINGLE_BASEADDR 0xC1000000 -#define XPAR_INTC_SINGLE_HIGHADDR 0xC100FFFF -#define XPAR_INTC_SINGLE_DEVICE_ID XPAR_XPS_INTC_PPC440_DEVICE_ID -#define XPAR_XPS_LL_FIFO_TEMAC_IP2INTC_IRPT_MASK 0X000001 -#define XPAR_XPS_INTC_PPC440_XPS_LL_FIFO_TEMAC_IP2INTC_IRPT_INTR 0 -#define XPAR_TEMAC_INST_TEMACINTC0_IRPT_MASK 0X000002 -#define XPAR_XPS_INTC_PPC440_TEMAC_INST_TEMACINTC0_IRPT_INTR 1 -#define XPAR_XPS_TIMER_PPC440_INTERRUPT_MASK 0X000004 -#define XPAR_XPS_INTC_PPC440_XPS_TIMER_PPC440_INTERRUPT_INTR 2 -#define XPAR_SPI_FLASH_IP2INTC_IRPT_MASK 0X000008 -#define XPAR_XPS_INTC_PPC440_SPI_FLASH_IP2INTC_IRPT_INTR 3 -#define XPAR_RS232_INTERRUPT_MASK 0X000010 -#define XPAR_XPS_INTC_PPC440_RS232_INTERRUPT_INTR 4 - -/******************************************************************/ - -/* Canonical definitions for peripheral XPS_INTC_PPC440 */ -#define XPAR_INTC_0_DEVICE_ID XPAR_XPS_INTC_PPC440_DEVICE_ID -#define XPAR_INTC_0_BASEADDR 0xC1000000 -#define XPAR_INTC_0_HIGHADDR 0xC100FFFF -#define XPAR_INTC_0_KIND_OF_INTR 0xFFFFFFF4 - -#define XPAR_INTC_0_LLFIFO_0_VEC_ID XPAR_XPS_INTC_PPC440_XPS_LL_FIFO_TEMAC_IP2INTC_IRPT_INTR -#define XPAR_INTC_0_LLTEMAC_0_VEC_ID XPAR_XPS_INTC_PPC440_TEMAC_INST_TEMACINTC0_IRPT_INTR -#define XPAR_INTC_0_TMRCTR_0_VEC_ID XPAR_XPS_INTC_PPC440_XPS_TIMER_PPC440_INTERRUPT_INTR -#define XPAR_INTC_0_SPI_0_VEC_ID XPAR_XPS_INTC_PPC440_SPI_FLASH_IP2INTC_IRPT_INTR -#define XPAR_INTC_0_UARTLITE_0_VEC_ID XPAR_XPS_INTC_PPC440_RS232_INTERRUPT_INTR - -/******************************************************************/ - -/* Definitions for driver LLFIFO */ -#define XPAR_XLLFIFO_NUM_INSTANCES 1 - -/* Definitions for peripheral XPS_LL_FIFO_TEMAC */ -#define XPAR_XPS_LL_FIFO_TEMAC_DEVICE_ID 0 -#define XPAR_XPS_LL_FIFO_TEMAC_BASEADDR 0xC4000000 -#define XPAR_XPS_LL_FIFO_TEMAC_HIGHADDR 0xC400FFFF - - -/******************************************************************/ - -/* Canonical definitions for peripheral XPS_LL_FIFO_TEMAC */ -#define XPAR_LLFIFO_0_DEVICE_ID XPAR_XPS_LL_FIFO_TEMAC_DEVICE_ID -#define XPAR_LLFIFO_0_BASEADDR 0xC4000000 -#define XPAR_LLFIFO_0_HIGHADDR 0xC400FFFF - - -/******************************************************************/ - -/* Definitions for driver SYSMON */ -#define XPAR_XSYSMON_NUM_INSTANCES 1 - -/* Definitions for peripheral XPS_SYSMON_ADC_PPC440 */ -#define XPAR_XPS_SYSMON_ADC_PPC440_DEVICE_ID 0 -#define XPAR_XPS_SYSMON_ADC_PPC440_BASEADDR 0xD0010000 -#define XPAR_XPS_SYSMON_ADC_PPC440_HIGHADDR 0xD001FFFF -#define XPAR_XPS_SYSMON_ADC_PPC440_INCLUDE_INTR 1 - - -/******************************************************************/ - - -/* Canonical definitions for peripheral XPS_SYSMON_ADC_PPC440 */ -#define XPAR_SYSMON_0_DEVICE_ID XPAR_XPS_SYSMON_ADC_PPC440_DEVICE_ID -#define XPAR_SYSMON_0_BASEADDR 0xD0010000 -#define XPAR_SYSMON_0_HIGHADDR 0xD001FFFF -#define XPAR_SYSMON_0_INCLUDE_INTR 1 - - -/******************************************************************/ - -/* Definitions for driver TMRCTR */ -#define XPAR_XTMRCTR_NUM_INSTANCES 1 - -/* Definitions for peripheral XPS_TIMER_PPC440 */ -#define XPAR_XPS_TIMER_PPC440_DEVICE_ID 0 -#define XPAR_XPS_TIMER_PPC440_BASEADDR 0xC2000000 -#define XPAR_XPS_TIMER_PPC440_HIGHADDR 0xC200FFFF - - -/******************************************************************/ - - -/* Canonical definitions for peripheral XPS_TIMER_PPC440 */ -#define XPAR_TMRCTR_0_DEVICE_ID XPAR_XPS_TIMER_PPC440_DEVICE_ID -#define XPAR_TMRCTR_0_BASEADDR 0xC2000000 -#define XPAR_TMRCTR_0_HIGHADDR 0xC200FFFF - - -/******************************************************************/ - -/* Definitions for bus frequencies */ -#define XPAR_CPU_PPC440_MPLB_FREQ_HZ 100000000 -/******************************************************************/ - -/* Canonical definitions for bus frequencies */ -#define XPAR_PROC_BUS_0_FREQ_HZ 100000000 -/******************************************************************/ - -#define XPAR_CPU_PPC440_CORE_CLOCK_FREQ_HZ 400000000 -#define XPAR_PPC440_VIRTEX5_CORE_CLOCK_FREQ_HZ 400000000 -#define XPAR_CPU_PPC440_IDCR_BASEADDR 0x00000000 -/******************************************************************/ -#define XPAR_CPU_ID 0 -#define XPAR_PPC440_VIRTEX5_ID 0 -#define XPAR_PPC440_VIRTEX5_PIR 0b1111 -#define XPAR_PPC440_VIRTEX5_ENDIAN_RESET 0 -#define XPAR_PPC440_VIRTEX5_USER_RESET 0b0000 -#define XPAR_PPC440_VIRTEX5_INTERCONNECT_IMASK 0xffffffff -#define XPAR_PPC440_VIRTEX5_ICU_RD_FETCH_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_ICU_RD_SPEC_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_ICU_RD_TOUCH_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_RD_LD_CACHE_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_RD_NONCACHE_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_RD_TOUCH_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_RD_URGENT_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_WR_FLUSH_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_WR_STORE_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DCU_WR_URGENT_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DMA0_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DMA1_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DMA2_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_DMA3_PLB_PRIO 0b00 -#define XPAR_PPC440_VIRTEX5_IDCR_BASEADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_IDCR_HIGHADDR 0x000000FF -#define XPAR_PPC440_VIRTEX5_APU_CONTROL 0b00010000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_0 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_1 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_2 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_3 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_4 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_5 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_6 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_7 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_8 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_9 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_10 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_11 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_12 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_13 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_14 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_APU_UDI_15 0b000000000000000000000000 -#define XPAR_PPC440_VIRTEX5_PPC440MC_ADDR_BASE 0x00000000 -#define XPAR_PPC440_VIRTEX5_PPC440MC_ADDR_HIGH 0X01FFFFFF -#define XPAR_PPC440_VIRTEX5_PPC440MC_ROW_CONFLICT_MASK 0x00000000 -#define XPAR_PPC440_VIRTEX5_PPC440MC_BANK_CONFLICT_MASK 0x00000000 -#define XPAR_PPC440_VIRTEX5_PPC440MC_CONTROL 0X8140008F -#define XPAR_PPC440_VIRTEX5_PPC440MC_PRIO_ICU 4 -#define XPAR_PPC440_VIRTEX5_PPC440MC_PRIO_DCUW 3 -#define XPAR_PPC440_VIRTEX5_PPC440MC_PRIO_DCUR 2 -#define XPAR_PPC440_VIRTEX5_PPC440MC_PRIO_SPLB1 0 -#define XPAR_PPC440_VIRTEX5_PPC440MC_PRIO_SPLB0 1 -#define XPAR_PPC440_VIRTEX5_PPC440MC_ARB_MODE 0 -#define XPAR_PPC440_VIRTEX5_PPC440MC_MAX_BURST 8 -#define XPAR_PPC440_VIRTEX5_MPLB_AWIDTH 32 -#define XPAR_PPC440_VIRTEX5_MPLB_DWIDTH 128 -#define XPAR_PPC440_VIRTEX5_MPLB_NATIVE_DWIDTH 128 -#define XPAR_PPC440_VIRTEX5_MPLB_COUNTER 0x00000500 -#define XPAR_PPC440_VIRTEX5_MPLB_PRIO_ICU 4 -#define XPAR_PPC440_VIRTEX5_MPLB_PRIO_DCUW 3 -#define XPAR_PPC440_VIRTEX5_MPLB_PRIO_DCUR 2 -#define XPAR_PPC440_VIRTEX5_MPLB_PRIO_SPLB1 0 -#define XPAR_PPC440_VIRTEX5_MPLB_PRIO_SPLB0 1 -#define XPAR_PPC440_VIRTEX5_MPLB_ARB_MODE 0 -#define XPAR_PPC440_VIRTEX5_MPLB_SYNC_TATTRIBUTE 0 -#define XPAR_PPC440_VIRTEX5_MPLB_MAX_BURST 8 -#define XPAR_PPC440_VIRTEX5_MPLB_ALLOW_LOCK_XFER 1 -#define XPAR_PPC440_VIRTEX5_MPLB_READ_PIPE_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_MPLB_WRITE_PIPE_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_MPLB_WRITE_POST_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_MPLB_P2P 0 -#define XPAR_PPC440_VIRTEX5_MPLB_WDOG_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_SPLB0_AWIDTH 32 -#define XPAR_PPC440_VIRTEX5_SPLB0_DWIDTH 128 -#define XPAR_PPC440_VIRTEX5_SPLB0_NATIVE_DWIDTH 128 -#define XPAR_PPC440_VIRTEX5_SPLB0_SUPPORT_BURSTS 1 -#define XPAR_PPC440_VIRTEX5_SPLB0_USE_MPLB_ADDR 0 -#define XPAR_PPC440_VIRTEX5_SPLB0_NUM_MPLB_ADDR_RNG 0 -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG_MC_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG_MC_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG0_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG0_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG1_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG1_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG2_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG2_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG3_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB0_RNG3_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB0_NUM_MASTERS 1 -#define XPAR_PPC440_VIRTEX5_SPLB0_MID_WIDTH 1 -#define XPAR_PPC440_VIRTEX5_SPLB0_ALLOW_LOCK_XFER 1 -#define XPAR_PPC440_VIRTEX5_SPLB0_READ_PIPE_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_SPLB0_PROPAGATE_MIRQ 0 -#define XPAR_PPC440_VIRTEX5_SPLB0_P2P -1 -#define XPAR_PPC440_VIRTEX5_SPLB1_AWIDTH 32 -#define XPAR_PPC440_VIRTEX5_SPLB1_DWIDTH 128 -#define XPAR_PPC440_VIRTEX5_SPLB1_NATIVE_DWIDTH 128 -#define XPAR_PPC440_VIRTEX5_SPLB1_SUPPORT_BURSTS 1 -#define XPAR_PPC440_VIRTEX5_SPLB1_USE_MPLB_ADDR 0 -#define XPAR_PPC440_VIRTEX5_SPLB1_NUM_MPLB_ADDR_RNG 0 -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG_MC_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG_MC_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG0_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG0_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG1_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG1_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG2_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG2_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG3_MPLB_BASEADDR 0xFFFFFFFF -#define XPAR_PPC440_VIRTEX5_SPLB1_RNG3_MPLB_HIGHADDR 0x00000000 -#define XPAR_PPC440_VIRTEX5_SPLB1_NUM_MASTERS 1 -#define XPAR_PPC440_VIRTEX5_SPLB1_MID_WIDTH 1 -#define XPAR_PPC440_VIRTEX5_SPLB1_ALLOW_LOCK_XFER 1 -#define XPAR_PPC440_VIRTEX5_SPLB1_READ_PIPE_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_SPLB1_PROPAGATE_MIRQ 0 -#define XPAR_PPC440_VIRTEX5_SPLB1_P2P -1 -#define XPAR_PPC440_VIRTEX5_NUM_DMA 0 -#define XPAR_PPC440_VIRTEX5_DMA0_TXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA0_RXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA0_CONTROL 0b00000000 -#define XPAR_PPC440_VIRTEX5_DMA0_TXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA0_RXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA1_TXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA1_RXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA1_CONTROL 0b00000000 -#define XPAR_PPC440_VIRTEX5_DMA1_TXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA1_RXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA2_TXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA2_RXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA2_CONTROL 0b00000000 -#define XPAR_PPC440_VIRTEX5_DMA2_TXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA2_RXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA3_TXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA3_RXCHANNELCTRL 0x01010000 -#define XPAR_PPC440_VIRTEX5_DMA3_CONTROL 0b00000000 -#define XPAR_PPC440_VIRTEX5_DMA3_TXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DMA3_RXIRQTIMER 0b1111111111 -#define XPAR_PPC440_VIRTEX5_DCR_AUTOLOCK_ENABLE 1 -#define XPAR_PPC440_VIRTEX5_PPCDM_ASYNCMODE 0 -#define XPAR_PPC440_VIRTEX5_PPCDS_ASYNCMODE 0 -#define XPAR_PPC440_VIRTEX5_GENERATE_PLB_TIMESPECS 1 -#define XPAR_PPC440_VIRTEX5_HW_VER "1.01.a" - -/******************************************************************/ - diff --git a/slsDetectorSoftware/f90Interface/externPostProcessing.cpp b/slsDetectorSoftware/f90Interface/externPostProcessing.cpp deleted file mode 100644 index 92b83c576..000000000 --- a/slsDetectorSoftware/f90Interface/externPostProcessing.cpp +++ /dev/null @@ -1,47 +0,0 @@ -#include "externPostProcessing.h" - - - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - -using namespace std; - - - - -int externPostProcessing::InitDataset(int *nModules,int *chPerMod,int moduleMask[],int badChans[], double ffcoeff[], double fferr[], double* tDead, double angRadius[], double angOffset[], double angCentre[], double* totalOffset, double* binSize, double *sampleX, double *sampleY) - { - - init_dataset(nModules,chPerMod,moduleMask,badChans,ffcoeff,fferr,tDead,angRadius,angOffset,angCentre,totalOffset,binSize,sampleX,sampleY); - return 0; - - } - -int externPostProcessing::finalizeDataset(double ang[], double val[], double err[], int *np) -{ - finalize_dataset(ang, val, err, np); - return 0; -}; - - -int addFrame(double data[], double *pos, double *IO, double *expTime, const char *filename, int *var) -{ - add_frame(data, pos, i0, expTime, filename, var); - return 0; -}; - -int calculateFlatField(int* nModules, int *chPerMod, int modMask[], int badChanMask[], double data[], double ffCoeff[], double ffErr[]) -{ - calculate_flat_field(nModules, chPerMod, modMask, badChanMask, data, ffCoeff, ffErr); - return 0; -}; diff --git a/slsDetectorSoftware/f90Interface/externPostProcessing.h b/slsDetectorSoftware/f90Interface/externPostProcessing.h deleted file mode 100644 index 9225d66f9..000000000 --- a/slsDetectorSoftware/f90Interface/externPostProcessing.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef EXTERNPOSTPROCESSING_H -#define EXTERNPOSTPROCESSING_H - - -#include "detectorData.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - - - - - - -extern "C" { - - void init_dataset(int *nMod, int *chPerMod, int* modMask, int *badChanMask, double *ffCoeff, double *ffErr, double *tDead, int *dir, double *angRadius, double *angOffset, double *angCenter, double *totalOff, double *binSize, double * sampleX, double* sampleY); -void finalize_dataset(double *outang, double *outval, double *outerr, int *np); - void add_frame(double *data, double *pos, double *i0, double *exptime, char *fn, double *var); -void calculate_flat_field(int *nMod, int *chPerMod, int *modMask,int *badChanMask, double *data, double *ffc, double *fferr); -} - - - -class externPostProcessing - -{ - - public: - externPostProcessing(){}; - virtual ~externPostProcessing(){}; - - - static int InitDataset(int *nModules,int *chPerMod,int moduleMask[],int badChans[], double ffcoeff[], double fferr[], double* tDead, int *dir, double angRadius[], double angOffset[], double angCentre[], double* totalOffset, double* binSize, double *sampleX, double *sampleY); - - - - static int finalizeDataset(double ang[], double val[], double err[], int *np); - - static int addFrame(double data[], double *pos, double *IO, double *expTime, const char *filename, int *var=0); - - static int calculateFlatField(int* nModules, int *chPerMod, int moduleMask[], int badChannelMask[], double ffData[], double ffCoeff[], double ffErr[]); - - - - - }; - - -#endif diff --git a/slsDetectorSoftware/f90Interface/sls_detector_analysis_f.f90 b/slsDetectorSoftware/f90Interface/sls_detector_analysis_f.f90 deleted file mode 100644 index 201371ef4..000000000 --- a/slsDetectorSoftware/f90Interface/sls_detector_analysis_f.f90 +++ /dev/null @@ -1,174 +0,0 @@ -module ax -USE,INTRINSIC :: ISO_C_BINDING -IMPLICIT NONE -integer(C_LONG) :: numberofmodules,totalnumberofchannels -real(C_DOUBLE) :: numberofbins -real(C_DOUBLE) :: bincenter(360000), binvalue(360000), binerror(360000) - -contains - - -subroutine initdataset(nmodules, chpmod, modulemask,badchanmask,ffcoeff,fferr,tdead,angradius,angoffset,angcenter, totaloffset, binsize, samplex, sampley) bind(c, name='init_dataset') -IMPLICIT NONE -integer(C_LONG), intent(IN) :: nmodules, chpmod -integer(C_LONG), intent(IN) :: modulemask(nmodules), badchanmask(nmodules*chpmod) -real(C_DOUBLE), intent(IN) :: ffcoeff(nmodules*chpmod), fferr(nmodules*chpmod) -real(C_DOUBLE), intent(IN) :: tdead, totaloffset,binsize, samplex, sampley -real(C_DOUBLE), intent(IN) :: angradius(nmodules), angoffset(nmodules), angcenter(nmodules) -integer(C_LONG) :: i - -print*,'init dataset' - -numberofmodules=nmodules - -print*,'Number of modules:' -print*,numberofmodules -print*,'Channels per module:' -print*,chpmod - -totalnumberofchannels=nmodules*chpmod - -print*,'Total number of channels:' -print*,totalnumberofchannels - - -print*,'Modulemask:' -do i=1,nmodules - print*,i,modulemask(i) -enddo - -print*,'Badchannelmask:' -do i=1,nmodules*chpmod - print*,i,badchanmask(i) -enddo - -print*,'Flat field coefficients:' -do i=1,nmodules*chpmod - print*,i,ffcoeff(i),'+-',fferr(i) -enddo - -print*,'Tdead:' -print*,tdead - - -print*,'Angular conversion coefficients:' -do i=1,nmodules - print*,i,angradius(i),angoffset(i),angcenter(i) -enddo - - -print*,'Total offset:' -print*,totaloffset - -print*,'Bin size:' -print*,binsize - -numberofbins=360./binsize - - -print*,'Sample displacement:' -print*,samplex, sampley - -end subroutine initdataset - - - -subroutine resetdataset() bind(c, name='resetDataset') -IMPLICIT NONE - -print*,'reset dataset' - - -end subroutine resetdataset - - -subroutine finalizedataset(outang, outval, outerr, outnpoints) bind(c, name='finalize_dataset') -IMPLICIT NONE -integer(C_LONG), intent(OUT) :: outnpoints -real(C_DOUBLE), intent(OUT) :: outang(*), outval(*), outerr(*) -integer(C_LONG) :: i - -print*,'finalize dataset' - -outnpoints=numberofbins - -print*,'returning points:' -do i=1,numberofbins - - outang(i)=i; - outval(i)=i*100; - outerr(i)=i*0.1 - - print*,i,outang(i),outval(i),outerr(i) -enddo - -end subroutine finalizedataset - - - -subroutine addframe(data, pos, i0, exptime, fname, var) bind(c, name='add_frame') -IMPLICIT NONE -real(C_DOUBLE), intent(IN) :: data(totalnumberofchannels) -real(C_DOUBLE), intent(IN) :: pos, i0, exptime, var -character(kind=c_char), dimension(*), intent(IN) :: fname -integer :: l -integer :: i - -l=0 -do - if (fname(l+1) == C_NULL_CHAR) exit - l = l + 1 -end do - - -print*,'add frame' - -print*,'Filename: ' -print*,fname(1:l) - -print*,'Position: ' -print*,pos - -print*,'I0: ' -print*,i0 - -print*,'Exposure time: ' -print*,exptime - -print*,'Var: ' -print*,var - -print*,'Data: ' -print*,data - - -end subroutine addframe - - - -subroutine calculateflatfield(nmodules, chpmod, modulemask, badchanmask,data, ffcoeff,fferr) bind(c, name='calculate_flat_field') - -IMPLICIT NONE -integer(C_LONG), intent(IN) :: nmodules, chpmod -integer(C_LONG), intent(IN) :: modulemask(nmodules), badchanmask(nmodules*chpmod) -real(C_DOUBLE), intent(IN) :: data(nmodules*chpmod) -real(C_DOUBLE), intent(OUT) :: ffcoeff(*),fferr(*) -integer(C_LONG) :: i - -real(C_DOUBLE) :: ave; - -print*,'calculate flat field' - -do i=1,nmodules*chpmod - ffcoeff(i)=data(i)*10. - fferr(i)=i - print*,i,data(i), ffcoeff(i),fferr(i) -enddo - - - - -end subroutine calculateflatfield - - -end module ax diff --git a/slsDetectorSoftware/gitInfo.txt b/slsDetectorSoftware/gitInfo.txt deleted file mode 100644 index 8ef93a990..000000000 --- a/slsDetectorSoftware/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: e998226bce91a0d82ca0bb38c202d404357cf1ff -Revision: 2074 -Branch: gh-pages -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4092 -Last Changed Date: 2019-04-08 11:46:17.000000002 +0200 ./threadFiles/ThreadPool.o diff --git a/slsDetectorSoftware/gotthardDetectorServer/.target-makefrag b/slsDetectorSoftware/gotthardDetectorServer/.target-makefrag deleted file mode 100755 index ce093ecac..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/.target-makefrag +++ /dev/null @@ -1 +0,0 @@ -AXIS_BUILDTYPE ?= cris-axis-linux-gnu diff --git a/slsDetectorSoftware/gotthardDetectorServer/AD9257.h b/slsDetectorSoftware/gotthardDetectorServer/AD9257.h deleted file mode 120000 index 87b70e097..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/AD9257.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/AD9257.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/Makefile b/slsDetectorSoftware/gotthardDetectorServer/Makefile deleted file mode 100755 index f6eacbd00..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/Makefile +++ /dev/null @@ -1,51 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - - -CROSS = bfin-uclinux- -CC = $(CROSS)gcc - -CFLAGS += -Wall -DGOTTHARDD -DMCB_FUNCS -DDACS_INT -DDEBUG # -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER - - -PROGS= gotthardDetectorServer -INSTDIR= /tftpboot -INSTMODE= 0777 - - - -BINS = testlib_sharedlibc -SRCS = server.c firmware_funcs.c server_funcs.c communication_funcs.c mcb_funcs.c -OBJS = $(SRCS:%.c=%.o) - - - -all: clean versioning $(PROGS) - -boot: $(OBJS) - -versioning: - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - -$(PROGS): $(OBJS) -# echo $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - rm gotthardDetectorServer.gdb - - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - - -romfs: - $(ROMFSINST) /bin/$(PROGS) - -clean: - rm -rf $(PROGS) *.o *.gdb - - - - - diff --git a/slsDetectorSoftware/gotthardDetectorServer/Makefile.propix b/slsDetectorSoftware/gotthardDetectorServer/Makefile.propix deleted file mode 100755 index 7f40e78a3..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/Makefile.propix +++ /dev/null @@ -1,49 +0,0 @@ -# $Id: Makefile,v 1.1.1.1 2006/02/04 03:35:01 freza Exp $ -# first compile -# make cris-axis-linux-gnu - - -CROSS = bfin-uclinux- -CC = $(CROSS)gcc - -CFLAGS += -Wall -DGOTTHARDD -DPROPIXD -DMCB_FUNCS -DDACS_INT -DDEBUG # -DVERBOSE #-DVERYVERBOSE #-DVIRTUAL #-DDACS_INT_CSERVER - - -PROGS= propixDetectorServer -INSTDIR= /tftpboot -INSTMODE= 0777 - - - -BINS = testlib_sharedlibc -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c -OBJS = $(SRCS:%.c=%.o) - - - -all: clean $(PROGS) - -boot: $(OBJS) - -$(PROGS): $(OBJS) - echo $(OBJS) - @echo `tput setaf 6; ./updateGitVersion.sh; tput sgr0;` - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - - -install: $(PROGS) - $(INSTALL) -d $(INSTDIR) - $(INSTALL) -m $(INSTMODE) $(PROGS) $(INSTDIR) - - -romfs: - $(ROMFSINST) /bin/$(PROGS) - -clean: - rm -rf $(PROGS) *.o *.gdb - - - - - - diff --git a/slsDetectorSoftware/gotthardDetectorServer/Makefile.virtual b/slsDetectorSoftware/gotthardDetectorServer/Makefile.virtual deleted file mode 100755 index ca9bff23c..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/Makefile.virtual +++ /dev/null @@ -1,30 +0,0 @@ - -DESTDIR ?= ./ - -CC = gcc -CFLAGS += -Wall -DGOTTHARDD -DMCB_FUNCS -DDACS_INT -DDEBUG -DVIRTUAL - - -PROGS= $(DESTDIR)/gotthardDetectorServer_virtual - - -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c -OBJS = $(SRCS:%.c=%.o) - -gotthardVirtualServer = $(PROGS) - -all: clean $(PROGS) - - -$(PROGS): $(OBJS) - $(CC) $(CFLAGS) -o $@ $^ $(LDLIBS_$@) $(LDFLAGS_$@) - - -clean: - rm -rf $(PROGS) *.o *.gdb - - - - - - diff --git a/slsDetectorSoftware/gotthardDetectorServer/ansi.h b/slsDetectorSoftware/gotthardDetectorServer/ansi.h deleted file mode 120000 index a122db0ad..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/ansi.h +++ /dev/null @@ -1 +0,0 @@ -../../slsReceiverSoftware/include/ansi.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/commonServerFunctions.h b/slsDetectorSoftware/gotthardDetectorServer/commonServerFunctions.h deleted file mode 120000 index 33bdd8d53..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/commonServerFunctions.h +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServer/commonServerFunctions.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/communication_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/communication_funcs.c deleted file mode 120000 index 87a4f95d1..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/communication_funcs.c +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.c \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/communication_funcs.h b/slsDetectorSoftware/gotthardDetectorServer/communication_funcs.h deleted file mode 120000 index f220903b2..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/communication_funcs.h +++ /dev/null @@ -1 +0,0 @@ -../commonFiles/communication_funcs.h \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/config.txt b/slsDetectorSoftware/gotthardDetectorServer/config.txt deleted file mode 100644 index 721434a75..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/config.txt +++ /dev/null @@ -1,23 +0,0 @@ -#masterflags (no_master, is_master, is_slave) -masterflags no_master - -#master default delay -masterdefaultdelay 70 - -#patternphase -patternphase 0 - -#adcphase -adcphase 0 - -#slave pattern phase -slavepatternphase 0 - -#slave adc phase -slaveadcphase 0 - -#rst to sw1 delay -rsttosw1delay 2 - -#start acquisition delay -startacqdelay 1 \ No newline at end of file diff --git a/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c b/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c deleted file mode 100755 index 261c58da4..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/firmware_funcs.c +++ /dev/null @@ -1,1975 +0,0 @@ - -#include "server_defs.h" -#include "firmware_funcs.h" -#include "mcb_funcs.h" -#include "registers_g.h" - -#include -#include -#include - -#include -#include - - -//for memory mapping -u_int64_t CSP0BASE; - -FILE *debugfp, *datafp; - -int fr; -int wait_time; -int *fifocntrl; - -//int *statusreg; commented out by dhanya -const int nModY=1; -int nModBoard; -int nModX=NMAXMOD; -int dynamicRange=16;//32; -int dataBytes=NMAXMOD*NCHIP*NCHAN*2; -int storeInRAM=0; -int ROI_flag=0; -int adcConfigured=-1; - -int ram_size=0; - -int64_t totalTime=1; -u_int32_t progressMask=0; - -int phase_shift=DEFAULT_PHASE_SHIFT; -int ipPacketSize=DEFAULT_IP_PACKETSIZE; -int udpPacketSize=DEFAULT_UDP_PACKETSIZE; - - -int ififostart, ififostop, ififostep, ififo; - -int masterMode=NO_MASTER, syncMode=NO_SYNCHRONIZATION, timingMode=AUTO_TIMING; - -enum externalSignalFlag signalMode=EXT_SIG_OFF; - - -//for the 25um detectors -int masterflags = NO_MASTER; -int masterdefaultdelay = 62; -int patternphase = 0; -int adcphase = 0; -int slavepatternphase = 0; -int slaveadcphase = 0; -int rsttosw1delay = 2; -int startacqdelay = 1; - -int detectorFirstServer = 1; - - -#ifdef MCB_FUNCS -extern const int nChans; -extern const int nChips; -//extern const int nDacs; -//extern const int nAdcs; -#endif -#ifndef MCB_FUNCS - -const int nChans=NCHAN; -const int nChips=NCHIP; -const int nDacs=NDAC; -const int nAdcs=NADC; -#endif - - - - -/** - ENEt conf structs -*/ -typedef struct mac_header_struct{ - u_int8_t mac_dest_mac2; - u_int8_t mac_dest_mac1; - u_int8_t mac_dummy1; - u_int8_t mac_dummy2; - u_int8_t mac_dest_mac6; - u_int8_t mac_dest_mac5; - u_int8_t mac_dest_mac4; - u_int8_t mac_dest_mac3; - u_int8_t mac_src_mac4; - u_int8_t mac_src_mac3; - u_int8_t mac_src_mac2; - u_int8_t mac_src_mac1; - u_int16_t mac_ether_type; - u_int8_t mac_src_mac6; - u_int8_t mac_src_mac5; -} mac_header; - -typedef struct ip_header_struct { - u_int16_t ip_len; - u_int8_t ip_tos; - u_int8_t ip_ihl:4 ,ip_ver:4; - u_int16_t ip_offset:13,ip_flag:3; - u_int16_t ip_ident; - u_int16_t ip_chksum; - u_int8_t ip_protocol; - u_int8_t ip_ttl; - u_int32_t ip_sourceip; - u_int32_t ip_destip; -} ip_header; - -typedef struct udp_header_struct{ - u_int16_t udp_destport; - u_int16_t udp_srcport; - u_int16_t udp_chksum; - u_int16_t udp_len; -} udp_header; - -typedef struct mac_conf_struct{ - mac_header mac; - ip_header ip; - udp_header udp; - u_int32_t npack; - u_int32_t lpack; - u_int32_t npad; - u_int32_t cdone; -} mac_conf; - -typedef struct tse_conf_struct{ - u_int32_t rev; //0x0 - u_int32_t scratch; - u_int32_t command_config; - u_int32_t mac_0; //0x3 - u_int32_t mac_1; - u_int32_t frm_length; - u_int32_t pause_quant; - u_int32_t rx_section_empty; //0x7 - u_int32_t rx_section_full; - u_int32_t tx_section_empty; - u_int32_t tx_section_full; - u_int32_t rx_almost_empty; //0xB - u_int32_t rx_almost_full; - u_int32_t tx_almost_empty; - u_int32_t tx_almost_full; - u_int32_t mdio_addr0; //0xF - u_int32_t mdio_addr1; -}tse_conf; - - - -int mapCSP0(void) { - printf("Mapping memory\n"); -#ifndef VIRTUAL - int fd; - fd = open("/dev/mem", O_RDWR | O_SYNC, 0); - if (fd == -1) { - printf("\nCan't find /dev/mem!\n"); - return FAIL; - } - printf("/dev/mem opened\n"); - - CSP0BASE = (u_int32_t)mmap(0, MEM_SIZE, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, CSP0); - if (CSP0BASE == (u_int32_t)MAP_FAILED) { - printf("\nCan't map memmory area!!\n"); - return FAIL; - } - printf("CSP0 mapped\n"); - -#endif -#ifdef VIRTUAL - CSP0BASE = malloc(MEM_SIZE); - printf("memory allocated\n"); -#endif -#ifdef SHAREDMEMORY - if ( (res=inism(SMSV))<0) { - printf("error attaching shared memory! %i",res); - return FAIL; - } -#endif - printf("CSPObase is 0x%llx \n",CSP0BASE); - printf("CSPOBASE=from %llx to %llx\n",CSP0BASE,CSP0BASE+MEM_SIZE); - - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - printf("\n\n"); - return OK; -} - -u_int16_t bus_r16(u_int32_t offset){ - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - return *ptr1; -} - -u_int16_t bus_w16(u_int32_t offset, u_int16_t data) { - volatile u_int16_t *ptr1; - ptr1=(u_int16_t*)(CSP0BASE+offset*2); - *ptr1=data; - return OK; -} - -/** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ -u_int16_t ram_w16(u_int32_t ramType, int adc, int adcCh, int Ch, u_int16_t data) { - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Writing to addr:%x\n",adr); - return bus_w16(adr,data); -} - -/** ramType is DARK_IMAGE_REG or GAIN_IMAGE_REG */ -u_int16_t ram_r16(u_int32_t ramType, int adc, int adcCh, int Ch){ - unsigned int adr = (ramType | adc << 8 | adcCh << 5 | Ch ); - // printf("Reading from addr:%x\n",adr); - return bus_r16(adr); -} - -u_int32_t bus_w(u_int32_t offset, u_int32_t data) { - volatile u_int32_t *ptr1; - - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - *ptr1=data; - - return OK; -} - - -u_int32_t bus_r(u_int32_t offset) { - volatile u_int32_t *ptr1; - - ptr1=(u_int32_t*)(CSP0BASE+offset*2); - return *ptr1; -} - - - -void setMasterSlaveConfiguration(){ - -// global master default delay picked from config file - FILE* fd=fopen(CONFIG_FILE,"r"); - if(fd==NULL){ - cprintf(RED,"\nWarning: Could not open file\n"); - return; - } - cprintf(BLUE,"config file %s opened\n", CONFIG_FILE); - - char key[256]; - char value[256]; - char line[256]; - int ival=0; - u_int32_t val=0; - - while (fgets(line, sizeof(line), fd)) { - if(line[0] == '#') - continue; - sscanf(line, "%s %s\n", key, value); - if (!strcasecmp(key,"masterflags")) { - if (!strcasecmp(value,"is_master")) { - masterflags = IS_MASTER; - } - else if (!strcasecmp(value,"is_slave")) { - masterflags = IS_SLAVE; - } - else if (!strcasecmp(value,"no_master")){ - masterflags = NO_MASTER; - } - else { - cprintf(RED,"could not scan masterflags %s value from config file\n",value); - fclose(fd); - exit(EXIT_FAILURE); - } - - if (!detectorFirstServer) { - cprintf(BLUE, "Server has been started up before. Ignoring rest of config file\n"); - fclose(fd); - return; - } - } - else { - if(sscanf(value,"%d",&ival)<=0) { - cprintf(RED,"could not scan patternphase %s value from config file\n",value); - fclose(fd); - exit(EXIT_FAILURE); - } - - if (!strcasecmp(key,"masterdefaultdelay")) - masterdefaultdelay = ival; - else if (!strcasecmp(key,"patternphase")) - patternphase = ival; - else if (!strcasecmp(key,"adcphase")) - adcphase = ival; - else if (!strcasecmp(key,"slavepatternphase")) - slavepatternphase = ival; - else if (!strcasecmp(key,"slaveadcphase")) - slaveadcphase = ival; - else if (!strcasecmp(key,"rsttosw1delay")) - rsttosw1delay = ival; - else if (!strcasecmp(key,"startacqdelay")) - startacqdelay = ival; - else { - cprintf(RED,"could not scan parameter name %s from config file\n",key); - fclose(fd); - exit(EXIT_FAILURE); - } - } - - } - cprintf(BLUE, - "masterflags: %d\n" - "masterdefaultdelay:%d\n" - "patternphase:%d\n" - "adcphase:%d\n" - "slavepatternphase:%d\n" - "slaveadcphase:%d\n" - "rsttosw1delay:%d\n" - "startacqdelay:%d\n", - masterflags, - masterdefaultdelay, - patternphase, - adcphase, - slavepatternphase, - slaveadcphase, - rsttosw1delay, - startacqdelay); - - - - if (masterflags == IS_MASTER) { - // set delay - setDelay(0); - - /* Set pattern phase for the master module */ - val=bus_r(MULTI_PURPOSE_REG); - val = (val & (~(PLL_CLK_SEL_MSK))) | PLL_CLK_SEL_MASTER_VAL; - bus_w(MULTI_PURPOSE_REG,val); - setPhaseShift(patternphase); - /* Set adc phase for the master module */ - val=bus_r(MULTI_PURPOSE_REG); - val = (val & (~(PLL_CLK_SEL_MSK))) | PLL_CLK_SEL_MASTER_ADC_VAL; - bus_w(MULTI_PURPOSE_REG,val); - setPhaseShift(adcphase); - /* Set pattern phase for the slave module */ - val=bus_r(MULTI_PURPOSE_REG); - val = (val & (~(PLL_CLK_SEL_MSK))) | PLL_CLK_SEL_SLAVE_VAL; - bus_w(MULTI_PURPOSE_REG,val); - setPhaseShift(slavepatternphase); - /* Set adc phase for the slave module */ - val=bus_r(MULTI_PURPOSE_REG); - val = (val & (~(PLL_CLK_SEL_MSK))) | PLL_CLK_SEL_SLAVE_ADC_VAL; - bus_w(MULTI_PURPOSE_REG,val); - setPhaseShift(slaveadcphase); - /* Set start acq delay */ - val=bus_r(MULTI_PURPOSE_REG); -#ifdef VERBOSE - printf("Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); -#endif - val = (val & (~(START_ACQ_DELAY_MSK))) | ((startacqdelay << START_ACQ_DELAY_OFFSET) & (START_ACQ_DELAY_MSK)); - bus_w(MULTI_PURPOSE_REG,val); - printf("Start acq delay set. Multipurpose reg: 0x%x\n",bus_r(MULTI_PURPOSE_REG)); - } - - /* Set RST to SW1 delay */ - val=bus_r(MULTI_PURPOSE_REG); -#ifdef VERBOSE - printf("Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); -#endif - val = (val & (~(RST_TO_SW1_DELAY_MSK))) | ((rsttosw1delay << RST_TO_SW1_DELAY_OFFSET) & (RST_TO_SW1_DELAY_MSK)); - bus_w(MULTI_PURPOSE_REG,val); - printf("RST to SW1 delay set. Multipurpose reg:0x%x\n",bus_r(MULTI_PURPOSE_REG)); - - fclose(fd); -} - - -int setPhaseShiftOnce(){ - u_int32_t addr, reg; - int i; - addr=MULTI_PURPOSE_REG; - reg=bus_r(addr); -#ifdef VERBOSE - printf("Multipurpose reg:%x\n",reg); -#endif - - //Checking if it is power on(negative number) - // if(((reg&0xFFFF0000)>>16)>0){ - //bus_w(addr,0x0); //clear the reg - - if(reg==0){ - detectorFirstServer = 1; - printf("\nImplementing phase shift of %d\n",phase_shift); - for (i=1;i=0) { - bus_w(CONFIG_REG,d); - } -#ifdef VERBOSE - printf("configuration register is %x", bus_r(CONFIG_REG)); -#endif - return bus_r(CONFIG_REG); -} - -int setToT(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting ToT to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: ToT is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|TOT_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~TOT_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("ToT is %x\n", reg); -#endif - if (reg&TOT_ENABLE_BIT) - return 1; - else - return 0; -} - -int setContinousReadOut(int d) { - //int ret=0; - int reg; -#ifdef VERBOSE - printf("Setting Continous readout to %d\n",d); -#endif - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Before: Continous readout is %x\n", reg); -#endif - if (d>0) { - bus_w(CONFIG_REG,reg|CONT_RO_ENABLE_BIT); - } else if (d==0) { - bus_w(CONFIG_REG,reg&(~CONT_RO_ENABLE_BIT)); - } - reg=bus_r(CONFIG_REG); -#ifdef VERBOSE - printf("Continous readout is %x\n", reg); -#endif - if (reg&CONT_RO_ENABLE_BIT) - return 1; - else - return 0; -} - - -int startReceiver(int start) { - u_int32_t addr=CONFIG_REG; -#ifdef VERBOSE - if(start) - printf("Setting up detector to send to Receiver\n"); - else - printf("Setting up detector to send to CPU\n"); -#endif - int reg=bus_r(addr); - //for start recever, write 0 and for stop, write 1 - if (!start) - bus_w(CONFIG_REG,reg|CPU_OR_RECEIVER_BIT); - else - bus_w(CONFIG_REG,reg&(~CPU_OR_RECEIVER_BIT)); - - reg=bus_r(addr); -//#ifdef VERBOSE - printf("Config Reg %x\n", reg); -//#endif - int d =reg&CPU_OR_RECEIVER_BIT; - if(d!=0) d=1; - if(d!=start) - return OK; - else - return FAIL; -} - - -u_int64_t getDetectorNumber() { - char output[255],mac[255]=""; - u_int64_t res=0; - FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); - fgets(output, sizeof(output), sysFile); - pclose(sysFile); - //getting rid of ":" - char * pch; - pch = strtok (output,":"); - while (pch != NULL){ - strcat(mac,pch); - pch = strtok (NULL, ":"); - } - sscanf(mac,"%llx",&res); - return res; -} - -u_int32_t getFirmwareVersion() { - return bus_r(FPGA_VERSION_REG); -} - -u_int32_t getFirmwareSVNVersion(){ - return bus_r(FPGA_SVN_REG); -} - - -// for fpga test -u_int32_t testFpga(void) { - printf("Testing FPGA:\n"); - volatile u_int32_t val,addr,val2; - int result=OK,i; - //fixed pattern - val=bus_r(FIX_PATT_REG); - if (val==FIXED_PATT_VAL) { - printf("fixed pattern ok!! %08x\n",val); - } else { - printf("fixed pattern wrong!! %08x\n",val); - result=FAIL; - } - - //dummy register - addr = DUMMY_REG; - for(i=0;i<1000000;i++) - { - val=0x5A5A5A5A-i; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x5A5A5A5A-i) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of %x \n",i,val,0x5A5A5A5A-i); - result=FAIL; - } - val=(i+(i<<10)+(i<<20)); - bus_w(addr, val); - val2=bus_r(addr); - if (val2!=val) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! read %x instead of %x.\n",i,val2,val); - result=FAIL; - } - val=0x0F0F0F0F; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0x0F0F0F0F) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0x0F0F0F0F \n",i,val); - result=FAIL; - } - val=0xF0F0F0F0; - bus_w(addr, val); - val=bus_r(addr); - if (val!=0xF0F0F0F0) { - printf("ATTEMPT:%d:\tFPGA dummy register wrong!! %x instead of 0xF0F0F0F0 \n\n",i,val); - result=FAIL; - } - } - if(result==OK) - { - printf("----------------------------------------------------------------------------------------------"); - printf("\nATTEMPT 1000000: FPGA DUMMY REGISTER OK!!!\n"); - printf("----------------------------------------------------------------------------------------------"); - } - printf("\n"); - return result; -} - - -int getNModBoard() { - return nModX; -} - -int setNMod(int n) { - return nModX; -} - - -// fifo test -int testFifos(void) { - printf("Fifo test not implemented!\n"); - bus_w16(CONTROL_REG, START_FIFOTEST_BIT); - bus_w16(CONTROL_REG, 0x0); - return OK; -} - - - -// program dacq settings - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - if (value!=-1) { - vLSB=value&(0xffffffff); - bus_w(aLSB,vLSB); - v64=value>> 32; - vMSB=v64&(0xffffffff); - bus_w(aMSB,vMSB); - } - return get64BitReg(aLSB, aMSB); - -} - -int64_t get64BitReg(int aLSB, int aMSB){ - int64_t v64; - u_int32_t vLSB,vMSB; - vLSB=bus_r(aLSB); - vMSB=bus_r(aMSB); - v64=vMSB; - v64=(v64<<32) | vLSB; - return v64; -} - -int64_t setFrames(int64_t value){printf("setting frames to %lld\n", (long long int)value); - return set64BitReg(value, SET_FRAMES_LSB_REG, SET_FRAMES_MSB_REG); -} - -int64_t getFrames(){ - return get64BitReg(GET_FRAMES_LSB_REG, GET_FRAMES_MSB_REG); -} - -int64_t setExposureTime(int64_t value){printf("setting exptime to %lld ns\n", (long long int)value); - /* time is in ns */ - if (value!=-1) { - value = (value * 1E-3 * CLK_FREQ ) + 0.5; - } - return (set64BitReg(value,SET_EXPTIME_LSB_REG, SET_EXPTIME_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t getExposureTime(){ - return (get64BitReg(GET_EXPTIME_LSB_REG, GET_EXPTIME_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t setGates(int64_t value){printf("setting gates to %lld\n", (long long int)value); - return set64BitReg(value, SET_GATES_LSB_REG, SET_GATES_MSB_REG); -} - -int64_t getGates(){ - return get64BitReg(GET_GATES_LSB_REG, GET_GATES_MSB_REG); -} - -int64_t setPeriod(int64_t value){printf("setting period to %lld ns\n", (long long int)value); - /* time is in ns */ - if (value!=-1) { - value = (value * 1E-3 * CLK_FREQ ) + 0.5; - } - return (set64BitReg(value,SET_PERIOD_LSB_REG, SET_PERIOD_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t getPeriod(){ - return (get64BitReg(GET_PERIOD_LSB_REG, GET_PERIOD_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t setDelay(int64_t value){printf("setting delay to %lld ns\n", (long long int)value); - /* time is in ns */ - if (value!=-1) { - if (masterflags == IS_MASTER) { - value += masterdefaultdelay; - cprintf(BLUE,"Actual delay for master: %lld\n", (long long int) value); - } - value = (value * 1E-3 * CLK_FREQ ) + 0.5; - } - int64_t retval = (set64BitReg(value,SET_DELAY_LSB_REG, SET_DELAY_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; - if (masterflags == IS_MASTER) { - cprintf(BLUE,"Actual delay read from master: %lld\n", (long long int) retval); - retval -= masterdefaultdelay; - } - - return retval; -} - -int64_t getDelay(){ - return (get64BitReg(GET_DELAY_LSB_REG, GET_DELAY_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t setTrains(int64_t value){printf("setting cycles to %lld\n", (long long int)value); - return set64BitReg(value, SET_TRAINS_LSB_REG, SET_TRAINS_MSB_REG); -} - -int64_t getTrains(){ - return get64BitReg(GET_TRAINS_LSB_REG, GET_TRAINS_MSB_REG); -} - - -int64_t setProbes(int64_t value){ - return 0; -} - - -int64_t setProgress() { - //????? eventually call after setting the registers -return 0; - -} - - -int64_t getProgress() { - //should be done in firmware!!!! - return 0; - -} - -int64_t getActualTime(){ - return (get64BitReg(GET_ACTUAL_TIME_LSB_REG, GET_ACTUAL_TIME_MSB_REG) / - (1E-3 * CLK_FREQ)) + 0.5; -} - -int64_t getMeasurementTime(){ - int64_t v=get64BitReg(GET_MEASUREMENT_TIME_LSB_REG, GET_MEASUREMENT_TIME_MSB_REG); - return (v / (1E-3 * CLK_FREQ)) + 0.5; -} - - - - -int loadImage(int index, short int ImageVals[]){ - u_int32_t address; - switch (index) { - case DARK_IMAGE : - address = DARK_IMAGE_REG; - break; - case GAIN_IMAGE : - address = GAIN_IMAGE_REG; - break; - } - volatile u_int16_t *ptr; - ptr=(u_int16_t*)(CSP0BASE+address*2); -#ifdef VERBOSE - int i; - for(i=0;i<6;i++) - printf("%d:%d\t",i,ImageVals[i]); -#endif - memcpy((char*)ptr,(char*)ImageVals ,dataBytes); -#ifdef VERBOSE - printf("\nLoaded x%08x address with image of index %d\n",(unsigned int)(ptr),index); -#endif - return OK; -} - - - -int64_t getProbes(){ - return 0; -} - - -int setDACRegister(int idac, int val, int imod) { - u_int32_t addr, reg, mask; - int off; -#ifdef VERBOSE - if(val==-1) - printf("Getting dac register%d module %d\n",idac,imod); - else - printf("Setting dac register %d module %d to %d\n",idac,imod,val); -#endif - - switch(idac){ - case 0: - case 1: - case 2: - addr=MOD_DACS1_REG; - break; - case 3: - case 4: - case 5: - addr=MOD_DACS2_REG; - break; - case 6: - case 7: - addr=MOD_DACS3_REG; - break; - default: - printf("weird idac value %d\n",idac); - return -1; - break; - } - //saving only the msb - val=val>>2; - - off=(idac%3)*10; - mask=~((0x3ff)<=0 && val>off)&0x3ff; - //since we saved only the msb - val=val<<2; - - //val=(bus_r(addr)>>off)&0x3ff; - - -#ifdef VERBOSE - printf("Dac %d module %d register is %d\n\n",idac,imod,val); -#endif - return val; -} - - -int getTemperature(int tempSensor, int imod){ - int val; - imod=0;//ignoring more than 1 mod for now - int i,j,repeats=6; - u_int32_t tempVal=0; -#ifdef VERBOSE - char cTempSensor[2][100]={"ADCs/ASICs","VRs/FPGAs"}; - printf("Getting Temperature of module:%d for the %s for tempsensor:%d\n",imod,cTempSensor[tempSensor],tempSensor); -#endif - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - bus_w(TEMP_IN_REG,((T1_CLK_BIT)&~(T1_CS_BIT))|(T2_CLK_BIT));//high clk low cs - - for(i=0;i<20;i++) { - //repeats is number of register writes for delay - for(j=0;j>1);//fpga - } - } - - bus_w(TEMP_IN_REG,(T1_CLK_BIT)|(T1_CS_BIT)|(T2_CLK_BIT)|(T2_CS_BIT));//standby - val=((int)tempVal)/4.0; - -#ifdef VERBOSE - printf("Temperature of module:%d for the %s is %.2fC\n",imod,cTempSensor[tempSensor],val); -#endif - return val; -} - - - -int initHighVoltage(int val, int imod){ -#ifdef VERBOSE - printf("Setting/Getting High Voltage of module:%d with val:%d\n",imod,val); -#endif - volatile u_int32_t addr=HV_REG; - int writeVal,writeVal2; - switch(val){ - case -1: break; - case 0: writeVal=0x0; writeVal2=0x0; break; - case 90: writeVal=0x0; writeVal2=0x1; break; - case 110:writeVal=0x2; writeVal2=0x3; break; - case 120:writeVal=0x4; writeVal2=0x5; break; - case 150:writeVal=0x6; writeVal2=0x7; break; - case 180:writeVal=0x8; writeVal2=0x9; break; - case 200:writeVal=0xA; writeVal2=0xB; break; - default :printf("Invalid voltage\n");return -2;break; - } - //to set value - if(val!=-1){ - //set value to converted value - bus_w(addr,writeVal); - bus_w(addr,writeVal2); -#ifdef VERBOSE - printf("Value sent is %d and then %d\n",writeVal,writeVal2); -#endif - } - //read value and return the converted value - val=bus_r(addr); -#ifdef VERBOSE - printf("Value read from reg is %d\n",val); -#endif - switch(val){ - case 0x0:val=0;break; - case 0x1:val=90;break; - case 0x3:val=110;break; - case 0x5:val=120;break; - case 0x7:val=150;break; - case 0x9:val=180;break; - case 0xB:val=200;break; - default:printf("Weird value read:%d\n",val);return -3;break; - } -#ifdef VERBOSE - printf("High voltage of module:%d is %d\n",imod,val); -#endif - return val; -} - - - -int initConfGain(int isettings,int val,int imod){ - int retval; - u_int32_t addr=GAIN_REG; - - if(val!=-1){ -#ifdef VERBOSE - printf("Setting Gain of module:%d with val:%d\n",imod,val); -#endif - bus_w(addr,((val<>SETTINGS_OFFSET); -#ifdef VERBOSE - printf("Settings read from reg is %d\n",retval); -#endif - if((isettings!=-1)&&(retval!=isettings)){ - printf("\n\nSettings r\n\n"); - return -1; - } - - return retval; -} - - - -int setADC(int adc){ - int reg,nchips,mask; - - if(adc==-1) ROI_flag=0; - else ROI_flag=1; - - setDAQRegister();//token timing - cleanFifo();//adc sync - - //all adc - if(adc==-1){ - //set packet size - ipPacketSize= DEFAULT_IP_PACKETSIZE; - udpPacketSize=DEFAULT_UDP_PACKETSIZE; - //set channel mask - nchips = NCHIP; - mask = ACTIVE_ADC_MASK; - } - //1 adc - else{ - ipPacketSize= ADC1_IP_PACKETSIZE; - udpPacketSize=ADC1_UDP_PACKETSIZE; - //set channel mask - nchips = NCHIPS_PER_ADC; - mask = 1<mac.mac_dest_mac1 =((macad>>(8*5))&0xFF);// 0x00; //pc7060 - mac_conf_regs->mac.mac_dest_mac2 =((macad>>(8*4))&0xFF);// 0x19; //pc7060 - mac_conf_regs->mac.mac_dest_mac3 =((macad>>(8*3))&0xFF);// 0x99; //pc7060 - mac_conf_regs->mac.mac_dest_mac4 =((macad>>(8*2))&0xFF);// 0x24; //pc7060 - mac_conf_regs->mac.mac_dest_mac5 =((macad>>(8*1))&0xFF);// 0xEB; //pc7060 - mac_conf_regs->mac.mac_dest_mac6 =((macad>>(8*0))&0xFF);// 0xEE; //pc7060 - /* - mac_conf_regs->mac.mac_src_mac1 = 0x00; - mac_conf_regs->mac.mac_src_mac2 = 0xAA; - mac_conf_regs->mac.mac_src_mac3 = 0xBB; - mac_conf_regs->mac.mac_src_mac4 = 0xCC; - mac_conf_regs->mac.mac_src_mac5 = 0xDD; - mac_conf_regs->mac.mac_src_mac6 = 0xEE; - */ - mac_conf_regs->mac.mac_src_mac1 =((detectormacad>>(8*5))&0xFF); - mac_conf_regs->mac.mac_src_mac2 =((detectormacad>>(8*4))&0xFF); - mac_conf_regs->mac.mac_src_mac3 =((detectormacad>>(8*3))&0xFF); - mac_conf_regs->mac.mac_src_mac4 =((detectormacad>>(8*2))&0xFF); - mac_conf_regs->mac.mac_src_mac5 =((detectormacad>>(8*1))&0xFF); - mac_conf_regs->mac.mac_src_mac6 =((detectormacad>>(8*0))&0xFF); - mac_conf_regs->mac.mac_ether_type = 0x0800; //ipv4 - - - mac_conf_regs->ip.ip_ver = 0x4; - mac_conf_regs->ip.ip_ihl = 0x5; - mac_conf_regs->ip.ip_tos = 0x0; - mac_conf_regs->ip.ip_len = ipPacketSize;//0x0522; // was 0x0526; - mac_conf_regs->ip.ip_ident = 0x0000; - mac_conf_regs->ip.ip_flag = 0x2; - mac_conf_regs->ip.ip_offset = 0x00; - mac_conf_regs->ip.ip_ttl = 0x70; - mac_conf_regs->ip.ip_protocol = 0x11; - mac_conf_regs->ip.ip_chksum = 0x0000 ; //6E42 now is automatically computed - mac_conf_regs->ip.ip_sourceip = detipad; //0x8181CA2E;129.129.202.46 - mac_conf_regs->ip.ip_destip = ipad; //CA57 - -#ifdef VERBOSE - printf("mac_dest:%llx %x:%x:%x:%x:%x:%x\n", - macad, - mac_conf_regs->mac.mac_dest_mac1, - mac_conf_regs->mac.mac_dest_mac2, - mac_conf_regs->mac.mac_dest_mac3, - mac_conf_regs->mac.mac_dest_mac4, - mac_conf_regs->mac.mac_dest_mac5, - mac_conf_regs->mac.mac_dest_mac6); - printf("mac_src:%llx %x:%x:%x:%x:%x:%x\n", - detectormacad, - mac_conf_regs->mac.mac_src_mac1, - mac_conf_regs->mac.mac_src_mac2, - mac_conf_regs->mac.mac_src_mac3, - mac_conf_regs->mac.mac_src_mac4, - mac_conf_regs->mac.mac_src_mac5, - mac_conf_regs->mac.mac_src_mac6); - printf("ip_ttl:%x\n",mac_conf_regs->ip.ip_ttl); -#endif - - //checksum - count=sizeof(mac_conf_regs->ip); - addr=&(mac_conf_regs->ip); - while( count > 1 ) { - sum += *addr++; - count -= 2; - } - if( count > 0 ) sum += *addr; // Add left-over byte, if any - while (sum>>16) sum = (sum & 0xffff) + (sum >> 16);// Fold 32-bit sum to 16 bits - checksum = (~sum)&0xffff; - mac_conf_regs->ip.ip_chksum = checksum; - //#ifdef VERBOSE - printf("IP header checksum is 0x%x s\n",(unsigned int)(checksum)); - //#endif - - mac_conf_regs->udp.udp_srcport = 0xE185; - mac_conf_regs->udp.udp_destport = udpport;//0xC351; - mac_conf_regs->udp.udp_len = udpPacketSize;//0x050E; //was 0x0512; - mac_conf_regs->udp.udp_chksum = 0x0000; - -#ifdef VERBOSE - printf("Configuring TSE\n"); -#endif - tse_conf_regs->rev = 0xA00; - tse_conf_regs->scratch = 0xCCCCCCCC; - tse_conf_regs->command_config = 0xB; - tse_conf_regs->mac_0 = 0x17231C00; - tse_conf_regs->mac_1 = 0xCB4A; - tse_conf_regs->frm_length = 0x5DC; //max frame length (1500 bytes) (was 0x41C) - tse_conf_regs->pause_quant = 0x0; - tse_conf_regs->rx_section_empty = 0x7F0; - tse_conf_regs->rx_section_full = 0x10; - tse_conf_regs->tx_section_empty = 0x3F8; //was 0x7F0; - tse_conf_regs->tx_section_full = 0x16; - tse_conf_regs->rx_almost_empty = 0x8; - tse_conf_regs->rx_almost_full = 0x8; - tse_conf_regs->tx_almost_empty = 0x8; - tse_conf_regs->tx_almost_full = 0x3; - tse_conf_regs->mdio_addr0 = 0x12; - tse_conf_regs->mdio_addr1 = 0x0; - mac_conf_regs->cdone = 0xFFFFFFFF; - - - if(ival) - bus_w(addrr, bus_r(addrr) | (INT_RSTN_BIT|ENET_RESETN_BIT|WRITE_BACK_BIT|DIGITAL_TEST_BIT)); //0x2840,write shadow regs.. - else - bus_w(addrr, bus_r(addrr) | (INT_RSTN_BIT|ENET_RESETN_BIT|WRITE_BACK_BIT)); //0x2840,write shadow regs.. - -#ifdef VERBOSE - printf("Value read from Multi-purpose Reg:%x\n",bus_r(addrr)); -#endif - // if(val!=0x2840) return -1; - - usleep(100000); - - bus_w(addrr, bus_r(addrr) &(~WRITE_BACK_BIT)); - - if(ival) - bus_w(addrr, bus_r(addrr) | (INT_RSTN_BIT|ENET_RESETN_BIT|SW1_BIT|DIGITAL_TEST_BIT)); //0x2820,write shadow regs.. - else - bus_w(addrr, bus_r(addrr) | (INT_RSTN_BIT|ENET_RESETN_BIT|SW1_BIT)); //0x2820,write shadow regs.. - -#ifdef VERBOSE - printf("Value read from Multi-purpose Reg:%x\n",bus_r(addrr)); -#endif - // if(val!=0x2820) return -1; - - usleep(1000 * 1000); - - /** send out first image as first packet does not give 0xcacacaca (needed to know if first image - * when switching back and forth between roi and no roi - */ - // remember old parameters - int oldtiming = setTiming(-1); - uint64_t oldframes = setFrames(-1); - uint64_t oldcycles = setTrains(-1); - uint64_t oldPeriod = setPeriod(-1); - uint64_t oldExptime = setExposureTime(-1); - - // set to basic parameters - cprintf(BLUE,"Setting basic parameters\n" - "\tTiming: auto, frames: 1, cycles: 1, period: 1s, exptime: 900ms\n"); - setTiming(AUTO_TIMING); - setFrames(1); - setTrains(1); - setPeriod(1e9); // important to keep this until we have to wait for acquisition to start - setExposureTime(900 * 1000); - - // take an image - if (masterflags == IS_MASTER) - usleep(1 * 1000 * 1000); // required to ensure master starts acquisition only after slave has changed to basic parameters and is waiting - - int loop = 0; - startStateMachine(); - // wait for acquisition to start (trigger from master) - printf(" Waiting for acquisition to start\n"); - while(!runBusy()) { - usleep(0); - ++loop; - } - - cprintf(MAGENTA, "waited %d loops to start\n", loop); - cprintf(BLUE, " Waiting for acquisition to end (frames left: %lld)\n", (long long int)getFrames()); - waitForAcquisitionFinish(); - - // set to previous parameters - cprintf(BLUE,"Setting previous parameters:\n" - "\tTiming: %d, " - "frames: %lld, " - "cycles: %lld, " - "period: %lld ns, " - "exptime:%lld ns\n", - oldtiming, oldframes, oldcycles, oldPeriod, oldExptime); - setTiming(oldtiming); - setFrames(oldframes); - setTrains(oldcycles); - setPeriod(oldPeriod); - setExposureTime(oldExptime); - - return adcConfigured; -} - - -int getAdcConfigured(){ - return adcConfigured; -} - -u_int32_t runBusy(void) { - u_int32_t s = bus_r(STATUS_REG) & RUN_BUSY_BIT; - //printf("runBusy: 0x%08x\n", s); - return s; -} - -u_int32_t dataPresent(void) { - return bus_r(LOOK_AT_ME_REG); -} - -u_int32_t runState(void) { - int s=bus_r(STATUS_REG); -#ifdef SHAREDMEMORY - if (s&RUN_BUSY_BIT) - write_status_sm("Running"); - else - write_status_sm("Stopped"); -#endif -#ifdef VERBOSE - printf("status %04x\n",s); -#endif - -/* if (s==0x62001) - exit(-1);*/ - return s; -} - - -// State Machine - -int startStateMachine(){ - -//#ifdef VERBOSE - cprintf(GREEN,"*******Starting State Machine*******\n"); - cprintf(GREEN,"Number of frames to acquire:%lld\n", (long long int)setFrames(-1)); -//#endif - cleanFifo(); - // fifoReset(); - - bus_w16(CONTROL_REG, START_ACQ_BIT | START_EXPOSURE_BIT); - bus_w16(CONTROL_REG, 0x0); - printf("statusreg=%08x\n",bus_r(STATUS_REG)); - return OK; -} - - - - -int stopStateMachine(){ - -//#ifdef VERBOSE - cprintf(BG_RED,"*******Stopping State Machine*******\n"); -//#endif - bus_w16(CONTROL_REG, STOP_ACQ_BIT); - bus_w16(CONTROL_REG, 0x0); - usleep(500); - // if (!runBusy()) - if(!(bus_r(STATUS_REG)&RUNMACHINE_BUSY_BIT)) - return OK; - else - return FAIL; -} - - -int startReadOut(){ - u_int32_t status; -#ifdef VERBOSE - printf("Starting State Machine Readout\n"); -#endif - status=bus_r(STATUS_REG)&RUN_BUSY_BIT; -#ifdef DEBUG - printf("State machine status is %08x\n",bus_r(STATUS_REG)); -#endif - bus_w16(CONTROL_REG, START_ACQ_BIT |START_READOUT_BIT); // start readout - bus_w16(CONTROL_REG, 0x0); - return OK; -} - - -// fifo routines - -u_int32_t fifoReset(void) { - return -1; -} - - -u_int32_t setNBits(u_int32_t n) { - return -1; -} - -u_int32_t getNBits(){ - return -1; -} - - -u_int32_t fifoReadCounter(int fifonum){ - return -1; -} - -u_int32_t fifoReadStatus() -{ - // reads from the global status register - - return bus_r(STATUS_REG)&(SOME_FIFO_FULL_BIT | ALL_FIFO_EMPTY_BIT); -} - -u_int32_t fifo_full(void) -{ - // checks fifo empty flag returns 1 if fifo is empty - // otherwise 0 - return bus_r(STATUS_REG)&SOME_FIFO_FULL_BIT; -} - - -void waitForAcquisitionFinish(){ - volatile u_int32_t t = bus_r(LOOK_AT_ME_REG); -#ifdef VERBOSE - printf("lookatmereg=x%x\n",t); -#endif - while((t&0x1)==0) { - if (runBusy() == 0) { - t = bus_r(LOOK_AT_ME_REG); - if ((t&0x1)==0) { -#ifdef VERBOSE - printf("no frame found - exiting "); - printf("%08x %08x\n", runState(), bus_r(LOOK_AT_ME_REG)); -#endif - return; - } else { -#ifdef VERBOSE - printf("no frame found %x status %x\n", bus_r(LOOK_AT_ME_REG),runState()); -#endif - break; - } - } - - t = bus_r(LOOK_AT_ME_REG); - } -} - - - - -u_int32_t* decode_data(int *datain) -{ - u_int32_t *dataout; - // const char one=1; - const int bytesize=8; - char *ptr=(char*)datain; - //int nbits=dynamicRange; - int ipos=0, ichan=0;; - //int nch, boff=0; - int ibyte;//, ibit; - char iptr; - -#ifdef VERBOSE - printf("Decoding data for DR %d\n",dynamicRange); -#endif - dataout=malloc(nChans*nChips*nModX*4); - ichan=0; - switch (dynamicRange) { - case 1: - for (ibyte=0; ibyte>(ipos))&0x1; - ichan++; - } - } - break; - case 4: - for (ibyte=0; ibyte>(ipos*4))&0xf; - ichan++; - } - } - break; - case 8: - for (ichan=0; ichan>(23-i))&0x1)< -#include -#include -#include -#include -#include -#include -//#include -#include -#include -#include -#include -#include -#include - - -int mapCSP0(void); - -u_int16_t bus_r16(u_int32_t offset); -u_int16_t bus_w16(u_int32_t offset, u_int16_t data);//aldos function -u_int32_t bus_w(u_int32_t offset, u_int32_t data); -u_int32_t bus_r(u_int32_t offset); - -void setMasterSlaveConfiguration(); -int setPhaseShiftOnce(); -int setPhaseShift(int numphaseshift); -int cleanFifo(); -int setDAQRegister(); - -u_int32_t putout(char *s, int modnum); -u_int32_t readin(int modnum); -u_int32_t setClockDivider(int d); -u_int32_t getClockDivider(); -u_int32_t setSetLength(int d); -u_int32_t getSetLength(); -u_int32_t setWaitStates(int d); -u_int32_t getWaitStates(); -u_int32_t setTotClockDivider(int d); -u_int32_t getTotClockDivider(); -u_int32_t setTotDutyCycle(int d); -u_int32_t getTotDutyCycle(); - -u_int32_t setExtSignal(enum externalSignalFlag mode); -int getExtSignal(); - -u_int32_t setFPGASignal(enum externalSignalFlag mode); -int getFPGASignal(); - -int setTiming(int t); - - -int setConfigurationRegister(int d); -int setToT(int d); -int setContinousReadOut(int d); -int startReceiver(int d); - -int setDACRegister(int idac, int val, int imod); - -int getTemperature(int tempSensor,int imod); -int initHighVoltage(int val,int imod); -int initConfGain(int isettings,int val,int imod); - -int setADC(int adc); -int configureMAC(int ipad, long long int macad, long long int detectormacadd, int detipad, int ival, int udpport); -int getAdcConfigured(); - - -u_int64_t getDetectorNumber(); -u_int32_t getFirmwareVersion(); -u_int32_t getFirmwareSVNVersion(); -int testFifos(void); -u_int32_t testFpga(void); -int testBus(void); -int setDigitalTestBit(int ival); - -int64_t set64BitReg(int64_t value, int aLSB, int aMSB); -int64_t get64BitReg(int aLSB, int aMSB); - -int64_t setFrames(int64_t value); -int64_t getFrames(); - -int64_t setExposureTime(int64_t value); -int64_t getExposureTime(); - -int64_t setGates(int64_t value); -int64_t getGates(); - -int64_t setDelay(int64_t value); -int64_t getDelay(); - -int64_t setPeriod(int64_t value); -int64_t getPeriod(); - -int64_t setTrains(int64_t value); -int64_t getTrains(); - -int64_t setProbes(int64_t value); -int64_t getProbes(); - -int64_t getProgress(); -int64_t setProgress(); - -int64_t getActualTime(); -int64_t getMeasurementTime(); - - -u_int32_t runBusy(void); -u_int32_t runState(void); -u_int32_t dataPresent(void); - - -int startStateMachine(); -int stopStateMachine(); -int startReadOut(); -u_int32_t fifoReset(void); -u_int32_t fifoReadCounter(int fifonum); -u_int32_t fifoReadStatus(); - - -u_int32_t fifo_full(void); - - -void waitForAcquisitionFinish(); - -u_int32_t* decode_data(int* datain); -//u_int32_t move_data(u_int64_t* datain, u_int64_t* dataout); -int setDynamicRange(int dr); -int getDynamicRange(); -int getNModBoard(); -int setNMod(int n); -int setStoreInRAM(int b); - - - - -int setMaster(int f); -int setSynchronization(int s); - -int loadImage(int index, short int ImageVals[]); -int readCounterBlock(int startACQ, short int CounterVals[]); -int resetCounterBlock(int startACQ); - -int calibratePedestal(int frames); - - - -/* - -u_int32_t setNBits(u_int32_t); -u_int32_t getNBits(); -*/ - -/* -//move to mcb_funcs? - -int readOutChan(int *val); -u_int32_t getModuleNumber(int modnum); -int testShiftIn(int imod); -int testShiftOut(int imod); -int testShiftStSel(int imod); -int testDataInOut(int num, int imod); -int testExtPulse(int imod); -int testExtPulseMux(int imod, int ow); -int testDataInOutMux(int imod, int ow, int num); -int testOutMux(int imod); -int testFpgaMux(int imod); -int calibration_sensor(int num, int *values, int *dacs) ; -int calibration_chip(int num, int *values, int *dacs); -*/ - - -#endif diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt b/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt deleted file mode 100644 index 54d150ceb..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfo.txt +++ /dev/null @@ -1,9 +0,0 @@ -Path: slsDetectorsPackage/slsDetectorSoftware/gotthardDetectorServer -URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git -Repsitory UUID: 2f11681d3f2bd2e437cd23fa28dc618dbbd39c68 -Revision: 247 -Branch: 4.0.1-rc -Last Changed Author: Dhanya_Thattil -Last Changed Rev: 4057 -Last Changed Date: 2019-02-01 11:47:52.000000002 +0100 ./firmware_funcs.c diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h b/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h deleted file mode 100644 index 0d87c914e..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthard.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git" -#define GITREPUUID "2f11681d3f2bd2e437cd23fa28dc618dbbd39c68" -#define GITAUTH "Dhanya_Thattil" -#define GITREV 0x4057 -#define GITDATE 0x20190201 -#define GITBRANCH "4.0.1-rc" diff --git a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthardTmp.h b/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthardTmp.h deleted file mode 100644 index dfd9bb246..000000000 --- a/slsDetectorSoftware/gotthardDetectorServer/gitInfoGotthardTmp.h +++ /dev/null @@ -1,6 +0,0 @@ -#define GITURL "" -#define GITREPUUID "" -#define GITAUTH "" -#define GITREV "" -#define GITDATE "" -#define GITBRANCH "" diff --git a/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServer_virtual b/slsDetectorSoftware/gotthardDetectorServer/gotthardDetectorServer_virtual deleted file mode 100755 index 87332b4e1dda1dc6ce24bf185400d224ae2bb83d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104160 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

o7U0xR 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≀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 VMmSjO4M#fhho?3z-2FL&`#-T&yH@}J diff --git a/settingsdir/eiger/standard/6400eV/noise.sn032 b/settingsdir/eiger/standard/6400eV/noise.sn032 deleted file mode 100644 index 26ec9290c2de1f71b81cdae5cac55c3531cab01e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1048648 zcmZ73S(2VvlN8{Tl=C3{-ORHmb9et$%1Ki7K<5UyVFfGzt}zzE0$2o zGtw;VoD(O)!^7jepQ_Hz&d&bV&Dq(1x<5Pn?-yrh|MSb)+5hSJzn!0*{nwiFf9d)k z5Btwuo&WdM+1cmIv$Oy4@$Br6AI{F6i}TNFsr}2^zpMR4&EI2<&maH4t+`{r)&8vZ z$C|(Q-O7tZaS&$4`+4N$C*C(>hB-a^sXN6@c3~Nr=A=!c*BQd{Z}=yW;$Fv+~MSp ze(N{K88&Xt`e5S!P7Mc!ubQyLTFpQl&erK^#X}wS#p9!I^~H`K&Z)r?e~M#I2l~O( z7att;8613Z+}8%f%!;uTqTe9bqrZy&b;4Tf@bASCjKzgX5j*<8&7L zZpL4{d$@YU{~y*qA7?tbTTfQ^<423s;K}vo|4=hax$v3aF4vzA#Yq*)Kb87PGCoZ*dx96MYFz{9*HQb!- zVd+tA_v+IhcNkV&_{?FJ?%8Vddw1fz4>i?!ta%T3i}BmDK37joIP%oP=l|yqPn_J; z#!-*>SyMAJck4q9Sh%ex=k3h_NB3gw8J@Q_^Yf>!JnzKceN7#+6MJ6sPSzhj@Z_0` zw+(l7@%z)77=6=7tg~3}LaZ98>7UP?7|QS}sjs!uA{EjxJwnYUpvZGk<4)`m`6%uZB4Ny3;eC77M^CHHXN90(qR4a$*1?~xKrD2hFo{B^-2eC0JarZJT@cva{TepS&rUt zhb0dOd$q-H)sOmc`Sd9de>nV13{1V^s*ZTL`fwHl+bm&tC#g+?;qb}Dhi?2AHMpsL zuXzLTXrSNW$)k;$>d3dpZTjT!S^51gSmEhQp4xET;fE{JGdw;$$+JKGmgSojzT$DE z8*ckX)G;%9naeQ6rS@KfDOW5V-SNYjX7)5t3;*?R#Y6tXu{TTF&`Rw37aM~ z)RAWfV)TO#E@IzmG^SH(&Tz%Ru+j~G-!Nwp=-Q-qggx*_`o#kAt`z zdsukGa5r7V_=BNVYI>uOy&lZWzhQSZxqFY|_Io%j@cLY{>M1q(>Q8&KRWCJf#hmVI zaB&c4?@iES-v<8b!@{4YemB&bHfsA*bGmH4>sc(!)NX6E#({?X=B^Hm@u7!&decmf zKGb&J?<5R;%o6(ig%_@YI?>2wmpui!Qz*v7npR~JApy7>EVv{>WT3Uz?17e;lgOfho?CBl z{8-zcSzpy?#lPRHZhvx?3&))mK8>7lan^(RsV`q|{Lbp{9oVZ+cX9r^#>`UFue|k1 z2Ytci_YTxaO|JT|=&Fu8Z)R^=j{Irto%qJ_qQ%~o`tteUS~m~={hq;J4ju6HCdJ5u zgO9rM)yBnpuotU;@n4Qr&-$2FV#bjlPHJj7%k^I2=@p(BwQ))fCa(JS4y<_N1s~Ua z2eidmu6x+<-fC)^o42d>bm318_IlEfUSWvCOCRdUO--IYy?y+}+D|(x_PC0hKpY8;V`|9+uoP=@>u&^gG)Ox;$fyHmiGD=o> znRlwzw8sxmnDFVTuf3(s#l1Mc4_27&;L!{RTB)&jV{Xo=i8l|qYJ1mo7K?+ud}lFM z{N-HN)Ux*u?Def*vxJQoj%vzf{5Lgz8m6WWe7tD3`O;GiUa-9(a}?ujpW0RJuI4@9 zqJMAYvZkIq@o>e_k)P3*R;l3*Q;+)B8}53;S3C?c3=ZAgGrskxpVagOLoec;^@Nk( z5WT784u3UH`%@P-pIW%-jSqMCYI@uHcE;Q4EQSv9#L4q}l$zRjswqe8IMRzxO|zyA zp3H9`484d~M=!J&uQze#>de&Oo4#`S#n1SnMxV`14fWj1gQ*t3+?(3;9Y*TIcf7>w%j|xwsY^E|moGKv^(Mym;cN~tXof3Y z-QmffniyKpK>xVF))Oo^r*qq!_{Yyo<>?K7eD>b(mw#D<3o|vp%X`maaDoBfnclF( z&>TnidhzY-t*8leZ*AJ~f2fIvtsg#n{NxOqHtOmJSG8!%kIVV7moFEFdNeRw@%#Pe z$3b1Odq4DWhHurAdNBFqsfDK%hBr>z+Zvx3c3+bV2XB_zbXYAp_%V9zO?U^Z_0s)j zhpSw8_~G(a8*jDE4QKV8_g=^2p+2?5&`%$Furjsu#Zp@wzj|`@ha*1ByHPK-&3$jl z4EfDKe`;>V>E54M8oSerI=G164Dsiqp*=ijdwAk-g{5!*E_sKk;W`b)<2o$-afS<% z?r?G#ZSXQ9dHRv#48!*cb8~U_*4)Wc*B(E9eLA1l%+~MxO$|rf^`eG7EL`CKsJSzD zema>gPB5pldzP9zeYuB&&)$u@VdJhIUhZjtkND-##$0g52X8v_r6&HqMi=?+R8j2rtZ~Jlb)&V`%qIqtEpf7a9&=z$J^g#_xtI0OnYdJ-nUgMLiCjNYQ@Z+hTnfueXGb}l9yvd#2;iG@CYFo`qJvymBJ-YqL*;zgB z0cZ8@YW%;|Qd7sBKbTB?cz;zhM?N+6LJPkgFuYT_eA69ITA8yPnmyIjh9%ZrYPkD* zt-Q~v?fu}%V2lHfY;RF-a$tz1wR@|2Fx9iauh9n= zZ`*8OFGn1%>WhXdQQ!qIC$=?&bU}%;%Q~L z!I!6oy5q#R-udM7vDL-T9o@%WO?moK*9@H1(|c-uFWvLQ<)?Ly{pP${a$%W|?_3Qr zoBwKiD`x7AiP4|$$1KNHjy~P<$&oK^Z+_pzLw(|K!x0a$xa(Uy{_yPO!Mm=>y{(Do zhp(Ra)c9f0zKjLsw-`l|*r+owZlc$E>>B{u8c&pi{Jx=yCFcf&wB?~lG_DQ0o$o_=(LlNw%DF>1iUOTJmD^;q+EcI9B_fFF3lH9M|bf3p1``S;gXuWi<)I_twnG-LExy zev@c~gZ|dLc%0C2vfZ%1!xn2SA*&NzsJWd`o})U;Pq-(ql+Cr;gATlc--A@8B4 zM|#oxrY1(--q5rXlN!!urU!TWaOO{qk0$Q%83*;p#r@uoUN;LE{La3E&E`Y*a`Xw` zy%qkC8jbXAb@x&;_Z+5Qd+~IFySb>Jn*P-m!{{PLtZ!>^-X|^Sv_7rw<>-Oovv+8v zQEJmkJfB*=p@NWsY4$;VB5n@%{vlDb3Nc7MonvKV$^}TI~Zcbr-m21tHDu=PVBZeEPAOe zhEJS4e&1bc_^34#M;CgF_YP854iGo#!3Euo7BFn ziKDlBK3uJ0nL5s?nYViSU%h=>V)X&foayGR!sRn#`R>dQukoiJT(cJIt;zL9Qrr9B zd#i2UW(Y?ftv6HO-eV1}-n>P9F+BA{8#;Zg(Zqi53}^2Q#`l_hGtjrad}o~D%e}AR z`C6M^>bcVgZgABwXWYcQ9}a(NV)Ud>I;ZxdMr)=f{_4oz44l0kwP4|IFNUU!-we#v z9K_?9n!EQJeCEzyYUTppA6&7p>7hOi_fEV0*@Jp~`WQET$&srDP1J$E{>18=J}`W* zaGYT=`MAo_AIK)K4HJor$&njOH_b}8*%^TAr z3~}C=yUj%3xTb~+96dcAs~r3Ba_0@v0VYm3(2kj(*u67%slmZd4nFR2@J8usX5JqB z)OCJr@b7psmaAfocZ$Wn@0L!;^m6L83*;O%nZb-0nfK7&RGvItu#}A zZ^O*^t>Uflyyev7(@yR6AWkhc;cO0m2l-MnS3J~WFrD>fuOGF{L(k4MPYs@TCf1!e z7}m{7@9yzP%^64Q^d4Wl-fQgz`yUViK4u75f)zwN21MIXHAOP5nU z@DQ&KgDdv3hJ!P|JUxr$*Q@hQ&F>>jSZu#Tc+pWG{Cbcxjn#n-&n#%Qp7`l4Uyk}r z53uwto>r;Bz(K$2irF_P5690nwPBl?cxSPER$TQahi>XPd#mvDkCS@#;`HH+FFZ4Z zCl{tTxp*->qy~TH><$(a&xVhevt0Gn@fOy5GbcXIH$uBlIR zSXMmrW_7Q&9`V72F1VNt3|PBYUmi^QiZw^R{m!VbPk7?2?l&*ke6Yna_sre&qJ+#&2Q=eEd%X1csm$}ICZ!5nVsp;R|+e=OC>hCvi`q4u#uwc+byuOx4C+A^!U-+o2 zKYfXXB@WJdr<-@Co*MKM<6Ym@_{C2LI5_%N_+fgBYOgQ(-jO@H!-a>3JpAzDf30~N zxDLna9{w=#P+MQ}HcR*7VXCVpF8W*jbZ-u{Gt<3Ec>2Q03QJA*(}X^kHGSZquDkJ5 z3mI6T~MPB_qTJ*f>}Ejql^KG(#Hfp0HHJ#SOYc;KtI)XWU_Z#DNcNevI& z)mVS<)W(%wv^9S<#H(vHAG)}=hiR3&_n;PoufJ)cCSBEFZ#DJxCzm#2#n{9CRD%ys zU-C9neDJ1+TIMca9DZgs&T??PtGO5N+w|K8TOMrlQV$=o-YN~nz`#jO8i}Wcxwu;| zd>?B1kf)c_yshcxytj`Jo@(MH##vu-{AR(zYaHd^ua^7N%o{(w-~$J@y?6ZN>)EP@ zan}<}`EY-!;UacA>B9`=-~vzm)YO~SaQI>E9*+Lx=GfE5z24M!X8NW%oc&g~SA*$K z{nYkO=mdvfzx>Yf-Qi-z0|(mZALrEQ0T;*d*Pnjn^5FpgV@*7cz7aj(^@o}mXS0w4 z4-b9Wza3}#j*Ggu!NTjZrmnY`+H_SLh8kk6a(zGgRZoukxXZIwpC1RS@4!s;FDErR z;j{NA&-+wQ4R^TN>yw7+Th+#g24<&6zg=R*q^4h(v=n169-qxx3~s66fg4_8#rWf2 zzxw%BbMH?r`_vY%hFR@>sDYQW-WcC=jlOKUxpT(ZAI$YLp86L94~}~N@b;%aF);SM zEdH^+)aaomd^1r)JYCHIf7maz^`i$SPn>Hscu5iWTBF+qP zfJYl#@mEL9)bwRl&zlhMUC~W#b;YyO`fB2C<%f-r)jQff9C&!)WTnmC9DL{XA|DU6 z#}P(qa^;CPD`&jio2CAlcPq{wJ}ex^lOAlnE*HPeM2<5KV)^xVaPm zGdOY>pH*F);flu-2HxV~I-8Zd)pIYGnU~sn5)X?eV%33T_4eeshvgmUm(Mx1Kh(tD z*I}%HFM;1{#4VCdS@W*@H8(mSG8g2$t- zry7oGI?H#aFMPP(fjoNVFy9s2VY>fPbYhzxS>${OrZiWV6B*=hSe)VLZG+ zHRz$HvzXPF>wI5>vDu4PZ(KK1D?E9)=#{Q|mrFm~+`+Jll}8V6T7GKkior>oTI<`l z`B?LAVd4T8M`tzlV4vE)H?`oywyH@BXBgw?UE(fg@$k%BO||*)^H%V4=7%+1yjd}D z`K-?RwVIK6!oc4u-^}5qhO=Dv`hsD`blLpX#evRxg6&RksqyHbdjnG}{^HEeT=@0kjmm?q zo;!M)8;xjU^?kV$!{ES!t8Z^W?`D+Rbfb+sXINHv{Hei$gQFT^>5h|`%UK;9^<{qe zeXC7xnwY1R#{6VB=ICZ102-Hn@m#BUX6zi*r#sqxdnpF0@1&=!_{Q}fN^`5$WjVCh>t^X72% z=Zq5^Z^r!nrREMVe|qruSd;5+^Xm5J+| z^bHpee))3UrzTGv4)f`8Gc$jEneS?wEkBb-A2IUfT5-Y;pJ}NtrXGBJ?DYr7o<@7y zV!R=k?%;}buP^h#p9WuQ_~^~d^sBD38QIIH5!}639QSXEd%DBK-&sD+dfqJ6hlf*Y z@bt+KcfW=D!*}zc5w7xJiFfCW*R;`xJiXu7*1sHfUX!P$Sl`7%4F*hSJ*4)z2J5z_ zK1@C9Gd1@x`C!V$as0$HceH>@m(*a2cc*8jzWB|>J)XF!d0AU6G3J(qjgsnuy!CG_E*IYd-ie z`Q@eN`+&no3;3|a>4gusmzuuq&6R(8n-k90HF;{mhc)fsyAy{ey%=p$!^7-gc`s_| z8-_aSiGk;A-gq+n#eS^eV8;I7*wYR6r?GsMk1r~7^{rj@$t zr-rlGy=OjifU~~Uv4;;27d<tZ z!BWFPoVT%g!orCr@b&I~Z&9xPQiCtfnFcx5eN*!2gFh|JX5R<>#HocB4A``_-qhf; z)Wph#i6f(vx^n5_&bLG#eZi3jODrG0H1RFj>yN>czj|VEdo4(A8HhjbL zZyX=at8E6pCs_7);p@*F;LGuD@RMtP;_UTEBlkF1oyScqpSLre^hzszr-t7&6RV!y z^~ev4uIjnx6QiD0J`K#>omg?=)zY86e)#$1P6KD(3@km4i@NyJjV5ZigF#muQ-e?Q zoiDlw61se&an0_=s_2F^o6%KtVj3q%-9`n_=>gHzc_XE%TJ5dcUFrId#6?y zwAei4rbdrxh=+NIHB0@|Wm?1b7Tn2!wfDcXcR?qsI9%n~k0Z_P#c&X*syL+tR;+{Tm#ks>pFSNv494_O&7#RA~m-_3AX3p+$ zGcTC-aP9S;!|>I!JQ~=irjA+Qr4Ik{`0+~(f3fPQsRq5=J9{(u=UDY2A0KOKa-8*$ z8m;B8zC8^0R%g5(YUbgrXZ*!X6FuQz7Wh5YXwA$}?sCQjzPaOryBK|&g}pj=HSsX< z7#~=hKMtvhSBoaz%iaVoo2|U{XTQF2r>%VZ)Xc#Q^~T)eDqmmjaGfT4amQfLM~&3< zrw4m^R=*YEVB%+=8ozg--s;1ljk>tp*UW_8>fvEk1K#Ijl_Q=;u=ZZ9IHe{}96UWU zwfz>tl82K$9J68GjvSid=brYk@xV>YMNJ+&IJm(yBYE;~YB0q(i<1kBe;jE9mtM4> zxpy(n*3`s^rK33gnTLBd<>06WE@IT2f8U`yZxDZmhgiAz+v7rGyv;=~d*j{)40*7f z)u%5m`W0)>_!(Z}?e&2hE%cynYI^jW@JkKGVpnIitvJfX`>7@tkJQ|m9p7)YmzrMH zoo?{;xOv%ob7mt~P39g~@4}z`huX9G6GI8JYG14e3c zVeY+%l}i&fQ}cb{p%-~Hf~8L}u<6IY-tnT1v)+g4jJvbi&hp@1*Wju}Kl+Hp37$7J zEPVI-0|OqzN3J~i-ZX46dV&uFXLxeFQFG&`mzd@AyO&Q_b@{w0b;Mic&|ZD~y&3)C zpgxRo@fO`Jj$a%uG{Z{{gC~~;YV6*g4<{U$_X~$sOpoIAGJg6<4es{t@L}e-d_46A zN9_FeFqs^hn4x&}@Jdabp5!mrJ>TxEe0tS`8R)@EA3m#D!%)j=mhSMAOGEXodV|R} zKRu>~@7|OA%?G9$aOvngTs84={>z%a;mXI~9uNCz1y>$E`n{>C>kQjWeRuNAP;GIk z;V9pod8jj7tM4&2_+sVV*7Q5x;=IwTnwl`=@zcp$)vLM5d#=%0FYA?#a`CgKrg!z^ z&}s9M>yHnH`{~Q)tY4Vw>W{(I18uKsshO1;unYul8r{?|Pp)Q`{yoJ=@xOe7fYVgC9cUQyJ9tT|T!ci`tS<{a8^5mcD z;yyKX#Njp#V90^PC_dl%!*r#IgapFFYS{R8;i<-Sga<>ce0=bL|6ZdTt<*}*S&n%9`ptmlEZ6%GuO=<<5HD6;fBN#@ z2C&wz-aggD%2f|nT*Tp`4qkMVM??75)cBZuICAyR2anHr*y$b??rQl??cwgO=C5s#NUf8y0hO&(3eS@FPOSm|DG^uWm~XEDz5)SM<}B!*t_Xsw=@`(wrb zwT72GXR&y!_G(T$Z&C~#rVd z)Wj8MrY;3;L^4a(E6 z-?aT6!}ph(ZxsG@O&lD2@RYBHnsnmBiLPSd+}8FE)RyD#qGoPt=GfCzJsQ(Z9T<9H zczbWDsV7c84tj*gkFQ)SK6{JeX^S6D3?F&!#K|{necIERMtnG!vsFENJmIJ%UXSo# z(SRoWa?FSMMqsX<8R~snxc6Rg|FtIH9cI+{DoJYt1~xxnp|Yw}mr&Sa6tF zei;1EHQx;%{`%sFffwFtiB}89y`9rJ)pKA*ZwKW0GR)bPgFJG`jDROkD#S0}Zr8XofbeCJQK)M&3Cb;LXzws$CY@6L?r zHQnXV&D)!Pu-I))En48kM;rC{o#pHfu3q$XSM%QIw-=|5-`T~RqgpuW zfw>=Ncg&e?^tXq<8SRa`PYrKehvEHrbM)E#)Dee|p7iIfxc46LwU>vhJ$+tl>Zy+> z>}jG;xv=4FPBdV0~htAUf5^24RSIgi6QnJqk~7A|7t;JN{@6LKv;~x(i;QL&|AC_7$^r*(ZYuKsb0pASFU5@Bd5Bv|u=jQ`dQK!X5@4zSdHsxqGvKrM9zJoN*i< z_u~BF<4znrdpLe{LxH2zA$MA(|pVd zr*U)^0|zJk)YXsQP`SQ6HE7t!t_QVJ z^WFF+eFxJCp8Ytftrn9%zVP(M)Kgb|*z)nlmtP;a(8gVAV&#d0J8bpn%&(Ssb5c)^ z_rwPm9*opZXD{}?rapeo>g#E`(#si+nqqMnKmOHs=Y3dl;b*=tT;=%Q~T?Q;0Un5`AI7&WJvI?OkYkD0p@yI%OGpFO^tN4m!eu05{!i1YpW z&4TUS(n~B{b<9C6IjN~BmtT*xrK=czJbaTR!#BlV5@C)2LpHd*yGN`@Y5GsKy_zNejjrvd$N*Q2-S{i~6h`sU^?HC*6-tlipPzXIEfd>{C5Lg+^K^{YTgkp zo1r@R?3-81T&^wbJ~46{IKy+-#f!cyx!%y*9&|;G3vv?)!co* z>s9ZtyaQU`qOP+!vE|B9&mA0p?)c@YKRxi!8xGz9Oz&Sl%-0$n@x(#D;!=Yr9+r8j zhx2&x?oz)#KGdyS{mJbIt>|yiMC^a0{=Xy6scX~P9i(60jFqrqM25dd8 zhC1SDh7bPCH?cf=h*2xGy%TX}NoP3r-ix|;nxVecHXHfg$xV&6dVQ|((K0nU%Jn_T zbH+_gSbBxSr>1&lC05kDo(1YGK zZ(PhA4_w8kCRR=J#pi1+HU5t^{mZrL$-KqG;e%yW*B!37(?X0lz(*^5hhwF&9K9{x z%u>To4;MB1;3Eg7cxT$G4}blvk70|GgL7(nm?rdekHfgb-03{j@($Ed0}t`9$63B!7MH`XZ+mt0ryqN|rbavUU|ZcU z&Y8xr#mN(=AMe38YLAON+&f$1H zvl35})a2p2xjc1m9_r9mEu8SwBP@Tb?H-oz7H4zBH#L81ijn6I?|tLWYKW0*g}d3{ zj-Ond;JnnP+j>oXa&X5{-}u|hQ_mdCiQk`o)r93wZGEa?FCLy6&b~eIxTFSiJgxF( z>Oa)X(_9(fjNWp*E&TLIL;Tb*JFD96^npWa_}crnak;CBqZ>}+rIxz-Rd4wGc*?QD zHv?GTk29Y<`dd>oEAepDmxI4~;!RI^jCT6-`zaqcF{z1jr>D!B8t|;*=z*JA&|rMk z-kDDwz2XfU2E)&NYW(8l<=E4Y4-fY=f+Nq2aTl+@^-Dj!&_J$uE5F#A8qV@z>H{zL z%skcAxA^_0z)MXGOm}#xOAj3Mq#u|#TIDhC6OV5-akN(FR5RbY9Qd&P7Rk|fYIwtS z4YeNeXFTYIMbA7_TK8gEiriN%^QI04LQ?=sf_~-E^BJwDBkLf zw^;e~a@ISp@XdkVe150JrUnxyeC4X;PMkUTX76kImdB>O-u0&zF7Wjx)}7jXFs;rP zwY@Vra$)kR%cn;^eBh<_P{Roq-?-KMu4^#Vw4T>)YhvZ=O&pzYvR4Zp?rNHgSbOup zb-cyHrG-2>e0br?pW5aj=Ie1b2S$JTir>6o$fZeYYCAvG_-H0)`1)AS@KV#Wd)(o{ zmV<-2^26DD)lW?gJ>llbCgRJf_h;kRev)PJnO+HapYb@|PT)@Ew&@4U7* zp>KZQj5_u(FKT81lOGmb9G&&+ZhWjb_-Z_iH`@4$ZX-jN>Ez}H@1wA&ou>v3;(+QWs9FB?8AezmsJP+i)T^rJq_?8S<~TYuNbnGdG>^(Gz{yoWOnu=i~91JxvIB!tp-dh zjlA*G`uc@)S;JMFvo`=w9h_Gu-TMaAfTL%5x5rtodU&$aw=Nb}d8fLG<70a#_RlpM zs4rf=RZMEMfrpE__UetBd;RTObLZVS!-1_oxaQ$*zc*^X)%3mh;yyLn*wgBz=3Xu4 z+km&TcjIm0rmh^{7|qnzr*-e$J~jDzqIGKGaNdmcXb&4__YXB(aG;sJ8M?y>XFRTI za^Si5?fbK)CeKW0CuVO|J$HPmsV&D_op!4w&YiyCz))+y9o|T4u*8Z^E4x?Tq|7h z{Esz!j#!x_iBrgqn5ttX0Hb^a&YrorJg(Qk>+qy!%I!?YVX#n zkNM=9yBvEMaPc#Hb=}bs7Qa=FyS)os^_to#SF!MXufx)tIyBRZo>J4(X4dV`p7_+_ z$A?DKJl(^WFAg_x=QV$P%aNCwd-2Tg_-5x`JUla@1#Wc0cbd!L^G@`&|K8C*p1zg& z)VizDPd;pSYQb>tY~Fa7Gd~{QgZR|oKGpQ6E-ZU1o^WvS2IxFJ>3vySPx|nC;(Kvt zRS#$Uae&Ljih+k8P2Os1>SunnQ^NxWJa>5FqnGI_2Clf*8Z7zNamGRXdV(XK9(0he zzPBSsJ$E>}SHr!0Z&R)uvDSUJfxoYX>HF(C!F9}VaS1b`j*s8O&;?Ga2JnDS($JoAxb#a}KSa8tXf(aRm*dreGg-U+Q}dtTeDt;{?a9%gC9 zQyxsS!TGv|gSzf%Nk_Uk)7f{#rw2K>(+s9sa%hI5ICZCi*!!ATHE~v-7S?g1lU(uk zVy$rD;q8p8H8uH6-sUeKM=@47a`h(;9^?1MK2t+2bLHQf?%khiilcZl zkONPj^7Kq&b@53J7utw{3s1lDJ|8Q5cyM8Cro)BFFW;UvW~{z%gbsMA<$g1T1DjvI zc(uJbwcW|J;)^E^Fqt@hra!ST#qqhvQ7`WB^9{K(6Xx5JBOhn+S2eL_@?68sn;*w? zPp7wpji$SIwm$SJhNd{$(3%)Hfa#5>F&+GF zz*JKWx;m$(_kH*F>Z_3&&Sq!jpJsYu@@Vp2OAWS~aG1LKz%@0!z~Q5vcv|9PrH#DD znm%Bgl{;tac;n=Z$1vr&x589Up8fQ9H$45|D@LC8L?d-^^gGMvej3u1FEw%F09T** zj^psmMJ+t!`^IQYTl~ez*FR0vh6|4mp5GokoZaCq&J5(jUq9;b>0jT|WHZ}&JbfoP zcvt&2#KKn-C)if}`Ix;r>p_h9;bafr>KcNm>T@EhG6(dK#?#)`hInjsV z=`2odvGj768s0eAk2`IKtKM{!>rRdPn)uZ4!{3{LP1n@uH67qh3x0cedYxWyFKal_ zgdZ-<>F=$%TOKTXfBIJsHV*dsbhgi7H(hDyJ7ciDn?KZstM0xFzb`Oo>0Yi{!{Bpw zTZ4taH>|%8HFq$)^)EHG=!la)IC@gUpB%Lr930I+9t<_)!{tv6)X{=y?0sKi)L1T@ zX$waUb@lIVy{n76dw9d(w@=MXHX9iFa+X84VevC>&!0Sd-0;FjtTRrjdG|1BEM7nO z;bh()YX0<0Tk&f96MIvm37?g|;_UIK6Hexj3sZ~Xq9$%uyl9}lJ)dt1j$ZM14}U$t zhb`9qON}Oc-V%;_!OtCD_`tBrW2u?1c(a!yf86EeIIF|IdE$?=8nFDy*CQYP@?qmO zpYL#UrUh;JXru;wIkz?QTAmzxHSE>DuHlUr4E@P*2haTc?#Y48VB;&!tW%>M9&+4^ z6C>XY^hqc6^+$i-4UTg3G5zrH+o5MXXdq`=z%oxYthnQ+jy!(a$w>{iIKJ`6<)(&* zJ~k8BeB=LX_xhj<95tNx_V+u9gTBq4UTTT)?+|?a^rA;K;KLhFx-h-Np{E()O&|I6 zkcWF};^o7|PmDWU%tc*$G4}GE^(}Va%I;iFY*-kwWiVJ zT$+e;r?z*vw+TnBoyT9@^>^7lZgSyzL;CYR)e@@)Q`79-*^A{jEBP>SQ5PTlyg|Le z;g_$TvpVkO*t-{t$L?_V7WL(OrN`ZIhQlvMEgWe2 z{J+-ph9ACGy?a~o)%Ojks}7%4Ep=eZ6DQXU_0MqBC&N$d-U)Gm03@mqag$-AI#?J@GJuEfkSjRct z>yw#@H-Lv+8gBJ|;F>4i@YJJ;TJqe(9j|VG@}|o)mZJwT@ZtKswb#3ES&VzNuWRsO zJL5)IF*IQM*(z49_|)|8O^HtphI_s4t(75jvm#8 zgO6`RF8pzovu{{^IPTRu)%<(U^i)soeN8Ps-(tbT?Y+WE%?#x6(_`;=9ObA_6LsL}B{hC=@XT5)U2uf8{`O7aA(lq$uWPA^ zmp3lnkvcf(lSZ`GkJ!&O-vupk8hWQPBH+ogmvwZrdrf)I$TGdcj4DK-bQZr*S zP?!I_HeIZ#!KI@!OmAs#1TXgCSaEfyjvDIIA~k*K!G87jTZA*69&6*2?$w2Ra^6*hhzVmvJ%jb^Iyzu4sR^aMcJv?X(n;*6s zVri%!Smp$4bAYLDziBYw>rG8Du$=kf%XMB&IcmDM*XQuky?Ww(H?+fx!Ovm1!Jv=$ zy%lkA$3riSU#wNG7-w;Ca8L_Zdwwf^cx}EGE?#!8H{+-1K4>f6P7S3|&X4CJYen^=B6 zXY'pD2$HFM?DoA{TSSbS+LN1YrdMlK$!Z{?HcUe1piJ;cFM2Pbvx@yA2F_4L1a z%zJ&w7o$Jgo69)(hMZ|Qef6pazZ%|@RgU`f7?*DUpAO5pu1~xeeO=UGr8aG0smUh} zU)bWk(bVwO|K2vgJ$=Pmy%|39ryai@y$$beJT{xF`qYCh&pV)j_{|=cdE%_Tx-`5y z_H>nNg~j$B)+b)6;iP9c;_;)e`u?0#!w)`OS~%n2Pi-~)!AT9K@6WffcO#EKH9G2j zy{M-T`8es)M()i;0IS-Ik>>GcMmHyT>q-3=BJt*_wP0M?o*=)IYBwFx)dfJ>WdP@MtGbPjVOU&ETac_4M?;hQ~DG!_WKVqchFa zO%0}am{xV^Dwa<@`~99xbF;wJ9W1L_so|uivtI1=3QLZ+i~~%4iIdOZJHuqKe$+M( zz3yJ_-r#ypeXyBXPM>s-2frNHYVp~tJssS;lTQO@{lXGs=I-sq(9CL9|8@Z`(+KW+7UH7Tst**Cabq6msvuAwEk?$>u zg`s!ni<;VI2-BUjzFBH=^&&<+eBtVCn6KT_D>XfO12hq%7N2)5AC`6V7Ngd1)sb&C z3wyk2qDT3#?bTNoZ#-epS-d{(Yhw7lHN5#@ievC#(`y z=HD@I#aWH%=A0USw8O#gja8qU5#8l`3;NLu47hrRLnFPLzZy7BPj~QB+dDKTF*AL5 z7x3sNR}P~WQx7+F{9d|)ml{r1+PjDE&VSd^#)`XttKf@+r7!QteBql19cdy5hFNY# z>d3(pcbK%WHxoE;^+UJR)S>~--U&=^lg4IdoD+k3>vY<)XwopMUgFx9fc(vR8F@~NgqYH+Pg3|-8{%GAP39!=GSsh)Q) zX1&qEy*hqhoW1kM_U>@h2cP|WjixY8ad17=EMQrm$HLWYho0RKbpRiIh1NhEn14}=?19^Cuiy5TGFXpi(SDyIw1)CoSZ;Xj~ zsqy3Mj#jwAwpT|Fsflq`69+nMUcMQ%rkkGRsbeoLH5xgqDPG^Sb+#90zw^Fl{i#n& zwzD`IeyQQF|IJPRFzM|#8lN9EecOxGD_opTdxb9sA3ZpatN7I5E=Darck1trx&K_l z^QPur9Wm38kEXsOZ_gPwT25bQd2DZcd;N$t1Mzq=I=NFvzCAs0rImOXsmXKxR!i-! zW>$2={h~H*%MqWNI`DCT?;Xm~hkQO9=%B81YM*NI^bVV5n}c{5sli*$efMK$gmCM}G z7#}?KAdW8T?;Uw>u$}3Rj~qUE>fr$oPkVFVPYtFV+~v#ljqt%#mk&?;t;4wNe(xWq z?;M8tIGc-_%o(1&+Un6z-|*bYyQ$%hm%1=uey?rj(;rr9i<5I*^Ok5yXSP2+bJv@i zYWsJEsX6`Z@tMx}nhDPE_!%u=&{lu=%fo{<;`#KTp1R&2-fGDIR&(bpj>fR{I=yHt zhrVLPsi9ApYU3zIk9_W)YI5DwT7b{x%T>3Z+&ksPY(=EYGS6X z`Z&T^?&`^fqc8aMx~_>!O>HYuY0ldb#U}?Zs~YRU zYCD7d(BKAYI=cVPHLGY zE%bpaOlSCVcaH~NRz7vr;q$GncX`X#4-7svQxm5KOAXIy;w;|XekWJcEYukezI3~) z$-!&<^(v2F4zBXN3;p9D20y>IYQYx+!&`O7znQ3Ke_0dfY(DDH(b=l^{f7JP=hGux z`Qm7A7IfL~&2-i~&ajv3y*Tr4e&W`be%#FmH#Pj_T4|xjF6KajA*57pH&w%`4rT4SYFj=!ZUfysOD$YU2%044*u4 zc;oBd-BnG``ta|Z-wF8m!jY#gK7RA9smYOVW@2HAr;q-;72Msc4}bjj4sfBH99oPg zZqC+m^-bX=2li^p$8Ygw!t?A@Xrv3eBax5Yc4o4wUpoZ5Q9b@BSpvp+ug zuQf98cKGQo~a$&Gh9gAEq2W`Fd5?S*$s2HdeLuIqtrHy_p9s-HG!K^$rsjTr1w@ z;4D|HJ&e@61scGS>kWAGsmZ&lxqqwaN4|dH;$Vg6PMjWK51$^(r`z6@eQMLeSr0T~ z;>-jGz4OtDZ(7J@@Skh$;OI#oa_|{Wx}O%y#e3g|cp8|II6bJPN4RvsfzMeS6GuNe z-)b;$@*Sk+3|o$R@Z`|OS>O1;_J-i|i-9j+4oq6>O+A=;lPA_}ye;Qbo^s*fj{|&q z!5StXywt?f?V$#DedA>I__&v&2P+)!PmDVl45n2cJQ|sgKE;i*y#Ct5g*bGJ8??(Ytty?DLR&l`}d&iKk5kG&Bwd{#5u z3Rh3GR(E=i6CL;M;AR%;;40Sd6Abm23m^As1p`-lcnek-xG{P$`0}PDOm+CoT;Ap= zAC|kTni_h-g*I^YD;~D`<|Oa32FuyI$Jf30frC8v?tDXd&=j^DnEvQ;@pJe4|C5N{ z-^Xs$ffvm~KQ;YW`Q-XG^`a*;!H4Fsah?t|+k9cjS3{n;?l<2%lqZHR zYKVp73`4JUSC20>zQ<#)7aZi_rUxsG`QZCjQ&R&MdHST2y?gO|`ov2tebk#4>0S*v zdzbpa%`Ci0e69GKAxjOeTzRm~P)+eTvFXaEM|J3>9~_;e z^O`vQ=zIN&hXY?9INaCVGdyW5j+rC=>q~upx%_g}ho=vB)79R)Wn$dp;?2+pmOgOT z3$CjP4~{?n&B$KtzEyazt$Pcbm-jE8(L@ZL?d8DHAI;4ZKU(06m$TX8YV{4_4A(td z?=*8h)pEZ_aOCJs%-*)WJKE|`3_aEIz3D$ScQ`Qh^t0M(&}z8y;lO~cmYmeY=%3%J zcUaD}Fwd=G?WdC!_U5k_y!hqmKegfgcAUMZaWWTq^tOl3_6E%b7dnfvHy8St-Fi{i z{%g(5%}cI4E1lG&i(L2OhhY^XcN%zuOiexDHIB4`$0we)dKQNty`5>MCY;67hwq^V zPriGrK5&4GlYIJ!#lwASdSZHjvA2}&<>DiEe8kANs!z*rHQ0F3ZQrEt2rlj5sO^q! ztL2U1JDp+6fxBL&8+=^hn5%o-=tLtJ^klg2&EpPFU2hDIl`ih?YIx8@EwMPI#%G=| z#mY-fKkABe$8bo^dxf(+eCdNL?9{}=gO6uwW@*Kpj`s3sC0@QB;nG&F`f%jzP3qHZ zaPX&JZvj8N-Mf3L@r%8#iG#(=OzqRRchNJ=l+`rd}aub7QfW^7UK2d z&x~l|FEuk!k8gAPaqP`h?t4v)9<63;_It0e;fV8xS8BAJUk`GJ1M9x#UHwhX8__RJ z{iLQBt2>%H!|^8M`J)MrxYB~&V#MO5p0j*8xXWRWwbXEVt%j&JUXdQi_KXL+QASn#+_Q~ zyd8Vrl05I=rIwl)Ir!!^;%mJw0Hk0S^!H_763`(`xBgZSi7K+xvs3KW{}{Ip#-KHSE1{D?Q+ezpp*l z#B5gjRSQ3cms~Yrs|CXyzubKv&iwLmus2h@nDb2y4_djIeyFLD z+BATVk3V`{*7)={jBbDK&$}-E|8iZoJ9eJ8l7?aHqtz|h*@r;=ot;RQWG8zv6Zrhk zYU)bX4K$_!=J_Iv#UkG&2QEzY%4ZJL@^R+gULSCSbu;r-U&U7wA2S3?ZQk&MqX*Rk zTmNpx$GzI*syFcIbTb;!OAqQhJTY>rm#N9BUOBy4Vc{sg9P-cs7krx`n0n^SSFLcI zX>*S~EO~IF&*z8XrH5uzUEbiqdYaX9T8feTX0ULCwpYCwP;x3oG z-t6VX(G1Y{!%TiS{GMho(_ z<%zS}>#3T;_AW-eJ2T7=K6CFKHa&0VUQRXeRgXI8;+ut`26=pkHxr`{Sd2eiXc9-c z^c>f6i-F5uE*xo!%hRmB@rT3z`>ZL>=5yy>Psy8oD&L-)Aw!Bw1o zs0pUNHMer(Bez^P;};jP^&Kz%H+wUKQ5>Dj9$z_egoBrw&ByahE`HwM&(eyo{P65) z`flb9o?Ln;4^CEG;Ha0s+F$n)4nMs8Hv#?K!4l)`WhMqEe)6fo%9mc=_};_x3MX%3 z&0QSSD^4B#2JnFi#~rTX@rV2W*Q3`sx|c(~=7xsiKF;KTEw{Yx>!o-(tCAAaIs+2i1y$=7cM47r(HaP0M69qLanczyfs z{+x-|FTPfN{B@SEe0pEca4}!B_ZGj`zj^L&W_IPX-b@Z0-HE5+&75fs>t<%v-RGHH zc&SS)y=Wnx(X~E`7sv3u87+F39~UtELhJaZ?vJh`<8MoV|N@=Htm^6^V+HQ>$9{msPl zms>rs_%Qgt&R}`}edafaF7Dz6pH6CFVx0Lo`wsZu%x?n|qefi#;$voE+Ka>YX3jLl z4Hho;_<560ES>O%r!TnboqIWPsK5Sw;%5fk!G!T~CNE#u^87OM#$Qf#ImZPC?c7^$ zCa*s=dRH$_FrH@WQE3*~$59RC_l^hu zcsCQyYViGRRF}N``8umdPIt`|U$`*vU~!ZOXC_vk;KPH% z50;gNG;y}#ax)lm!KLeu89euWck~sXe)R}9dFU-K9X`$Ig0DN+aQMh64<8)lQ`^m& z0hn)Q{+?&f{KS}lxnZi;+xywOnS8L^sZkHrAfFig-K$S*{l>$)IJ1ieip9B-y>vkJEuxZd5}3^v2{rx`rH z>M?IPijkMDV&6RWG<-Lcv);nFnHc{5ZYBp@c=)Ot7LI9r+ly06a~clqUj~eB#1x=9`uak2K(GM%=-?hpFA0 z-$6ClTW=;8KJIR&HaXPbj(*POLaodhA2q4*?F?6ak_!gRpJzA22Nr#3K?C^w)T^gv z&YgI5!Bv+!eXpNqFua>5ao%aBXY$EoPVB|V2lr-t;EQV><%g#x++lf>3r9TENmF~8 zd6QQRj^;^C^$G`h<%bn#I*XOlJs)prC7*ZqH=}X$W=7=1_4`auX#Z_yM)|=}9}GqZ zF*woy9~{*Ko6({=#QS#%4|(VX_j#5MdV!xfKCoV9`o~u;HQ}a480jWP4!r!? zXMIxxJ^86kJREuB%pX3JON{Z)$O__<@%5ifa|nTuDNxEG6u)i-vJy_uzlc~qNs zn$rM>*SPB8r$%#KJ~?qx6H}A*X7KFs%#T*(b;k!+e)M7V!odpLUE2Ge_{;CDKH@94 zI4eKc>XYBx_zkAN8pNhpLwDMO!eX6d^3OQ#2qJp`omXl{&a=+ zJi`wzf7;+7FFoyPT)xc2 z+A}^d)PjTDG;pteHPnBYW=akksMA~Xf7`=s?qK2%moEJVIMW9Pe7Wer7oIuyCLR`z z`RPg8R=XG`rd+Vhl$dIl6DACPYViI%gRcfLW{4k6ywd;%{AP_A8>}D zUVm}nqYrc}h7Vu!fdcImao+;$S%!$F>EahvjcKPnHe_gjXT-DF`nH8Mnl>27R za^Pkz;w7gVV5$cm-)}RxbcQQdKVUa&?)h5r7TdhhN)G)oH!ria=AUkI-~*Sxe6+y@ z*PE3Srv1|_jridO+suja2LEQyGiSZ<`wE-kDYrPa!&Vo3{y5$YA6R-tOI*dN3pPJ> z>!Uw@V)#{uH+y&Z$|JA6d};r2d%0=)c}BPTE1zCDTh)9IgHJmqo(B3MpE~6h1G9O6 z=Uv^u&tUMu$-R9V^yW_Ou;t+0De^4Bwj^dcp^H z`oLsz{&V(qb~74^|8oYP&SqGgH+ABd!PG~2_%nAfkLI^&ZA;k2jO=<4k>W;_Kf!T#JvN_}^ygrX^q6=^-pJOdVF( zaOJ)k94o!Vw#N}?XT2+*x_u+Cs}nYVT-54(GkoIUUT%4DrG+;+nsM*+ycwS~gZp`g zzx?8?eC_oE7d=+DI%wjKA0F~ovv+T5qUX)zz=@yS>FHjaH~jS3o!t20gqyus-wk}< ztFyPb%lS0JQ5+nr-r}imIN6&Un&L-KvnfA+KI(?+J)P4X7ufR926r{!gE!MtaUW;* zFxY(I$Yl@bW^#I0gS_78t=?Z}W`e==F5mkZEI#)S;U`A_|D5qNhhkv3_a|2d zUrfDK3tW1OqdgOwu5!~hUV3Qn_Y|JLa>~!>1M_BLo!f?-S=FR$c23xEi@w2DnhnXHY zmsh;{2Af_yL-IcF&N(HKqK7clf!oa`_0VEn+td}wAVL(xV_Ba z-(&S=_Glsxf4SA`POa=_a^jKBV$~sDop^Y|6VA=51sA?BZ$={;TgCIEjU48;850Ma z4_@V?LEjur^hi8C#PH`!L;RVVyt`w#@KMu`8GL^7{q3<=6Kt63x|tY;Ge5e)t3PT| zhZ@RbX5I0@!TH_H`_1H_hkJeeZH9|Ge5#A)X$4EoV!zL-+ZnD^oV?~i{j7MnH25;} zyNC}>n>jT))8}Sl(?NgT=dV^6YENf*?fKxrU|Z$YBYQFGc1|a;>Q|%hpO1QQSF8KJ z1Mg}Of3xPryL@82nG?FSiql`3%7+VInyXLz%S_&zsWEK+v}ZIi2ljjz+-CH)r&Y7y zESH|Zh9xH)vF`Y*A0K_7V}8DS_3#x#-}vx%#?zioaQrUc3@sSsIKI+x0UuWUTi>rER4U?ZaQMY(8H^VnwapZ>+U)tS_k9##Sx%5*G ze)u`34PIuxZ@rrEf{lY2#O-FVX)d0xcy+?%=PZv{zbjT)?(q>X7Oq;Ht+azjEBd*I z>&-W6_MT_vl6GoQsxpJmy0G>ZAJPrl%bGWv_o$I5_aLr$Kz}&En1e_l&<<@v!o5FF*gA(X+jGGjTI} zt9Q73m@~Y3S3NXP$30g0)PNry@bUiV3`QEmF$?ba>65?w^!W4aW-w_YmIm(4i$8gq zBQp!jobV9`w_5Ok!QVUX&gz77GcnaH7gLXZ!LDvI08gA+@GVY0eq!XIDPQ-^wR^EY zX5P&kURF4GvDY#5$44A|d8@&_9Js>Z3y&`x+}+=dmTJbOn&?z+ImP*Q;ph{8_we-; zrti+4-p=yFP>-`b{Kc!+ofU6+`N6~;7x(n{?WAWM#li8;U#$H2`JU{*&%VvX%grAj zrXISA*B6{|Fh@Ari&f9_j2}(Bt4sd4$}iqM+?)MAQ=faixfx9SX!n;{zo-204_gdw zc)$$D%11spd|>uXsrepfvFhi~VCuh>pL~2^($xLUKF`AJJE*7p{JVBDdwSwWZ};%b zuYCC3OinAV%sn0X`aZ2JE#R>?Gg{_n7SgVMi+TU>!N(s=dGyR)edfi_W z?MzPh@bFU)KJvgcYu?;BtEb-%KCobWH^1KL28-6t^fxc+z=yxH6-T~uh}Q=-;aQ#X zGCGUr`(XxG{LSJXmYU6>9O7_MGwh#dFlfpj7y0b1@lw;x;w+Zo1w(Co^~#^w_%!>; zVShNjpScsG27Il057(ZKFz`r2Z{`~3`sj=w?)t<>44!z^BYt?vi=!Ct>Z94a#~#N2 z%y2L>KW4D`if8&EULClI&j%iE=0~ivH!---UC-gD3tt%WHdkWY%fZ(>J@k&A`eyG= zPx-sMnLDxa@zGCr__Wf;9+p)O`EhfHZybF8=2?wTGrZNo-wNwyV(Ch^W=wz8z&9P> z+lz%oSN{CeV8z`mFz1_@h0gBO1>bikj>&V66=#0(&=n@bQ-1Zx9mYSl=PQmT&6#)c z>ZB7L<#LXPyv|m&z-dNd;q6?_`os6@%pMGjSnKOph&0yo} z4S&4&{(YurH^Wm-CRUH=L~mwR_@obA$_Y~r`P9e1_uF2a`r*+_&3KFHtj}rajt*8n z3@7KC(T*N+xGN`2cd&4xU2o2`OEWX$4JWzM%R5Z5Hrtm=Y+k5w*rG*cgay}6_B z?=xC6vnC(jagtZf-sQB1DHmS!bdQ@jeq!8v$5D(GN1SLNKR!5EZZw1P=vIlPH|U7z0J-G7V3-JRK#54N7snGVis zv+`FDKRp%4muB>3_VncMU49(Z%=8T}@p!<@$4uMv)AO6Dg+C4ZX1wzgt9Cr$x|5#< z-agH|Ia_Jmw-INxynnpQ$rnC7=&6=^R9|r^Uj6E>x4s8&H^T=nysc`%0XH%9!7JV5 zQES@M4JUnLFks_`3$E_$<+r~X{{36(P7ZbCUyb*;$4O0A-w0lEh)riJp7ets$6vQs zmw5j2h`(9&h;>%C`s~ez{;08kC&a4r!>s!JM!-)?GsEAVn&Hqye*2rr&tIK4SV#Ny&y`vjHcyQG04c6xw{_^T6e}BE>1hTi-;9BXg%NdBuz6qt2VrNuBc2!Jdyi@cD_m86IN! z=pFs&0~=1bdZq8`a(^=#IrDLcxAww4|UpDtlapEb5=w6`s5Ct z`rzT0l?Min=`9AP+W7vM`HOSh@D>+ueZu2ra_a>joUP&Fk%sR2jZhQr?wDDy!lawp z+%fp>a8Cny+`|`F-ZYdGS9OauXWr5;o#n$FFW(zHZ!p!ta4^62{N(Z-sX@FL{bIDo zv9nmXxX=u?y78l@H@I-vw-d<*K z;px-&nKu}4`P{6Trjd8pag$dM-O*a@ux^G&GsRz@_~T*@;Nd4%9QpI%j~k3|_=(jY zwbMS``SWw%_XQhY_x7}ZH){sv#NE3Y;X?}=-ORhXew)#N{x_>e*s%DCzZw2`zL~j$ zrw+V7%)+tC&0h{HJR0)F#XTJa6#KBE1+NI551Yp?On-Gp;wIJ-p`Lp5M*H z(gda%u=j5}UiLWPYEE#G6Yi(S>h5Ov_|5n>lSgmd*}GSlocPkCI`ouw^5F~@zxoM> zu6VewP8?vE4>h=dKNI)2nOwN3K@L3luzRd(fh{-RkF)wq3wN+#rVT7L_FV^ajHn9o1{DMoHCH#o z3C`1u25|NN_nF+@#kjYZ4>k;b{+a=6-&sEOLLcyigJb=V7Y_d5((?bz)B%%u|8pju zuHxLo`a0w5H-^@HyyL)EF8Oh>($~8@YPgx+GH=DT)#|qn?uQwF z^}^Bv{_@H%uQ+w{5ibsZXSjHXQA<6P7lwN#Ua!Qv$3YKpheIPX2aA6E`Zn-@@#EEf znu_HYPx`1sE_LC4GruYN4;MZTH^Y;^*})yIUbv$%KQ+?Qy|Y~I;8?}o3=e1TeC2`< zJ5K7b$JU$z5#c15o^})kPm15Qxmff zvv0+{{P@7B-gx5W&%3?*u=UpO4t|Wb`pQ?WYL|x(Jz>isUQfOA$H`r|?r3^nN${IKzkLuQ{mk z(+oejbdWo4aOI?9GbfK;d$W3jDOP@Xu=u;fJH71H|6zu^T=f$M9(>_6Pu|lJUv)e^ z-sLbmH?wbE@mIebYKCdg#|qE>wHEw+pK^G=nfVk?KiF!8jhmjOXZ@oUOz&dk&G)v4 zQ9sr7GNXrkx>XPxgqpjGRxraf6o5^dhhX0M?`QTs=6P|bTYlie#yj*h^*X?}3PneH_9 zPD8%^_VbgoUg3w=%VVW=+Sq#&k1Gvmb+d0Xvn)rt;(^1>{PF*3cC%)eK5u5`nNGO4 z`#i&$sg+*p;3KEH@R1XrpJ!rk29MTa+`XOMOwIa$lX`LOJ5vul`ZSO7niX}(Emr+< z^H(Py`RV0OUCoU5v=hr02Y1b_--R?+Gaow10S70(;&BoC{8-)d<-;G(jL*F?yuZ)* z!{SHho5@cHD=afkJNWMSyQkO9Xv%Qmr*1K6L_c}F>4P}mo!Zrh3m@2g+`(6$JzrYD zkjEQeI_teR219)R?Le=a!DvSHS#9z6hEICR*$n@=J#OC8{^~OWZ;^avO8r}?6^WY5+@nWpF;vpV?dq!Kmha-kA z^3{Xh^bLOX(3?NgZ|`{FA!oh!eX3EOo2kz`d>HU<21hO!?)6fyXk{;lcd_ogsS96c z{PpB!dZIQp_Z`4@|N9JneJm%eo56>PGvn)xU%t0}Jy5TE^{BOP6km7p*E87SnlBvn z!o558ZHBiyd-~AM9X`0hb8ZItIC~R^FW=_Do%zC3j;}Ly@fYjeyuskdaJyN#^;3-8 z;_SuLFZZzhM%atvr%&#GndyOi@ui(N82X0?ZuZTK8sO21p8W0kxGz_Cc%?D?G{S`@ zIQ)HP7Tm$4GaNnBKi{*x+%!=qUvmcI;|#7laaP=!oX$)i#N5NwMn^vKdzViRceG+R z6Q?Hr>fz(fDn@>_=o3xU;T@(o-y@xUJ2b(~nNPUyA9r%`aSvNQ`ip^WZp`+tkG(j# zal08!KFpd2wc!OvT{puIc6H)NM?PYEi<|X%rXDjTKmPcr!JRi}`MuvvE&On3-o4>N z6LGl6D+fN_^xPdRz2l?4^yFtRMozWT$DBB;M?T!d#_jj*@iG6^-pn}POkP-Gz0ubB z^UNDuzSZvDd;G=Wq1Sw9@UIz8YT<_ypK5>$haQX{oy-@1Je+ZXM;G_vi%qM0-0|l_ z=eM(`8SHnnpJwmEHQXk>my$p@$;rec;z>reChXf#t$}=&-XziGh|PD^MxZ^IC#jD zp7`LvA4cEEU$;*q+B6INaiGi1m~N4mjTEXMLW@Egm2D z<&YO|{ld)*+Uo@$eSm?BoN}>raPLoEvCg!|0dFz(#p2F~!QrdMKOTGc^68nqy7Uc} zUbutB^27UoX1-hXy4rU%UUw-PLk2>|k+>6mOcQoRQBYyg0?_F+KeoJ7e z*&E(;hD{rs(jS+b@iRwqdB4Z14t2?8hSX|xFW1d*>NiNd+;HRB_v6ge#PH&aw|jZ; zf?+QgqYJI#W{;yBI50kV+^ZEvddXoPoz0XtJ*J0R#N&f2Y?yN2V{bLr{L|_4_OJQl zrAPkFQ4hVXFyV`rUthh!uU0sGs)fe-h&N66;~fqxrZ0Mjv)nky!Svj!zMJuLmgB>W z20vzS_{s;vefr$?3RvQv0gV1 zUv~%RX7Z}z?M!}u-rUJyF6_n9*ov=w&c!$LV#IsLISx4MmASCj6CC|n%kyn}eHP2g zM-RE+;X`M9<@?tRHXrjrGaS6Rv%iPYLN2<%`!w?|mwOt*#}STrdEA=^buux0+`%;e z@;USOX2nY$_j2HUGx73yXX>Jvd*^xyQyk6t)2iRTYV$6JFMNHGpVn$&@~g)^taOB7 ze)-6aD-5x4)ZoqjX8gT159x-R-id`Fhd5m8gZyfweOmvry>Gxw!lG@la@-7O7}ca! zeBi4C@0&GS{9w7W;sn!d&<~b)_ula_kM8LNFMN0ExfyP9;MZOp zP2s9JZDGh0KXvhmyV`CBA6NWvaW7V1)Pg@;Z}8x#Th0$NKJOl981QhwPcFT1hU;7p z_0qp#lw+|`S>-#C2JLT-NgECz4!a=};Q(_`=a(@ZWH z@L=mTyw|#Vho@#bSk-Kf-_QK1iym|^SNy!gl-Joz+Uu)YZzeB1^HiPqi=$7ywKqF_ z{x-u;{q%yN?l9F~MHu*3hZ^yh3!d46ZH8!rBTdY_7`fy~fBmB|zIfZy_WO)( z;_*qVzAxDKc!OuJcVcm{$HB^A(HIXLskIgnQkIO62pUfyOBsoVBi1*o24{R>s*`r~)fapAb*2{h?#1B-PmDJ;;ouEVI#e4UT;z}!K0l^^ zexKy2XJXUFycD{pz5)5mrGIjISL4lSY*kDAz2PsOCa~o*n>T|;H*@2z84<%*9z4yLI@E422ON3K zYyIRaml@=Xvv+s6h%@*6Z`QvXc(~)|PHq0g&;l3zmy;fR#L%p7!I{2t;HVZjYGL__ z=gaVesW$m>wwF(CzBkhgzWUp@hATh({CiCc_0#k73^(s$wB!~6U!eyANHQ+18880fhWFPC_A@mJH$oZ(s30|y2^ zYLWY9ePeuJ{h0A{_C`~^xtV%0-x5DD`M<8Yy;|UyADB3+!~MYP4S+W0*buP$db%0*|G%pJ_nGy2)r8>>3hiJu&FgQv&pqcLol-mHCl@im`v@mCXn zZ@4k<^#eb5aBmi#8mliKc)!omMw~uaaWGdmQ-c_JSK~<6ut*xtkeU_>;fiR(xnoYca6#cMq$Y)a#ty&U`=4V0nX~ zW_PSR?{dRc6Qi$MI;k^V;ouNwXWtI){OCeAXJ#g8151oq#G@I( zA?$MmbXp`Up9p2aiouyM4<6My{Vm(RPk zn$!-Hmi*K$ubeQgv}NY^X6cvzhuy)1gQxsfSk0vv=9~`BH^W7q_p_Vzj+-~VrZaza zsDTfD_SJ4?_{0?--z)5!$&Ht}po>_&v8TDSRSr4b-^{(fs0WXFu3zc&dHZU`4K5z` zdZ`~bQ%^e44+f6%!q5lr&Q|#9!bL3OBbPl4{LChw^cVYm#>c#<36?&o#c$KM8D3&x zh{f5RH9f2h7LMNF;D|@O;nx?wW>X&g{r>T#9Urr#SA6`osY$#V^b;re?z}sTPYeDy z$X#F5nfB^+4s+oYh4iem4_C18+BzPi`FW zv+_xQZ#cr?OGkWYgKvD~mzR$f7jJ2=7Mjqyy5wW#7?!cY z#OmOOf?$8qyc zYdK)3$KB23hV3mMeT3^b`DT2-&AihIhQ9H^kv|_;dc=>GxZut&U2c1R8Q5H>BTziAZX!7>4-q!CkocQB~BVJ6tpJ%YmkoxYi($&82MIODS zseXD_3ls0pnuh%F!^geV_a-Ov_u)UwzyE*X%l2{5Etepm32S1cX*!o3;Z>QkFM zG_}IuBSvoe@U@D^ouBzu4-Wk%>VbI17e@0XmpJ)u22)&k@;i%*2hK3$)|1yUYNSNpe!lMJfbd=A# z{?M7}ot3{C=7W!W--CN+9N@g0d9#22SesL^@-g$z`1!3%QyRLz#~t1{sks^TJ8b5} zxmUBdz7Ks9gPZ&6bH@h{D;;oWH*3z}xf2JY{&|N%H-@X#JJSn2qKlfn-^`o(@VZ%k ze4O=29dyR2KJ)jz@PC?lGb{ALPaS;R$%Ws`3~%ph7Ym!u*BKu2^5uh@e9m~Mi~Y^u z%PWqr`~1Y~#phXmeDzFDSg>(W8-ITFm$u%-ym_qd-plT;afw1Fn7bc-QNjiEWl?X(nLT@7o@a4>NCZhVKmbX7bwW z8Gql6yfpEKKU~`3DVG%|nCVeHw89exu5k2R&GzD%vsF%9;3)T zj(l)ZBg5hEGx@5^oYNMz+RP>l@p6jc$e*A1_`nro#XEhidW;u6 z<%Z)`*0ub($lHyvU7Ywml$-HA;%{(T>??_oILr8fED(F~5g zc$%pz{nf8lF?g9c)-7zI%p`yy_~qw z&Y!cq@bS1A&hY;=s}6JFPJRBwz=M4=`RIl}jXux*oXIcu|IEDM=nZ$Zn-OO-C5OJ@ z!Oxr8amA&&#CgXPKYM-h4y!qM+MZrG<7b5}#{JFIL<2eG7q5T#F>iduH6wVb3y*Iz z+P%!=a0e5Xnc%1A@bP2xh_@L0nR~JDamB@+HvI5##*ZH?IbhX0`T4n{H$Qjwz7c(c zr?#8*Z;yQHkVmW)_nYx49}T?0!A~xH^i6!d@7`PAFdp>e;~jT*Fyl!B?`p&O9>$-a zJGp*;oaMw_|M6BEUe3>ahV_h(n)$)?o2mD-G;`iy-NU@So^NsasP|^_;o0~1 zaeH}jb6+jtxTCSN8Bve*zh=dmQ~Y7V!_T`r{M<8fX^v~!!=};CGj)EN>4kTE#L!K? z=b0SuXSguFW=d>!+rzcO<3~T*)<<{Z@T7}9ADaC#Q+K####!vkOpScy;NLfCU%hyW zS2ylrU^t7zOMQQt;i69QW=S6S;@s2IJiMFfB|h-{H-tQV)j%_Qe9V$O@XL>zy?a{e zulnVqqkH(y^&UsQH>)Rb_^Uxp`165np4EsC95H-v#+N4Unh#v{CC&NxPOZ489ZqvV zBeCAS$=i2tuRn6&BHk*7FU@{>wcqyNbN94WEzdLhy?Gez@PdOgz2ieGb>cxI{hUsHa`G!TEdFrRD*w%#_2^|L z4rg~vEzWemneRj$^x`WQOkBP3lLwYPee~gGaSmI&KH=d_ZDOrz!cl%_{T2t4nFaaO z%mW4MtbDFnCcRrw)6;JKE86ghe12sF|a!0C{}%N#XH-JHw%m=;@{5P(@X7gravt8 zz>vqg+~U*=m(R^;M29pp7sbF-mt5awxTy(e{`la>|I3W8TsS$~H_!a!floVJ>x;8{ zK4u4}X2#vkVCy$u9IX80zL~nL?(y_pnG1Exg@+tB(`R%4X$IqF@uaCZMkhJx7FT#` zZ(im7Jfk(PR+zLYKP}*T!%IxOVAB&P@p9H9_xA5+VxMPt_f3dVuQ;`drMcYr@lB%- zk9&B0aeg_-fUQJrcS?2{P2A{!;_Bcxf#y%6k}H8 zcION;y>EN>w8BR{e6pXnrwe}Sltb;#a`H0^?#sd7Ud=bFulj;>T)pFA9^v5bUETDd zubedE!xt|8-kot5W926|F6!}Z!KJS=3|#S1>*tw1!GR$ke0DQ&-thH1;!I2VVath! zy}a=J@l7*xc{9F@cKq1Q+{po#9^QYO=`mb>@_SQ@cQJ73H zKJlRq9o)yy9E2rDy5Xev?r_A9AMNdNq94BSXobHV#mL>g+Qs3^U+?6W$G0HX3KIuC z62n&x_wwWI_e*|wz7Ki$;|bR)1`b>~-8J*{s22V>I@6b*oL0TE$HP0F@n!L{;!P`l zR+w_&g*R?u@xT{%e&&ZC&Af}J-Oc0^%hW8VcQvamo;c&+-mLijfPXXCR`ubeckc2x z3vjBtem7Hc@`nwBZ@snR<}M6pn&YQ-yydzXY*;wrK?n6%n+X~?(?hJBeAGh^xcTCy zCg*hGqZi_ChL?D8?$m)#+;LKS81CWfi+k_p2hPp#(@Qlx&EPUQe9PYXJNu23&mK?Q zV7v3y{K^TVJo3_sZ~9tcTh+mEyBRIzpqYEQU^H`PUM_w#<)>b&oP9gZ1un(nj4Moh zoPU|&5w3p2X7X1j&E%t#y>C|R&75IWCww*No%}cJcS^tT@x~91+;o)d(_@V{KQ;9` z%U3R%xECkJoZfStH0jlbdM)|^?7%1?~c9I=t;+qfg>S)HT>Vbt19h~jc zLOjzOYy9}$3V<5bxcL;Obk!(M;oXGk9X$+sh+AOn&MN2QCaXyVEcDH*@wb23C3DrLlK! z?(kD9|8$_6-q0KuK5~hX*Ia#`(T=ZobBDh>Io*kOhVMIjGvm+C%4h;ht@YC0_ks@` z@9=SHu6(O$qMl4mFk$m|4}&hwa;udeAGMeRdpyNfm;8LaiNot=V!zGY;iazfn2k>} zoXrzoJ*)=)@~OkSoVeYLwt7ix_ww1xgA4uXs2(P#JMZ$!Ll^p2znaD1#Pa{g_WY~c zzTZxK)Ex(!n0=h_5d%lAoB4ieR)5S6e&TK>KmItvjr(nnt5qNP$f2+9{hr{!pBC`x z=lg;s#{13S;>1@R-TB}^C!D?2GiUd5(FOkJ862iJeBr?0C%^9(E{$+eEA8y9FuE5* z(`Eo3AO9ZlkwsP#R!~q6P^<12}69cCiq{q{&9BMZ!bQM$G{OiB( z0wx{Zt3z*TLI?bB28WL`!xe_Vw=;V?d98BuQG+;V8p9Vuv-sWi@$x1o-rn`*W_s?d=9|fZqq97;f%(e}-~7_f z9qj7F#aSD$?F{qCvJjFrQxM)6|d;>$NovGw?6`+L0MM^Ezx#~D{9 z1}`%Q2M^eE7X#0FGk0>U3)eJs2Scn{-2ZjvUM@MEX<+4}XY#9owtD8QM%d*Q@9h0` zFYqqE+%T&tJ=I$+=2iaQ#Fi(Hc*vnIw7|u8X)o@1CKnuVWl+*@s#2?&*vVY+Ti%M*R5tw-86#Jk89KcwE)a*Ew$ThauLR`EidQe>sb3 zZ8pWi)=z%wZieZ=Kh3HczIc4R?&K<6_ zvobkweKYfpzdo>=iPvAb)ru!`<_p7F-Z;6tnZ9~6+g3cp$%CU9x|lt4LHC=<4O>n2 zIP&KUgLdV2SFP^#z$}&L=k5Kyo5?{tf4DKdaU;RtzzKBQUBi0{LzZu{%-c> zvGT7zeBdzJr-3=a5g*^a+3+V;O`jioXMb|3*F4Zl4Bp}KSCco~<-(2jzGwO6xEV}& zX;?0A&fee@Bk#?cO?dM1@#l<#Typpx>1rwH9Xkg_h&iUPpzRq~yFIFybw197q zJ8b>ehu8XgqmO#|@Q07DdpvN{3-Rvd;YX{R$zyKp`QT+Ht^Fpb8&`GQOf7hOheK0m z@$#h)e)WZK{@!umTdm&kz)y@EYJe%fT5uJsR&}N`9~#sj+^YqSS+iD$x3{zW?D6?J z!-ror@nJC3V+Q5d2QhuuxZxy^`}F;^Jxue<=VhkG=3H;o1kc_385|rL9NKy_A6EV_ zZ^nm?{P2&jT<&n8lel`uFP?Nae^$KI`F3_QcjDBmPQTG|!j(u+{wAOpUlQ z9KA8KrH|t9P(L4arkfg^ePi)Zle} zy!rms0FUv*9T#Vu`Qha^Mo#y*xK|r3_`S?v!EpD-3>J=bg9)P=;kd(HUAT#(v%B>0 zZQH92o}A5>9`LVEIPo_JHwto+XMsoA|bfrpDT-Q*IFllA+oI=#c)vW6 z<&x99l zUuU>lVfub=CJqL}foArw#o^AM;myS8F|F|uXLZKWySskF-Q$g$yZV9;yz+{ZPyPJe znasUmaPY9_FYb8;3vc+p&C=fb_u0+((yh5me|WIW<@=c!zO=T# znSSxXTOK{~`(Q60zUr`6pLl1Qi?z~He){yTCb@C*_w=9T->bZE^^^|yh=b)0mUq1L z)tOfL(Mc}vIJozYxAV<#6kBg$tAPgm=z|As#lYhWn+CM+oxlCf+%q}N0{*b%_l@bb z6(-*DIr}%&op<-IYoe2T^?aS-A?{{!$dAAN=r4ZFsy9CIp<~+6z#AQycwF7fhff-s zk#f>Rjn3-hUkn~FUuJ6H%j|FF+paeG@PUQ5eDJ!1={|k!@sh**!=VL#_hI|a>1{1H z-}tNPX$D6>VWg?In_0z+qlq&4Sd4j)z(B zMniru%{;E^rxkzm0_)@KX8b?TaKh(iZ)awjxvvH*onLDr76-BB$C-Vb(UQrpZvCJG zPF8Vz@s5aX(w8)=k&7YZTK49Q)l^X{!IN!{- zh@Tj%dU2LRE_cr6g z<4S9>I61>_kE8dSne*liXWVE7kA8B|pWzCVpIqqz&$~Bxm6_T zy}=9D$`7U*`RWxvwTZzW4nKXO3*VdJ*t>e;;Z7a!VbJEM8Ekj>6l+xne}PbFZRFB#NbM&Pmk4|xSQF-V!k!=VqXt&6Q>_EQL{IAdMrjg{(Q?fbFT(@ zzt7YF)4RIF(i09Jy25tPPaowmhxj})!bzO3XjUV&Q54N+O)erc1 z%K;xBcQBmU&G_S6t?uNaXS`wKB#--k!}#4yjh|=us2Ltyckd>F0hYOc(NKEY6zICe9<_{w=Rv2k-p6FJ4>jX#bz^VWRw^$r)F zp2^?J*BcI2oW(f9zK5wxyqwq2gkiUFm5K! z-n`)-AA3B1o$)by;+lOpexvA%i#J^KPCma&^2Ir9I`F$0ZgEj3j{L;+I|t9b9QGaSTw$afL6ARygCrmmh-xUrzg*;qZPY2DZM!a<8XwZYEBi zbjC?;wTtby*ZJp}czooyr?)qG<*+v|YIf!)|37B%^pTHx;CN$n#=-9b4Zh7_RXi!*{&HEHd$?i9&7W@WKFq|4cdu{$})rd2HJ>`opKlS3xSDU`b!?&9BzB%KAw-`0?h0T|#2S-|qlgGU} zKF++|D}$B(c;aEb84gTNx!f}txWAjhmWPJ4u%@$_!IK8&0yYy17Zz;X^w+9R`1bzz z$_@J-#s{7=e0nnZV9KW^WE@qYWK#!NI*;dXWZk z<1Zg%zm4BOGi1?@14KeT{>RHNQyjk;h zkCh&3r>pv4$d@)^;Fw$Y@a0tlZPlYz<_?Z~{Q1!X20!PUsms3Eb?00REN`9hg^e5h zbWj^^H}hsM4}bAA)4TM>g~_ik_Hyu(9|o<|E}qftY33cax3sjHCA#57A2UO%=h?3_ zTHvK7{x_4yyv@k zT=>a{J5JwceiQjJI`NTO1j{6aK!1&oh5Cf(6^1TAN?--kDhQ zR)6?19NfXEX8oeEcUbDPznT2{@OCDauiQ9W<>Kp}k6y+Rj{E1wN)vB4t7cljmDk^! z|1AIRyV}&?4~|~@!`mNx`DhA*hW2KG77VT);iwNdJL?lnd*&N*cQbMH!BM+%+|*(E_d zZ6+5yGi;v@Fx=A?NAGHttG-y>;cmvwCSQ8?&FJkt3^#ju#KGpLR=7A@`<~xyj|0wP z`2LvDlktT?cQxLO26$Q3@BL*)YdC3-b7%h5?fz!&V9LvI$C>f9>W4S;fs4C%>K)Da z;_8e8PW*9}Up{g9f8JhWaMaD+=A z`R&cu&0yg|kN2}LGyZV+%C9Ee@iSY_`sofg7-Fpa#md1Su00;D&9ArSLOt+s;Y*J{ zX72gnDhgO~mq}36Av1&t00+l^@N-%0YA3%wEo$(ZEXkzs=N-r zZO^>X4mJ#TYPcEfpJ(a!>-KVr=OdRMsSihe_kBFiaK9N{o@VO7%Xcg%U-4=wzIma= z&0xu+4`T62M;zRx2`s+&^RG@l!GZ4T)Q|5oIDSL_AD4BOV`-WrXBZiShsTiBtsT&B ztE*zn>}u$y_P;CHlR7Wpk^{sykw&AD|A}zNKF{D4PYX4{vC88OZ&>uz8+YoF11@}L z_0vIZe8P}}7Vf^yZiXX#TH4b@4c})sb8jY#RXfh|(AHUgxO{Q6GMxCzC*Iz@KFUF3 zxz!JkpEvh#XbN8~Veo?`C&Sknp8krbn|_rWH)lR#s#mOgI?2V~+|q&0a`H8M?r_o@ z`!H{N_cXV{^R7QkukgcL{xs67rU!IeWC-SmtfE&HzVH?wMU2c!JXH>0cku&sECqv6fe$A>?B-x&_hYTyeW5ApP; zSsIAv10NT0;(dE!+~JR#`4N9JZ}O%^wZes^4jf_8h%Y|koy!yM?G8_G__)6re(uZ* zZ1?8rW`EA`kk30md~XIrPTXH+^1-sl!MlDt%X>3-&f?s1NTnR17Ryv5RmpIXg4 z4&Kx+FMcrLi{mTCn=^d4eS_-o?w*eP)Muvn!Lst<%TI3i_U75Ux9<7sDGq%Hz9BQg zw>KE>-O<_^e_EM6b={0ldDO{Q?lk19wwuAIR%duL;ESIX4>hV+4p>Z_JXUeute;_tEd|BimMy~D&=3}1P1Faz%G#hVxY zW>Jsvkk`u3p8kCKsOxn+zu#xLf1b%BhCVl=N41NS-#ZO%Mk^fMHFrNB`|`@|yZAJN z53@Y5aZsaP!jj|PGrFnGw{bIf{M1psu<`ydqpf(HVA#Xv1IHO}_2S?T5BIHax5ry< zc(APchaU}|AEst+bnp9uV}A7#KE87H`{E9k9CB4R9B+Kx(O*9M=7NuRel+1@k1Joe z@;Kw^Z11jn{TG*y`rgm@%cY03vzJSaH*u+=TE8pObZK_C3#^1B&)cX-{54*c-o=dFIg_vX(X zj^gpB30=j(#u28x@l^lK#K5+P6E~~4G;qd;zgn6*@9z87#n1sC_ti)P9K5lc(b!#e z)BknNA9wcc@`qzzAJy-yUK-1=iibSD5k03l!;!yyW-cCnkDRUYsYeZQ!qeUBGk+$pe)EAXUv}H${C38VhWwcO zcQahl%w2r-8?L_H%vtTtBQ9dyi`Pr>IM4u&JAPr%MZB}`z;~!Fxcu?sV-EC|hHqx{ z=cgxps$D+5V#Is5SKrO>;15TyZUzTu`ET}P=H1@Co~R)#ck0kf_xR(cc6H#OuX4eu zp77;=KNIKO3iFSdI2dx_|7|8mdf0!S!F-wF#_wj%;^|8d`T6-)oa-f?V&s*R4{i*G zcYAqgsaAPu*l!7JJ#K#AZZ8ksIH}Rfiig`fEVG0cOh!Zg_{-y6MTHUDw7u?+8u5PpG zT-|)q2WNb|;iK+)=iqV>t^`M=WP8kqq|OFW+0DedSNqN2coU-*W)6KLd~XI{-D(oY-(5X-FK=`9efzY+-5a}E z`oV@_R^XU_yxiRk2i&~d%gKk?)9-&~d~W7j6&q*y&Gw%&8o^8J|geDSH5#liO8 zN*i(iF~f!70Y@yqw4sxCclPzo3X{I^p#95?KRuk`(zpKh9lE=jb2-J}BoA|j<$KnP zUo&^|dY9KdjQ^RrQ@=jZ(OEo9yl^nb;+*lL1B{!whplH!jWpyV2h8^~e5;X9#!n6$ zLjGx&M#|IC&_})xzwTXczpVe=qI{Dtr zdo|&szv*$?!xbxk*tF#v=G(`+`uMqrWA9EKVwvw;KELZQZbmOW)c^cg)ut|W!huJ- z43;=Gs+C^q;!h*-?$Sg}c*7D$2l@Y)!GL=+G4hK4G{Z~oo5|CR(9)Y)Y2+*iA7>bH z<8!n4>$QDvxWcH1Fmb@miZcwej}Knrt@Qzxym632Je}`ha?~5XX=fD&3xB%ez^Y5l zz8#wJ$3tKJ8~kymZ|?lT^5^dD47c}>vwGmBdYOsyJBlOjX2z=4^n!)wJyu-! z6cc}WHjn6JPc6Wpcp6SF9Ou$FF~P7#D=H&Zhoc<{|e8qob_{9$;<2~Y9joca6K+~XjQ1~-Ez)?Q3? z;pmQr<)sZ@u`uNI`-Y=hsuw0-_wej}BQG=BsMQ;PzO?u-qbsfqzBn=IOaps-#Nu`{ z@qE>mp7`TgUwmh<SX5y@L zfQ5?~hO75x3Z@+Lv5&L#U^5fjUO%Gs#l%9pPQ+THJkY1jvpU2-%JkJ-sJHP zQ~mt>e!^BGpC2>tX2ZKTJjAhdR39I{d~TNh-s%@!S_^J)}o6*XKd#lD&0ERK%8KXGE3ZNBn}l}EgH{cvuUt?3V&k9naV9_AFb zH~HcR+Z%s)e7(toGd*DAgQL5?Avo3Z8WV<@&_^+Pjhj67YIc^}yFYuH^AS&9J&Onb zW(f!W-)FF3+++17)>%E(q;9zPxD(IJj&IB=_Tx-_^40@;+~m7iac083T5+)dIqUm! zCziJ5v(lH*LhPr<83(fhM=T!R@#FtAQ-}BZNO#(JSGU||#@RfB)(zxven>G38v9JR@9<$tft*-SPA z|9g8H%M)L^>XllXTW?~S@0r#(&bhB)z{ch6jIMI}bB~)Cy->^3OulzBI55qM8KJ3~#f$OAH@-B4 zkI&8E!Jr*~J)kWgdBwp}hxx%rE?m5ch3~F&{Z6yEsTD>%-ShEph}>owR$RO{Px5(l z)*rcU=B&54;`x52e*F8RtD0bZcw9Qu;@wQIQy_gG~?sX87Fnw z%N;NIZ$=Y&@WeMPJk)EZ@sfw1JXXJVVwwy7eAEd;Uhgy%<4sQa@P>&ey~U~*H!)VV zs$Fm7@aGMmo8bW4`So`vhOTPGL*4Q?yBCLxSoO*Sm!{3fZI6Rk+|?w;yYH^KuNU6v zZZ6->)Fw~4Vatt=dt7LtZXED;XD=2fG4i^@Mf|7P&2WcCP7?x%uFuCU@{|mgd&DH9L9?>t^EM$IY3+j63~q7AJYj4@WFt+^uq|&v%ax?#_5u zFMMbGy@!X3H#y9kIQ?+X(nlP-nR?7xm}2bVs^xEw^|s=h`A)=roAGy#yBfsF^^X}m z+R0~y%iyXJS25-YN4VxnT))k5pJ!%4E_ubsO^5t(ptBiqM_YJu(@3m1d7SH54 z@^gmuab^bOtZy*HF~088uQ;n7sX;CnYQ;l7G0uEwg{yo&XK8^CT=jUD*V(&0TsZdf z(8Qf@4qtlQjE3^V&@X#FxY)}hhy1Ykc)uBZetH96kH0?7c=K~Fzc~Kx)CTk2tZ&R4 z?(S)q56$U-GaR^bsx^*QxO7z`&SKn|7uaI)znOP_-FY{IHxq+{yPL^_kNVZ82V&Lf z4u5|*z;))2CrxjrE_krS^0^s4X-jK+da3VY>r;jrc}Ja_s9J00Vv2E5>SXKE8Gk9&FJ!#95VYR^{=nChXidDElcXKMG(_sfhQ zYX z3x}WFzh-}*;pNS|^ew=Ap5gAT-vP1C_|X||HR9r|Hg~wXyP14y)HfJrNG|gU%exxW zL=Lg?dxzysf9+wZu{SmN{?xCBu0TbO_?Oq2@6CSB^eTKY^&Br8<$@=lnQ&(h zQ+;|V#yLIlsek5B?zpK@y!U!wPcMG7^X}~)d)VQ7=f@wWSy3l_nrCNkz8$_e;;O!z zIWx7HY5c=+Uk*I*H$V1$i}9g_clta%_T`YD4$gShGk58VGe0@;l&6_$j;-SVoZ-pe zS!~}G9~|7tJ_|dF(+oMSrTu? zX-wO4>XUo*tD7HOfA+M((VM(h`I;$lv`{15n|X)tJH-bVajd**!I#w+b&IKIeslCh z|LEMz;UfkXj%qMl_sVcmS9g5j{F<3JSa{+=J7+O)X#^K0&T5sz9gcM11Cx(8a|w$M z-k)bT^R7m@Zl=F_@_9x({=TE~!Nh^VrJXx|c)C-AT5y3)Cz$ZUvcFlsl~yr$sZ&02 zF!5ER{<(L?SMS{6(mh;pu*^v{;G#$3XsJ$q;?w%JR|l@@&ELh3U?Us~&%v!AoNp{C(s0G{noyi^E+$INrs|We(ia2nTo0^%;g5 zy~7V1KbAi5#f!E7GNY~hbn+%1p4?X7l3J=)ZoI{$nHWCIUM*p`yIC_X56$T-H|^6^ zuD)}3H)|&KhK}ylBsXk%ZYD20xxMpu#+NTm7>%6er2!s%n(1)*F zFzJKC>v`o@&*0q5U0CJzhTHd(i}JSiNQ~9c;4~BkG~$`g6oIbr_y0Y^7p{KEEk=?r%m1_&9{;&YsDqMt}D1e$3>!8BFmsaR-}^JFA-MV2_^~=x-MM zx%20q*01{lQw>&p^@tAms6(xAzCG64>K#vc`v&Cy^f-$V+uJ?%G~|cJ$C;e4)l&`5 z-u1}8r)rlEZ*RDJQ!9LRiiM$0{_>ayzajj@-OQ{z*E2ZneW*y9v8TKL|?(E4W1 zICx|H-N|o-=^p1lALls0R|hOBU)*S7Myt&`EEu#*5A~!$HCY+G)ujhF>zlF1kv8(k z;SU!Y;VqVrTzL5%z(IbR(Z{=c@#%}l+P-#fly zg(H4x7?vE~aG;02h{r>%bb#$%E#CAOFI@E1o}YJnnBxDK@evOj59gbS<5OMUnL9Y} z{HZ|<-t>m`eTD~p)nqL{UE@YuZ)$_{Jd;lz->J1+w>^J3_%mnvsh!RrXT3YabbdQi zkNVs(dFl@=ywyf)^~ifOb>QnBrd5A$2HP8+^+>FmaiT9AHG8kO^25?U_~Pkf#REPr zu*7|x;qG_Cdb8Ku%l&!x&7^we_8S2kCoySN4g6^+hkVU~`Nd6)_nV2u0neLx|1?XV zx7&-y2Y-3huHII&ncg%g4`2A=;M?Pf7fj!S_2;a&G*YLWH?yZJ4E*?7%?j<(95y`M z@$sg9wYq0`hlNLZaFNd&ebkgj;+*B>_xlVkd~f1tQ4V`L@V7eSqc(=SGfXjYwKq>z zwRp$3*uGz9Ilajt=4obj<%92zKK{KjC+_K|CN zfe)KT{F!)paJ|`wnLGTe&q^bAZy)!5OX*CnH#1z|!IH*tE1V zT8Z~>;XTaUxr1e1<%g}#^j5pR!cd!3i$^-~ah3~)JzRX9(}Yg2=}w!Q z;p3f&F&}X7qmwhEn?Jp{hv^N!_cQnAz;BA*CAr~wx2gv(dA#YHRSmd!R~sK3>$R1y zZw-I?Iy2bKGj04nss|PfwR^`&9{zdX=7A4iT-6(Iyv&sP#mVJ&=VtPYgTX%?-O~mKhQG5q`Q1zo z{>_`b;`rqMV|zYy(ntKPFmQqCOanah&z|n?@v{2Xzt7;%fM4Im*X`q}R`JZf+HrIz zCk(mhK?`$@H=j>4xO~0KjX%D8eJ?Q7=zHqhyY0oOC+*$wQ?qz^#d^2G`fbL?pPtA8 z!+g;I|6<(JRju&w^iB(LaGF!xZbrAhz3PUI6a1T{KQ8GY4_)aYjs|L#M}C^QGq3XV zmm4m=X7pwDG~;7$)jRL_Ijac{t>w1LhttjUBp~;lt+EI(aVZ+23y^FtZ(AXHvBYG8?JDg8NXL@KhM;Rm$O*?lUJ_#habN2=LiRgAa%;oak`2K<|aW*`mJUC+1uYc8y`5?Al|`{vxqFE7(4 zD=vN0eCstW#NZvCnc`0$SU1BD5B_4+qYii8+~LA#Bfc{qn9lsv)NkRJ$9V-#BzV7(pKx?c1$@kwgIbfGp4DP;T-z6OVgGmP* z)O#~H>G!fdY(9Sf>S_7l^AUeDdGN-Uk3C#`=)@0qby~gQKsz(RM}C<2i}U7QZZ+s* zTGE}beBStox91}su03t!<&US_{M;4K#~+Qw-~*`t2p0Iy$~ypoZ|3OYcs*`!%QtVqer=_ zLk#nVzZjVE(MyeZ@M(@dZ~tZn7oNJzZQp(Q+^fmCZ|JsH13bL-6h0hhy2wcnKJL{? z19jo#E#2hBRe#iE|8d6O_vT(cI$F&q9CfAvKWF)AfI~B7KIL=oo3Y-Ezxvb$8|L$j zj=14rl~axK!lbPj?>O>tM<2OheV^$k9n{wxz(`A6<-A#1+4FZ+H;(XO!pFl|UbV|% zm5C_g{6kL*z*-fC%*WZHFr2! z>l1%i_{&)z#F`Ozzt8YeH*C4^zz2?cCGS^vx{Uh#(~ z#yu`#z2gU496t4u*51C%#Cl^i$H5!z(*sZM`t3~)^{b0s=8P|{-tb~LD~L8I^-3r7ISj5YE27#0x!?B_{sgwoi9??dd0{SX}wWz1gI< zyR;LBhq?YR<0oDnwDyiaf3qZBFRbvzS)Ikv1800;!B87MFy!XnUHa3c8KbQpz)+hU z&f@A14)k|6Bl6N#Z}`a#+r2yd;P7{E#;kDEFBWg}?e`3J+E*VP#LyU?v$uG=6OaF! znR?@ihqGMf0}c&fq!}D~d#i`)<_}xX-NXDbi;J4@NUM+A*GD<@AYIhWSB>thc;T!! zbg1X>;NWO4R(|nfY2;0QD-1l%di8$U9v&^tlv>1!Q3rnB>yvvrs88*Dyf+{4 z=k6W`%f4@|Txw}vXp57(W>pVvCeQ1=GYq)$!?4mGH}~%JS?%m)b~BnYdm8;Y;}6s9 zsSg+Va8ak)adX$VZlh=Z;m-cGY=XkyDG2QTxOT92|=FG~~ z`yac*2bSFGgYOIrfBBu8Y3utLf4OmmM-y+j$s<2J9B52aHL4~5>gLB^uK2jafiK-~ zxEUXL#Fmqf95CGDfE)gBaLq?7KX|b4OQ+A<$Hjbz;luwPt65MVOc-jC2S@A8+?f-c z7)~(c!C7o|xWm`_A2Zmv!>G=iIe^2mb;%E>jnDW4X zt)T{Q?p{ssncCGUwtSzr_a;uf8sw7qW^%x>(!$=mTHuM{tJnJJcLh)LLK8K`y&0p6 zJh;HI#~&|PW<{Qx#oL*$Ghe0#CWhW|#}k*=df_TRF7|xW&;EG^A6~ij4vre^{k@y1 znLobX;P~V7ai(`~X6nNW9~|Z7s|K<1@|BMdzWB+BD{Sxff6Vw5+l=E3+pN$e4dCAl z2lM0mM>Fc!MXFubTB3XTME1 zdp{E+kJTT}&edSWMgFw8?d7nlT`s1k*F5D4pVn}2rQMImnP&X-&q^Db;EW62YKBca zzejv-miF}G_j4vcU%JtvoUeOJ7x*;8MJz1&#HiCO;Ui8BV$=wqZ+!XQj1R3CezX<~ zLyb%<+}_0KPZ&5k-wYSr)$2Z9YJ+74!p2K3dDG1uj!ccuGyZV+sYl)N;H)Nm_^{Xc zs}1kpW;nsa1$X{@?9~Vl51cyVV9!^LVsSJV3@<+3`Qd}7@Avymuk8JayIH!>gI4AM zNB4bqc$phB@CQuU`J@bjLo;$`zIzw3S=`>IpwR;de7N!h}b2d$C_iZIZGkV*LrJHzmGyZbhZ*3 z{*9MUZE}fq#*e?eH*@xG4+AIPkD6FG<-{Wn-kTj-HWPBDgE+rw3^tBTo%+-_g&+NB zOkX+0%@F{lw{y8BY2kM!cH) z?!=nGayvJp{L_|>@_KVmE4l6QqX~}nN&WcAoA%=U8|{oEUwr7pFYd7T>Q%oLu;ujK zdxPOlto--btLx{CFF(EHdo%dWsdsO$|6Rd_R(Ms5ckyCx=KG?N+Hqs@m=E#t(+q|; zesplJ#+%6v53V>lz1PQ=?O}OWo0))z`_1ZO8oGz4M|{2WXYl!%1HA0LHlgoUmGcCmP!4WS0bfHyD{MoVw+~eDC@}7Y3^u^~PCT-;Xm6;;i2I^Ocj~h7UY*XOHvG+4~t^@i)U2KeO?17M|Ff z(ZL!oapGwtmhSdumCoMX*{ji6e*I_;nxpda@y4Gv_0D{{#|eKpa+*ys-tE0tm-^F% z4tk(A{bT0VAI@Ub30q#daHl7|VZEEdz)c?c)yBuY8Klk4-oxJI9{P^LQ z4s^jmU&Y{suRE(g%W2OCj@6m@-NFHv{PYPHP3^5WbEl4c``y5^n)DMVdHGt^?XG__ zIW(;N;y2DY%{9JiXk(PJ4HHXAa!Sg&!Pe`Ng=?XE=<%dwlu2>)VTmGtLZ0eNw;t>is_B>$k)i zzBhNiF>Ce1NSEre!nKOWSG~BVr}!|eFlnzJYRBEGNAff8Ff;vEr+Sz<7H4k`t+3_A zM{aw6e)qh&OJlL}^EJ2fxYILr;>ez6-eEb*W2KQ;23ybYyBQyP!jn^7{G82|LDmKW6gCDG&XcL%o6P4!55(F|fqAvyV3|?XCLrx?l8=R~~i1Nq1cFG8@%HD|N;l zPy70dmps<@k3CJC)vfn1_~3do`ScSB?<_8Zw z!Cj2?W#$cjTB!GFb~8C)h=Zes`tAGCA6#DJ!PIw{c!-B14#%7E5o1>Qz;8ah;RFLd zKN$GIh=cmnz>iP!1P`t^T8q6I4y?N6F+=WfmZA-)0Do*@X+^&zZa8<&AH=%otyM^w*sG zmf@>KU#$07;dvK_qccA6;NauVT0O1!(@{-)tl{tx9}YhF(h+{V^#eDt?$s;S9j^SU z6GlCePmlQ(k3XJpsztniCut$ary0)t>M5+>A7{Sw#XY^sVRf%haxiB)&>5e57|gz9 z8ptnB{`ZeFJY3xKms^d`v(Gbsu*LJM26fP_e0Z7{W>)ysBmCaX;HVdt@7p~t^+e6? z#mWtfk37C9Iq-D%c7`uZTxe~jHC>(g`4;j~7jw=BM|t&}uRY^~7k$Nin8Cjp{G7JQc=^Qeg?Y2r@$TuuM}Op}JAKq4o{n^owhyTr-X@Uz}+M0Jh>M@Jr@Py6J*(wLVu+>Jpo0T61ADHggYahJ5!=izA`Q-8j zm;UnN=IlM++a7T^ z!HJI^+$x*0c~Wk2rfq&zp&7X-1=) z(FJDu(g$xj`O0Ij2H%ui@Wr{8?;d+I;@^Mgmlgo~IeT@xfIe)h=Fr z%-$PcdpI}4Nvyq?FsrTE5R04d=eJpUzJ1*3y*G8)d&d)=vz%(T^1+D@d^MyuK4yW= zH~ToNXE@N=8-DI-D~CHca;U@J+s)*tHh12{znk%Iw&25}GtPYQ!c+XsKFyq~8y5fS zG0QjWcSi4EltX@JJs0C%JdR@YC9LP|#nV8H`SPw`dg09(rZ*hZK^?I1dzta^dm}F& zIT;K(isi#s-}v;~DMlW6^!hdv!`Hnz7EiPC!*G_vo%dfezT)7h7e83A`M`6gv9)hX zZ}1VT4!GWFp;kCFRD=16n|lU_FJ9tk92RVG_4@txdhbpRcrkgzdHdJQ9p3j?afi>u z=ATAt!rct3oh}R?_j(}?FStKueh1~Gc{BAoZ}q_D2SdML+zg)I1Nd^`;tiJHQ8E1C z+ze+J^5Nj!omer>jK6np#nT@TJ*JU;K4Lqo7YF{W{N=!xUmW#Buk}G*@9ArQGkS=D zi#r_HdTtNnX3k>x;q8oH{LKNZ^z+^x22MAV!@k+|hF`NNw;asO^H+Z}>#PQ=IP)M+ z^@z8}r8;oK2hPpZr3U@1&8*@Dq^-YQir}?6}Z_IB`@4h>{VZy0Tc<_q@?tIeVkL}^(rElKl7VqBv zX8h?R2Tb?su+k4F{QQQ%(nD|hlfQTUaObT#%p=caK%f(@cICVsPXO7eDuE zr77;}EDvsYxZ{JPyfmQE+nM)|voDXm zZ_%53vqX1q?qR4!9DX>_kk01qX5!R^r}+BaTzUU6tDow?-TcD(G{YOFH}n2^2Gi;f zf1Kc(H#Idox4m3e7~<$r|MeE9*Ba49Eo#&Ywa67W?@ax2rt57l4j)!u>nE+`5v%uj zij^Ps&E!-wJ#Ge1Jl{;bp6IDO{MCOmxMIb;%xKsQ{9}8+XL8CXue$X6&5TZJ_4jT@ zuXu>ztIss!SO3kOTyo;0cWUS7jpi&qw>@5ZWzV1Q>lxrL2Rxj;!>1pd-f5yfbz8mN zV=sqzxQzZdyQixd_0R#HUc$c_T>kQ=jhgti>O*sfD~(|2p*fX{hIsR3<>u=*Ks??z z6DL3ao8kOpriSX|t9P(&CJ#>TVBSnk^5AdIopFK3$L!?)w7nYP=)YMKi-)~8TEP$_ zKOCCD5yRl>b^6K87jOPJ-oyB-Ne%Gfgil*B-fw0`2uq==NGmf$pzCrZPWu_T=l|Yw4?(c@A@FdzVqAd&A3?aa^j)p zo0$jr?$U)`?ip;n#NET>^hO77aN(s5-EW4AH@W42QN3!E^Je(fi?I3ApATQP+B3P$ zw>&tDm7AZvIQrmcW?=CX3%}lY&)@gjyI2@EQ-eHWXrWGVpJvr`+sn@v4on#Lu#a2u z_Z{4f9{Bjp^dUXPz=;$btoh{ZPz#nVP#8E$mA8GP9G zxLd_FD|pJs@AG4I7E^5f##;?I@KK8z;o+cfdTsSR%Yi2@c-;(7HNt_*j}L5Tn&@e9 zZ?~5NH?h@>8>2f6_+oD64!-yIGd1$T!yVrJCdkQP<87}#`tzqfzTV_^k1Ky%=|pdw z+wR z>7#cVT5+T+U%Ba~7PARcoP6|!oxbkGnN|1ja1{rW#@=AcBmUP+o!zTD-C^i49^T>T zO|y?XUq0fzyJ9p#vM*pxU}c1Mthv-fRh|_ zh^KdVIPkfdbDDeSFBX??k8^s{1P{5HSheE!Wky$VG*Ab<-#zxQ_=vA>>hK%ruHU6N zdxPP-ve#$1ZU!^mVTtW`&b>Nl2uq#rzRqxir(WNB+E=UoG4Z~~dze~rq>Fd)YU9Vm z%Yi2izR${mpLxO2o>sWU+SetfKEjmfQUJ(Zi5;m}K6uxJ7IW}<~A;Mv^3 zX|CLPuO_v_6RXGhsol9ZXEA1nuRYUm_0!cGerDU77~I^6p{2dql}8`>;VRyqKJIT; z-L&xrBYtY4KOZ&sUEwTV3`|-!Q{Li=!#xZxUi{6J95fOeNAJx%ADq3r(_?=)Fq*Lc zoZ(3iI=Z{Zo)+$LHwQ5B%=pre$%7jX^)f8{7(Q_1q=^`qz9qBC-p^n#KJoKLgXZ~p zdm5D6Uj7d=b4MFFy{k(cOnd)!I@6aAY<}XsTlK-6TD;ScKaB42=3lHhczBv&F?flQ z&pq6mxo2U}#{4jKJNJ!<$C(!N(o1>hn_hBNzg&7OhQ{)~nZf*h#uv`J8UFgIFJjz_ zcZVAcd)PPgCPsc-e>^PBe%qN&^6G;c>BC=cde&2S^0`-In!^%*k2^7VJk4;bx3@hE zImFO|UtIa&fF}&!ZCt8BpZ@>1{NZ`Sk#=;j((h)?4NiKZZ}7j*<=jw)? z&ds_W&_N!38lp7@@{_#K7=qgj%lR(eza>1B_L z9D0Or{ZkJ-Z?NS0ID_TPoYesvmip*|uUJ~Tcm6hmAs_$dksrQzOexGOXVeq+` zdt9B}%UAEL`lbeYz!NXOI667=siv3htKXfRH{+Md*W6gu1si94^{;-@4W>JW3tU|J zyE8ZL;^Pf>7K8r^3qK_d>VP@t0&D?I5^`^C;7}Qe8wN96&8KOb%w1zIpH%{ z`se;;c!cR5E$N;M(Fryzy-z3lipNW?dPpOExfvgr#nRDTIC$~rqZVA?$iZOqt!8(xX8|wV zZ-ytW__+K1vD(v(FT5W!{l?iUx7cO_hMwW(9j}{t7sFrQtqeCc@S~er|CqUlA01~yxY?%}j__y;haT#+R-1UZ_?O!| z4maax56fzHCSgw4{_zICb9N(y_tOKVshdu77k9#n>%sN-tbR*{O~a=;^n7}T;(xe zYJlP1%);SsZ}t9b28VXdH~wN^rtQ;XPa`?J%d5up_WjYtcSQ^N)XNW!IN!CJ?`C1i<@e0Ah7EJ7? z$EuE-d52{l#KNlAFm47{Y;}lnhr1ZD_ORd0=*>qh^59Yb?Y*0ko8ce#IH}Xj;^LbP zUo1`Kf=_$-=)}wmEO~MD+pGrp@DIMZ7AFr4aJrdy zdNO(IgS|igv{0)W(;a?1v1%*5z1e>yW7;PyQ8?oRFU z;tz**<{myg?=ZySP)xPsBB%T?GiPxy)6m*{;N}fJt(?Q8Df5mCedJAZIcUMe(+IYB zzV`UW9Y_7dhra6YrdIdz$nWj_Ogv0=xo2>1MsGU8#KRk`r&%1f{Ywx0)ay+={>`iS zo2gTr`plc0<-${pcmCe{-NXIYjQ{gYZH#aF;pJUyeXzo}s?nc!c<#$3FTCc9Hn8xI zJ71jC>AU3bOjEiztG}5}N8gCORo!stelwi(PKEdIy8X@>y>t9#?VdVK=LGnu%Al82Q`7Rx2Jb_~GG> z=JgY%w=~0F-_&U?+?xsf@WIa-2fjDs&li@y;bHHc9{J&7ZwBO+PaRB-@3U&9vAdhW zrx`!I@TeC4-t|&l{N!ftap|{OJ~?nz1AkaF_M7!Ga}Ue!l{d3UTletfrGa;G_OIXN zz$xx9nOrx6sTblt&S(NtZQ|^U7bEY_8GpUd)8*(I z?`Ttg@BHAp!xN92!SvSeq@LpEPOY@ZQ%<$g!XD1eyy-7YSYq{6PMUgG2Y*;ret5$2 z8?H8(?tje0@PltCoZ&RV${Q*HnhE2yv%dl#qz~VE%@WpZctEnW+mt9DML#;`q{DUOq7G@q)z<2fc%X8-H)G;;8>L zt!5Z>{XT<{M&=J*Ca1kW{$>?+HPT5QZ(-7x4s^BWi$|R8&A2!|%z25V| zoo0C6%xtQ)vv+&(w8G!2SL%uX-?uk!^7)?1gRgJ?>x>UwexJb!6VAfm1E8<&aaYw3Um& zmXGOWy`c*|#nK#}obJ>DPpo@AkP8R8`9|@QOOBhtt8Q^=WKVA~FmW@3HVb`GzI?p#v%ZU#!T zFPkGcW&>wt&T*#+ezZ~_Jb!9%r=K^&4KMlO@=aI#VALx)oyDllUYz~S#HvA`+~KSi z9QDfzOPu%jGcoR-XK6q~7>sWCFk15WUH1*BU2UIc-m1f$daUx^46fXr-RT8Q@l+Qc zYLH8Q7@3^riFq>vjDIyb_Z`ss!_10T-(fRO1Dw_79p=sOpox6AKF#Wl-tiSD7YrJB z7pGol{AouQwK?NyM)=`CM{(Zaz{9cMJw5aOb|$vGxP70QA-Q0thk3v&JgO3|by!D|y zT<_|@Q%-fs%iPH!{$^tN!uD1_-0?5B8vO3yC8u}Tu+q;xO~i<`w~D=)UZ?{{@i@r; zai+iG;ps7qn~67r-)3UVr6#eycN*H`?p+ML&S~dNr=K%^diZ%pf4SvUqt)Hb_%oO{ zcQ2XemKCyEiKHMH+1Hq9yLvy(^wm9Iy4nAn-K<{m^^T`^rWV}4%;4S3JFfie zC7tM%-eRi>udwjCS={723&0T%8dc#W{FyM>B@$Jl;*uF)*Eo8@x_7OR$7?}xaJ;De>lnec}BN1kS|{N>VA}h$%&hs zYX12+tINE7o6((#gDVa{J-4qnILHrAZ`I%T0Gmd*!4dBrt{U*r19*&qn ze!{>F2mb2vCO^%c=_rr7t6d&EV5o^7PPD*PychFB~=U(_8Zg<7P1V;LUC( z7GEoVW&}QLzP@d5H=|Lt=@kqv6dGPwK}V}nqhpK!MB$SZyeM>D}9iM*6`hzm!ID*XP9c@56e9LHp9yw-thSF zRbz2-R=*j5+i!(?d1|Rge9)RKNAd3|CsgraN4gHqYDN;|?a?-t6V!3rn7U!}_j$qwZ;wA#s^n8pJq2RlX&9aiWeVs zz{10Oy!f#+Xs+FflgG@t$MI%x=xK#@GxNgy-Avwo6LIJJGSfGEcQ>P*+_aL*yFOaw z!y%t?ntgfG9v&ZB!j-#RFvanOr566qR^JQW{QTYQ+e}Yj(cU{f+=iH7@zPuVu+^gvV&r(9(bS!JbI5T(Z zfdSuq<3fAA;ZIjF=1Dy;)5sf6^0oTyODBDX7eDuM!lyCZKW1u#j}v@+<*!b8`FIm= z)>#;G{F>2558&VI{p>$y^~G;EF7$*g2i*AMhYwzS`X0R7SC@Tf`r-|jU;V&OUMpVo z(JvS{Rr75x#yfwSsuwrDKW8^{$JEM?M&4;G-WzSa!=RP#fG)+#5l_7M(l8zM;PWhh zxaw3FJh|{nH*a*h87|K1x)}}(SN$+wzDXR+s@%=BSZ6(HHg0=dk#mhX86hd+EhlKaCX;zvOeBG-xKK6_c?l-Hy{N4GzOCRwtnL6b9KBK|CGBf2(Ei`>U zQ%^i;+HZln`9evd0ds4qRy;RH1(pMaf`Rki}Vah2NO#aSaXRz*J&a{Ec$KE?U zyy1(ZDg3@0xbB_RAqLktde;x%w*G&ZsZ%ZP>BLtr@q3=Zl3&i>X86!u9OEa(T;EJi zSYmLIlfT~MZ*|7+{Y;$SD_C-UoWWEZKiuemvl)=T8sy?D7hmscu&0Y$FmZS{(+7IM zliMtab;d)kYJzLeAE&38_nW~JE0>(|z|mv4IO-Gq+{OL@iNOH1$c!&$A>Wba-snuw<%J*{}d!PVNgfRD3p zQ}5u4sYke~!#%&7eR}NG#!oFbqX%8oLY)>^c=HkKorz^;z`NfI8p+`d|7K||55Dfga{fA#_h!C5IP%a}T`>9604860-%NbG zz0rU#&NQXh&FCUOzWkiwGWzqks#|WW+2QMKFDE=P;+cCqVauH!{NVAi&u~|-vpM0< z&#G3s%EM1>dT9MM!;!&shg(|EtXOaKH`g$o`PCn@doz8J+un*3E#=1tzh+ra<&}d^ zGjrR+H!JC2-#p{!T)$`u6CZCl)+c8<Y+8x z=3N}#&08}r*T#0Jx@yEjJ=G;A zo%j{U7dJlMF`>(gWJ4ATk&XK(!V!99)Oxq~lW9q`J_&pTf}a^6h+ z&c1CvHxuW~2afLnPxm*2;T?Z^%0UP3ax@dx`bBTNX$rS_6T=V2)9gQHVXEV1*7)+L z2OoERt8l%^;dkK6jGyn!8?D~X==6S8-Oj(w;$MGZ%j=KkW|S6xo5}NT#s@C`>XU~y zI9Y$6)jL@9k{1sCa`NeS6?bpthIfy%ykcO}*eaf{dv)B5-g4-dJ8z7>IQo{%E6)1< zefIa6-otV)FTOBvYcJNDdwRI1HO~CR(%addZgSHAFLz?~*xiSjx^6~OZ!qJchxC;L ze;EFpVaQqiYJQ%XA=1HCpl@4r#taXy*KkN{@V;! z_s(+R4^uo%noBrz`S*-}wU&ebJxq=E;hHi0nBLM2w%peL!)Cqh*m>nj8ilPxDl_G( z-ETnMc9*S_UA1pE>iyrUV-(g0BpRInF%Kkz!QlLt#MGyWIeQPdi0hkI+a3?Sz>25X z?=yPPLVa;&=J(W|W_n@py^G@PVesJu$DOl$XT8XiqqaD;ZYCB#cXI6MfuC6Y!{DR6 zT6DJFthZ(_7FTz2X+RrqUk+?Bu*BfR#H#VfOy9Jk_04eM*Modo!GdXyc$fj5BW$GhuyQ4i{=!|2CL}o zD}BkM30!eEgG~=Q*uS5NNdqe!cQ>P(e#{<@JU!ivR(Rqj$BgBvFBbmI@UXXv#}`j~ z>&>bm#@;sq6K|Nm&eXLxTNrdx+nn&i(S7*h#ilWAm|tdmzAbp_sl%uL-j(=jilM3A z#Od9tFTI*enz!=l&+mX3Z^Z2Gv3G`x15SM-YC7Y6Gw;qE;Nr%wUokhMBQ9at%T-%F z`1<>6hPOC5`lAos=xFbb!4@muJ`MFr1Mj%ronfj=(`HtG?)7gj@SOGH-0z#daDro= z;(pH5b*Ba%xS0_@4R8ocEWcjpC7xFHG{9XQaX82o?=CFd-KppMk|&ng!xE$Z&2ZBj z?(p<;Go0uu2M>7ky_vrCKwr5q;KG#S9ekgu5} zyaznw(nX%Ta^(B1!x=6vV&v!x2dg+HPOUU9$Gy7FIErznN9In>&C)~+pBn0YnW?QF zj(QQpZWgb2&|8d}^68;3nC|#s=l`%h9~|!mCw_5pgHsRi^dJUq9If;fCr>~8F!8<_ zAD-r?A3k?DKhNC7Qw_a0D>|yto8)&^;~pzboZ-WThm$*fsfSy7!V*)ja{ip*=w2LO z{rYa?M?bT~0-j_J}zF&GVIXK`W_i3h{zHde^IBJQ*k*&N!Ksda(6+Gdl6R|8>@Tb;tKQ(*x~ch@*|aPqXxJhY#-QfrHt|y_x#(?Zv_q zE7z?2iE&TQde@U)V11e4uZ}!tet9&+mtQPy{U*6H5B2@#luL6wVengUmlWT5b_~hA#`FVSNG4;IT`k;yWu*BU=P2ApM&`G{{HN?2X z$D76HX82fXWX0L)k7o2YBQt(KqpMlrq`r7qR(+&_7#zROaJR?N`|YjLSI?{%y6~%w zKU{MX`(-BI8NM@pyx}y}r#$g`ha*<+R=vx^SstSSOd817msRcfc<=JX%eT^oo^+32 zT8LLueS3Ifs~L_Oa`nM**NYiD<0Ky^d$rW{S1ot)tlp_O-we&whoioDdo_Qbxud(e z+)RIRoyFb^k2rqYUW}RIgty-!eD$N2d^P%J#nQ{%>Pw7V81!|oCv~iRdhrh6-poCm z-Wb1lSo(B-GrT{|s%Zx5c*D5jrDwl0V)TO>9D0bQC0_On2RYsjZv5iq;ppBOo;dI6 zX86hV4)Ib;ef`qtb>?0z7}bMAclh>d;4WXB`rl{#bf66rr@nfy)OR*dyqmo|Sh(Q= z+k5an%@DpE*!bZhpHFZ6KW5EM94wej-88X^lVe6WI{z^X&zXL7FiSPXxJJQH+jzX?!@W+e`f0H0XKETT4{!ZxziaY-RP%(vtsi7(G9Lx`F&IP>eCt5&SGez zHotp!>fnMOF0_MPpK37N^db%p4dlX63x<3ese#wc;t13Ec_#kbObs0L1z&CWa`fq} zhIoH*pown@55Ak}Nlkp@z%~PaeE883raao>D*y9Lt~{&Qd#wC0@sfj^{>-adda#E_ zBXRoe9l+=3yP5d904j&J0Jma-DH$?&|9MX70t9 zD}1rI+#ACScQJf&)Q-2kd${+;+{w|07#g@!+daD(-Z10Kuby{_+ix@2dep-`R=j$j zaO*`M;%H^w^3-xKr*FcU-OO8(WAw~m@5eh3(;K_(;mBvO^ne4tA7}E#>xYSp10H&VnI6Tc1;bq6 z!qC&FnV6fI3*%>BXML~YX#&Gu4ZOTfz0uX3Je>L_=pd%=kYB7A9P#-%(-)r}`CchZIT`_9mO9OZC z-OItjOzqVY$JAyp<=qUny5eA}E7$72@00JZ$DLaI-hvo)%(i#O?|sIZZhWk_hARvj zn}@x(YZXV&KV~$8hqr%!XdtIKS=GlgJbLPfiDfjsnOg9i@e`|tdsyn|i(YZVhfeV2 zg{OD5cd;>wRwfpIozoFYf&eZg()mo9#XJ@3x9jQ*CcRkFPTv)YrG3+}q0$ z_sh&3KI)05g**L<ad#Ng!(;DiG$_{G|LOK`+Hn>9_;p-Fnlr?vRrl-lyd zTgBq2ceP;XNxXacYO|Z+Y!#>W^9+t2%vycg@QI;0u5|JDZgw+z@G(5){5ms#8k-@X zp6PKjIk0f)t$x_P@8;X~V#`TOD~@{6|CgCK-v*BI^-c@?)q#%}ooG={?%?Al2N(GA zV5uXPE;sA@qpy4MF!TrKX72D(i{|M_GhE%_=w6KYYIPPX2DTi0;G2WK^dpw_zTn#T zUi=2!OfH|k%sYMjCeZ);OkVl!)put2(NK(B`dM$LPqDDowc@NFXMSh#=7p0!@TT{V z$13(_^yPOJqt?yfz~K8b!-XF|`01@5Gs9UQa&TccGiSQfkuLQu&O4QNGkxF!3r{uV z(NBGMYU9~ly$P7lGr4Nv1*1Ch_2Az*W{&dtak?2y#s>#CeAE?}k2Y$-q=nkOYjyEe zTW)itw^+5TYRlIjOMmg^9!ZoUCae245>PXS1-0)f4>pGymqn>+R4k&2ar~rkCc~ zY;iRgIJm)aCr4d&Gd!9zE_8xr70<-_UBn$8u5#i8Q>_n=J25zkvrj*7(|l-xC*6LX zJc&h~m*Lsla-z2^9(+v+C<*M)7V&;rP+B*AgoL^@8fbT38%lCDrf4TVj z9@83kHRQPG#{oAv>NFGBaGhyI2Ys-cbyqHKwEsMl+g$N*)-S#EM`v7Up{~8(7xxSn zqa8oK&BC5O3rLED9r3XArM}~dSPmb6>~Gb_^82e25{)&d^0}(E~wA1 ze?7X#8&~zjJ6A(2e&TP24~*WVJxypU&O2}x4;#JPpgy{m(xvv}Cz-KF!>_PB|; zhv`?o*?Bkh=uQu?%_Vy@K~Mg>7vK@ z!gi*c@0Q=YYd$dW&=(GRy%`PgWnzDs!TN1hEF3(=>PsA+`0?FibqB}leKYTksR`E% z{KnJL?BJO#Y&G2B562xWef>47mic;{G_vAzGd23I@OMui@oK||=d6a6ChC|aZDHc1 zw{mcKd7Nn?K7752qr2Mf)zKe5;>}wQK8#NIy; z>C`tZ2S+vk`B>$uVTIlIjDO!9Tv+a`V&J$JBaaV`8Z@A_bDGO(CgO2$?mgZ1de%P- zdoz)5F5!5qdNz|d^WDRmle78#KBFDY;ibR&YFO)EZ*bk=dox`82FlkX?(Xz0PL3XE z;mquR%;4MOM=yQw>p}0Zo@e^-9f*bH`}Ah``Sh!odc&hUyx_@!?fZct_GzXcxHt2D zaPS`VhdYyR6^HZtnYzyA0gu6Vz8NgF>2NdmdV)hQ{mQ}J-s=0L9S-=Z1qWxd5%12t z!g2>&f9idm#S;cU{F|w(H&`%mQ%}Ab&{M8EX6|zNaY}FZdesXad^e*RU7W2jdKcng z%e@&NY#i-j%d>Zfn_P3fnVHJhr_&hu>%3>c3`c>xJfTdvPb;EajVvv;93x4K>vXKaP0AQwtW(`m0BE zVe`SH6@zm#f6eb7+tXG(Ik-O0@NriynwSqv`0~?DT;C2(c=}V1Uia9`!$(hYV5xaC zy_&TZAFEjTdc_9^rnXhT_Hcd23`ccgz{W)#{afG8O|Np);5UDF>iT_A7xwGSjNGe9 z6SKxq9v$3yFYs~lR_c{szp$8k_}z?8T-w677bi!oUe$6|gQ=^Q`RVay{OMVpddDBG zp5VcyDc(4!i<23Mfx}Oer#Tkwo@@_^G zd-2V?wrX|`s0iT z4(1bYZ;GC@m*<_r7po6>W?>HS>;3EY;{SUlPQF!~Ug0wOx>HlGJ-nNV#}8Nk&hX21 zw!*}R&s(^eyWS_Q@wC!Fp4C|oG=!s$Gr#(@vch_r(L^2n;K0;)oyqCW-dhp}gZ9l* z&6gP;JVsZmeD4nrE6xlaetI)21{bD#+UN&{J;Paz?!~FiR}C@d3&(rKgNE*^DaJjG z@Ph}7`JHg45lpi)OPtMJj67H{#NEU6;7)COx#IAXgDamsfbr&_qf^8TFR z$;HL0zWLG7S#Nkd>&+Qvy28+pH(@4ns)aiqa&Q%=o?K@dq?>+J2|FCK3- z+{?4quNZe?>WAj;;NYt-IW)SNUYyHINBJ{3?+IipU zZhiaqdo%9%=toESR(I_E45!zb930frgWNR2Ax>!n(;S~?c*DhsPOzJuy}GdYdPj2K za)FP-&HgnL|1`s=xp))uZf5p4xWnH}neV9i%H^jwJUFk|y4R-{xw4+ujV+aCb9YKh3;3++gUJ z-`SoI2ld_e?<0-qXEtK>Yvy|YF>Bs@c;VyQvf}4Yy_Z?vVmjUKm>%KFyO~)1%hxkL z-kZA2om%t}hYOA5>6ISdml=q0$I=sTy_)MUGg_I!=UFol`*FsHuX`ADveyd?yv%}z z_}+|0?r3SRub+>-92kBJ@TQHkd_DN4y=6VqMXj6RgA1M1R3E-OGv_xe7FDPu<>)JT+j`6JOl<>2@<*#4-6dQ;RO@;eh{#$5|eXn~8&M zrHfkf%vfBwX-?Cdsc$tSKCya$>kgi`gAYt+I`E6fiMbc!-pb&Z6Th?fr*~)E(g%K8 z^V!ovKl1deZ=CT{>&MJHb&rSdrZ;J3c=#^Gi}6)PYS8cium&rx||ya^d(stZ(0r zJn`bZgX+7-lP++~$!zGS9**y4V)S)08t^f_(DTboAGpbZ#~%;+I_pcH{BLvR%Y)r- z1Fp_|cv@lTQ!nDh*u%$}(c28w604qm^>B|pAFlj(^D$U-a3_zJH=~)Ehf|L@@##~Z zx-ju=hWLnwuclRAJ;2n5x2Qkwmo|FG1CAJm!|Sa6aMUwgadL2R-`nPw`{}WY?aknI zGdWfU+uM<2)sLCL#~Ze{;5$e|_wv-Te>c;Mw+qAGTD{vIuDX29w_e2JZ}o2%OsiO0 zd2=^&=EDgV%=C?$Gd<}oPh38H=px1(;n=$muazEVNjrY=`b&4;t9OV)@0$FvJ?djO}!mqw~_35L&@6%HLhbw)e;o9V+|46gRiGdy74 zOwaYEt{iWlj(DpX2A=Nd2t%CSX(`X0cslUuN3PoHrZEgU^UD)2Pe1s;bMAf7UvD(F zr;Av*&Ul-HT2}q=!_}vIx>VN;)QG#-o2jj?J)b<>^&6k+y6ZiOgN?7g;h24Tx>uhM zp8ERt?TMuu&Nw;Or~bTOy6ejv<^DC}gLyNYVA0d}3rmh#>5C8So2jS2<}Qy9zB@IV zp)=k%$ziXvo59u_ZOlYI9DL-sht1^Qj9(tTV5{StHn+WabG72~<*}EePny`nl*=#w zW^d<8AA0bsCFf-ZSDs$f!Qp1O(e1xx-VHwu^`&mT%Yh@7&sneDgZjQ5Sa0*)dk_74 z_P6bEmj7u+KfG`ehc^!D%T>$D)YDs<;&!uil`F2f;6X=uFk#`S*1MVa@Np*o{Y(t4 zV9)}ddmNiz`oPkM7;81HdKKr5;N}gAgUOFSJoWV~7B4GYcQEkA%iIXH^p z$KSoTVlMFHG#kC$42C;rG2SlT-i#SJyNA`R;oVFvD_!-&_~hzQo}BNq>fz=NKb+03 zHzpTWemM8IGjBPxP**Sh;K{*{UN;jb|bv?sS z7q)!-)Yp^!&zait=!CCX@xf5b9j@|e083ps-WETd#me&yyEB(}vt}dDyTXhA+pM>u zPq}J5&*%q74qRODG%Fb5opGoy+KR=+eAIDP3vc-5$S+6j-l!N_!KWkN>rCH$GyL+r zE!^PoRTm#x%WcNDy&PKLQ$GH5QO}B}x^%@4pJt|adZ>FdxwxsPmK=K+_~N5q+`NnG zTJgYJO?ERF?$oz3y;@=Rp73INbgvgWz_sF`zTVZRZT-+a4dCiUz20a2%55h4cb5Be z2Ak2W_kw%9i1mh@`PB>8N*A2P+2f`@eZ^b#r!EfZ!>31nrdN7<`&RL4iFZzy+diH6 za92}&vxKE)wVESrIPTRqf3@`|-%McLOfSxAHLrW@)p3WPcsQSC%~=2Rg-OeM?BV%+ zQ5z4dSa`I-S-cqd^kvSp(yKEZIWTUfFY|M64si9%aKulKA7?K!Jk|1!X#qc~lFT&fKpR~WrJXEE;l*1+{AR^H8MroVFBtErA}Qyv}kOD9}$_vYdA z<0fAZH|u+_7h_FVeZkV3JX{!V^4-CtnObV%<8A!@II9I0*WSN4xHofeF7n{&G6K177Tde(hJAWGx2!CkEc1%2A(*E3xB%8f&I4`4lvSP9UAGwJ=4Eh z?`F+Po;$VS%9B$M>f<6_ZE<+OZk5Bt;S;}a+k3yT#LHJN6Gszs)T^@?@!pD_eUE0M zt~mF;TiUl*S1gRUzTTbjgy}4gE^y)V!QfK^kFe<~A3uA(o6(*&_~^CXd!O*d z>e>5+Cr96Wu-MJ?fQR~co3DCbXK-=SpT2Q{2~WJ(PqUjj|27jN);AyyX730mX9gP< z47us8Cm1*5SNqQy%$vb#e#Pp=o59syK27}=>&4!;0PD-+O#gV{LIVa9KY29Mhk7>? z*R1cgEF{NnxR_WH$*i5Js*r6-=^aZ?{&=Xx+JI?Z&0I zU-5GF+FNmVGdXy^)04cfVWp25c9 zW_Wy`@q0hspm?=tYlWpQ({tSUan-+EKJSOQ!;hafR(ZJ5z_*7lO!4aAz-Qn8OK$t; z8Ep4@)t5fR=tGb2o%z*H<7S`-`RQrzeKuJcq{I7 z_18O47cQeey!ykP>058V&+uxl^!wklW<-B+tZ$o+a$5C+mpXEBH_zUU*!MHN;A_>Z zKYj7ziKBdb>&;-u5hKq^Z>DbZ&=byj_wMQ5Y{fC}P`)0;(G^d3?P=z$2j3;k@~yDV z&YwLV^+Y4Sbf-zR%!)qz@R>Mw^@vmTo|KqWT?>&gErtb;Am&cuZy1+C;{CmUlZYJIxA5QoaB<9#Kh2mOo3OT0U^#H&SkKnYQp|GVUwfUHN+zfvh@)=$A#!qh;;?>Zvy&mo3Vn zPq;Uu0j_Xxqdgpcn&5XceEIN%X$I=L7muGepbjqVX5r{nef6GaYRQ+Uj=tdD49;60 zOy|GPzRZ4|iFN0F(8G+HRqw+cJ*?u@pc@|UtL+Y-n^mK{^wHzXOnrRRy~j!yHQ?xl zmiiV)9~kUu=B?q!56g<19>mJ^w(1{8wdKK62bOqoYSJ1G9_H&TCw<(vS402!yMv*= zne_eN_Ufdo9Cz~crzU*d=w)7T;#L3Zn!9)gQ_pH!onhF+6|W}jdt>URmwkA!&8eQ~ z%Kv?KGjZ~q)zlwu>M?uu(;t6WePej&OAT1+c_;M6(+Y>?xZ8^tqprQV@%wII+)S>z zdWJ2YhUJK(jqlQLk~k|IK4*Ax_i zZdSF~>r5RuYPo}_e(#7+J}i59V)UREyO~_P;EV4&Ra0IXi1{>wceC#0=wDrPmV+BE zc&3r>hYo4w-w83!uo!Oeaq>Q#pC4v_GdS?|gDbt9&5Nn`+YF9+#aj8~;AtLKI5fPO z9Ce+NAJ_PtL$^^Bu_m49U?#;kG ztf!gY>Fu1}^z8mf?aK^|MM!`Xa#$Lisv z225x9`e_e~9#%6nKXZkp20rrn@pC8N9P#h%;HEB9%M9SvpS*h*Eb;DWFBUK6J5v)b z9QpY9H$-o=mW#i=9C2#lY^AL^;_GY=^XH7tH-ibMcj`>*xZU=2RYy6Ud^!g zMi<)M3@2y2;i_w8@_pOAZ#}4^p8jFWr2&oVS1;n+%fTnkagv9xe#FSdj|OVWRfjfa z4O5)^dZII2J;1@~W_o}R>t=B1B@f2U+*QN99PdP)TKqTrGQ-Cj->2>Ibq^N~KMm;k z+f2`V?(4}M@DyjxFx1oo?(n^ho9P=bKKZ>X*f8-dhM#r}cQroE=%a?e-h({%>Y0U_ z-Qi51&$Bpg`=2{C=qv{(e8h{x83tao(Kj4*@S%@*cj|h3;`2RkkDt3gW;pd0)K!nk zS6@DD_{>dRebO|1-z!X<#rX#1;?f-P>^rdX!xAIc8%RUgaLnuFao_B2XMEt|s3!jA z@NNd{!^7b5;R(l@4z%OPi>`Wt88#nI?qP`GXYTY&=iZ~(uQNPx_%Wjw9Cy{w8w?uA zHwV3XUpK?iTX(LO*{f&0#~vOmeWWuz)uz8baf0W~$X83AdvWmi>|xMTZMioKSBy8| zUJV+#i=UOxOsjd@>s$Zg&56&d9t~m90T1_Th}V~S%76QN4(DcJ#2Xe2v&5P8ru7U< zuKHGSFw|mjeCs!JmV=x6R=vV7lkYQ}RxR3@EDC=ANS(^n8|maHgNTy zX7||R;V%B}#fgWFlR12wnX%e<;NEP-cn>htrh~d-;ES&>oZ@AbM<@Egmm?ns_ujgE zZ^%6AM=WgjI5kt8-967>$x++4a5J$qf{VYm!H0|4nwR=wV9`|_cW}e!$FKg>fddbY znm2Q{r=eIYzr7rNs;wU@zgp=a24~u;r%$mo7w0Z*tn`FUCq6iM`3*?}HS`Ws4t~rT z2R-t8Lu&EiQSWNln+p>s-rdc_TWM_Hx1hdQHQ~af#XVNP5%}`sA_k^j=qOho@WiOi z563*bQT5c(hx%~jh~;;$rZo<}DSH^S!67Z)_J|*B{mU1xHgj*qQGT4%_D#sS8J+t6 z)e!q(rmnXjuh@EVhhJ|O2BVAqy@M|^F>r8GgVBk0-U2-F?rHNnOAB}ERueDhaOq%= zqrUlI+{}HP%_j421MX_RpWz>Gywt*rX1KtRi@%=mrmK8?_1&n)Pd|IPc;PGu_C5Au z=pqZ|?5&u0OH(sRsi$c<#jD@Oh@TJH9x^B^>$Q3tr~JZU!3`Y_aN#h3C$y z|CgCM#f$aZ}hqc$8d?EOp) zT%Etq%+TH)Og+%fduWd4!OZ4n{=_-s;7xdEF!XgZT=dpAv+aL)z1s@+ql^9F{$U1- zru7CBSNyHCwr>WvJ>GcG>#rHyw>`uWmiPQTgQF%a@%lFhJbfc_817blnvGoXX^$7b zp2gChPVoGW=%;t3KX-cV?zV^NozqdB-b-`p{o$$(jm5#{dz#T+Kg}OMJe<{}6K?AA zc|+pWe*aj-s>!b>J*Z{hjA3{)c*v*4&6+!oF!7@?Joq=$qq7*=;>6(4U0&~{e?!&P zr(WFEgLpo_3(d#*^9(07@Pv(84tzejYF z1D7Up((SevkEcEu4DUgV6?Qt(h<5JuswZbTa^2x9kLiQIe7xL=(GNU#V$#VuK4yjU z&1miYyHj629}Vwe`fT4D!U?}>SZRPe9OsvrIIF(BC;OYFgIe!r;=K*^{nn@{S6}+% zQ`^euBG(;F^sGKkOrCsP+|!29K^}YI5o7O8EIfO$xOg{m zaPdvS=DUZ9Hyb*LyO~%R=~#{!cX-m*y_w7#-T;jH?k)69i4m*bzh^fSV|8!ldQi{r zvHCQ*$DYsk%@6Blcv;2c_d4@E;3)UYOmA=Re(p@W?=xIsz_yBo0ZYFA(@f9e=%XGz z{Trem{MCekxBbT%uJyr(zkIyl@tYYQIHjF?XFTW%1K!Q_f*Y>l@qp)dQk>l0R-Dq_ zS)5!v;QQ-N9ISK~10NSX+TTpP??fz2I#|`0Bi}snOG~-U?Y56IU7TsnFW+qFN^klz zcNnOd~4!gh~m^>2GMa7kBlQ%?-LS>L;R7_`Be-yLlKzR)xsdMBTDXO8OJ3}-VI zC-40X7QXUvafU0$UQRmcPe1PEi_y0|?&+s*IqJX)*PS_qr#EMBq8?}o2dA6iubzI@ zakj=otbFr@E6%La|Ht-t;Ql--_P6bE7l$9t^@3Ac!IFP(OdRg%00XWXxZxpR4}LG@ z(@LG2$+a?d{odP)6Qc+Du-t_Si{E@1ZZ}i!bw=x((Ma5vnOt}`>;1aN!M$E_P){v) zR`>Ab(AL=-=}ry(`Ay}QW2McXGx0R>t=!Bvs4lLI-|9`{8h7zSnVK;8 z>e)=($@SarY(DDgh3P|GtA6!FTXkXE>&;m{et4;&rd*g-`rZtGXEDtCl8ZA;@7nt? zH@I{&gI{K_)D&|wIO?dY5Ak^N!%IK4<+`V@KJZWvw!PT;jEmm@xbo!lGjG7zD%RcS z8O?BlCr1x@QOBQt<@l>t+ZTR}84Z~4vy}>khbF;?{CNodNv^)1@d@?{2J&#?5U z=KC2u=1-s1hvlpXcyR1#Nptnoy%|3r-Qt0_e&LvbmELmf#oOb=U^G*HSoAeZwfXJ! zAy;o=#P(e}+tWl(;$hs&sotekF8=jWKXPuSUwG>44{zUzz1nbb?yZQ2b&pj|e(w<`o?_^yKlNM1-mIFi z?e${C&0Ds|L7qE(#KZl|Oy3NqHvT(I5Sq?n~+Z%bKtv~JgZ*S(ucKqTE(mL zZAJrF^3_!nKY5>KzAy8}gBGyjW$icUZC&~B@l%VoS#Kw8`QeClhqqkyym$S6ncYl% zZ_E3X=boRIFmBd;v!)e3-krTzd3fK$`aQAYiHm%3W+&g?9Sj=M!Ax<*M@+f5J$!ui zKv#A7#ar?9yF(AyH-p2+)G~uVW@^Dx*E@lwo-;E?ewfZM=^#&>d#gKK)PrH~Pmg-n zoA-1x-0=4XaDeOm%f(MDzkY6JcIwc?TeTMpw>KkRt{AI(J>CpA9Q95AdzkrpgWiL; z`hG@(W@Oa|Y@G3w<6e(AJk8XSk2fsuNZ;z>Am4Xx4+BU2iuHE%;jD&w^{M}IVAD!% zvlI`@-h6uVu-u8WPb0kH(@qWf^k8u4st3KKojZQ`y#YPL4_A&p7@uC{tB*4c;Hc+L zEx9-_es}!;XJ&RV^sZl=?bY`?AlAM&B8H#QxccU*p1IRgO*5mDTy^;LB32zUV|u2$ zymbG%z4*V))WE}>ZzfiK{mZ?XSaE!6@p=FF;==Hw9}aZ58BOR1M~?iDGZ^;xiKmww zv2+vf9uKvxuwl3l!`T}U15dqrlA~Wfy~D&&j68c-Hxmb+&s{$EaP>(an(G@+za`@J zKu>Xe?$p)~&F~W=htAHu6L_Cy;%Fil4{_qfiGj!9=m$TV$fMarJ8~~at~ZIBy*_THo;z;!(i_8NxOQ+Rloe^j1ND)Vw)2jwarDYx_Ee}?r)|Z zoa$R)sG%48o8e6_7|mBbT8YsM4mZQuTNFnJHSrV=M@=00#o;4|-yIJ3*wfuyzRtuj zy~`8d+k&f(dpz0unOZRPBF|ZG{OZ`N&tQn<6ORjR^yW^VYJ8t{=Qm3Xzf}!>TG+d{ z`VMb~Gfk}K0u!env*xQdKW@GS7`VB^8CO1g*f{y7#ify0{JlAKZe|ANCk6+##kkjp z6)rw7Z$?k|e)DPFJ9LI^j$*{)CAWU9`Qh`a$#BI{&uZRG-+f2!@qC%l^>rp*U1xi| z)Kv#B8tG5J^i~6A_|MzduW!b^w`C7g?VHgx4XTZgJ7<`1%YR>U4*5F>w&1K3(|5dWZ5DP4Q9}u6%b-GZ^u~+g=Vm>CWf_8*XpW zUT#{z3;(vqDecA4+zRL846b>~@hA4(j6Ql`IN)tBmd|`|)^`R6Cu>}8d$H=-y7Ske}9~DcV{ifobA8N=mOgc<7Q@xmpAug=FPynnHtr^4R?lv8rJsm+^L7NJm#J@ zcz&Oml^nW$nDvJ7>5a&TB%@w89DJxL3~`F%uZD>~Zqe zs+UImaOeQ5x2r$6pJq7FLykV1lRNr|lgEdj{ms73=p`mjRxxx;H}X>QH*kKLIKyk-eQoIdK;nJ#*64*C-d---{;xKvw@ zeBPV8o2f|)*!a;?j(X}i-wZD~>bbYNgZEa`+nG)<)E5Vv2JYyi4var%-hnp=N3GsA zE%iVvd%eQ2SNFrrd({)H=UKCZ|9K{^Z%aS$;V@jj&S0t`2bT3_@_n1Q;~}1}o?)pk zSAD#gx%4*O(?F~~;hU@9C|J1NtZz^~IrK|sIrugYI?<4yRyg27d6E)I4`r_zO#6E>>h?66Q@Ue8ij)&+<4H2A4f52zs|g8dYE%LVt<{9 zH5VGt$9(Q#^6k~u6aBx>#L(8CZ$!RxaplqNX6YeDU46h}^&^M>W@5Z0ob(YlbGe7P z_q~~)Je=r2M_AsDy&Cdq0GAHlqgZ@l^3l;8oaH*h5o1p`yzQ-eq8D=)7GCPmL=9ND z{hZ0cm*(Qd$;VH>xXQm7?&>rjarn504eK5zj^8Z2f4<*ldQs22^oHb$p?S5`bH=4_ z=eCE5J6`sB(Fd*FsUcS#d%oTRKRo&MgNHjkSoJSQP5r=u?f1_a2ERDH;mBXEUhHq? z8}}B(!#59{3D;mp!s{jkhMZ&r1zW^yw%;HmNY*w-V@ z_qY>}m)Jiat3A#29XB{M(Gza!+BXLroo{AuZf3=go0|1RkDIBBGhF@2yV;MKdgdYz zu9ctR2^T+l(gSBW;^4pKiU$nw;>=u(-hR$#%3%8qOjEIG>RY%OEcxn+_nXo;WYwcy zZl<0-aH6M~!@&)<`*Pp@uE^69eD}_9^=yTypXV7IarW@V#!tLH`R&tL4*M|cU0LO+ z*G&5U<;iFIHy_^#t=#DW9zE5%$Lg#PoStTM#SzBGnLgyd{dcE#<;^gExQSQu+vAKI z+~RQ%rzh`55BgDq_I&lvZ*FF2?!V4@qgL2z$-SALyw$$D_uIpUBgWs&;OoVme0{3h zd%Epm=!G6|)iWddiSs7J$iJBwcjl`{^MNl$jyQXDaiR|%dU%<+!yPt0a_L4NxZaZ( zoNlHk@#@&a*Mr{)T%G0PVs`f4A}lrW5a-`9HTCJN4}9U82hR3!=VP=`1D5GpVII3+{`0&GVZ*?zLU2*io z12^@(3o-mSsmG63HJru5rUzVnszX=x#N+*W24COq_2Dc&eq!zU>Ol=X(ML_SN$ z&dk5hZYH*w(G3<%u`s<$_j;qhUirNTxZ={LyxSe#`j_wC{M8YwZ#sI%)w}KSQWGY8 zzd=@<)s<_mu=(WUMz8v^-b|bt^r{EGaLu_GnyHPSJG^_BxVm>oD}Ffc^hE=h_8(_z z!4roU<4fB#fRCSic;b97%zM|bJ25cb(ZvkBG5PNvd$IK37Y{=n`oQLMCyu2*9sLf7 zy_r5fJoetO+3>0F{piDdZibtB%-f)!J-yATz1+8d`oIydd#rNPz#R;A)no9)=pC+p z)VK28%zVV)Emxm>%r~#Mo8g16dbpSiKKlE0CeG|&sApw#NCoQ`)@P(H&cV(s;;$p z!pFxQZ2bIA(+3{@?p|g%#uZ0-^40U5e3`-bjq%BaDThzKSa?q}_v*;ej~IP2J;^mU zZ$_RTV3?yCa>S^Evv*l7yl5lN>a4Ceq2bx;x zs0aA=c)(IyzqH{Kqo3+o_2T|!_=#nQ z%l2x+caJmQ>nyGHax=JMaHfS=J-G`PmcITztMB*Q%jKiL9A~o;iz^JK2fc{9S@qP! z5w8z3f6p`V?3c&-x2^jAGP@ZL{_yLasHcV%7r6Ff)am=V?cwPYANP3Upr%}Ru+)2c z?A5`6M&ixD%;l&i#y9Pe-_E1iRkS(W*ZD&$Ie) zmdCG_9@MdSryi55FB+-uF5UR#@WItLe{+CSuWE_YpVd1N=l;_SmfHUK>97Cz-1c(t zR$s47J#~Bwe9l&!)uu=N``z%S;ffQ(Pe(bvJACRB4>@=;`)bP5GoI#UE`0d5I$Fyc@n^<(fUeJ2m9p zOpoH7X|J|iIqIs#Uk(hq%H#J9noGTiH48XaSn0@T?`@j{-ui?oR(<`Nz5FCW zESzos^BdXhalDyc`;EudjGddEmEl5<`m?I(w+9dP`1R-g+)U5)?koqE8gk_0F5cO_ z9&aYDcggP__a8HLn0G-Ry7h0ln(nM$W@^&vW@7a19m)MUGYdR=i?qYpiqE&1p44{F z;NS#bjQa3yCeJFa9Qpd>D^5Q&Q(Ld@;j#L*uTQx&g6Z3V5BFy3Gno3WPxHKo$y38@ z`R(P z!E-iCn%Ik{gFf{x*DUeA86Q2&1&%j~8^5`zBZn^V+%bG`eVyG*p5EYno&7rdJcH?u z-(Jqm)PMsUU-jx)9X;b~FV?CjakLbxCw;@9F+c5a=2HtNKKXda$E!d3_b29N&Dsht zZPlcmI6j)FNq7B;!%baxG1S`^3jtziD{e zznfWUU_Lm@f1bgBttJdL=}T*P;&5{Z)4duu(}VW}12-{xpwT^6+TzTYesJY682t2t zjSD<{^eKm*&-vc$of+P6%+`tv4$k=W4&0fMxvK*^TytDh8(FzU@ z@|r8Z9$}cbx{Utr;fTE%4b*1zO-K8i=^qQIJu7l zf3@7-%o;!SKF#F9HZyo(-1dymd)13v+Awu!qz0XEjE8+#V&j1mEH&)qeV>`nzh-9s zb*3k}iR=BUM=w4xe7;8%X znZXy^yYilKmZJtPdZvLH{q|#?gct7RSQ=GF{ zdf=)@+~nf_c0OX<>su_1Bm{0;+*k$o~h#=ra8it=gdbJ-^9)M zt@6@aExdh?deWP-y!6mhe=uOv1in~UFwMi6-t~(=Y9%{nFkde0aeS+g`4ER{E=> zh81_~&EQ#k2YNG8cXE9T%|SkV_cX&XjcJZU_3E1rdiF;{Sb9<4tb0FlnHYNF(Ok?4 zKlk{k0Y^N&Z>C3Dz?AEIvbwt&KF;`B<-#@ddl-GyQ0r!9B#vI;%Y})z{^45rnK_#e zUV3y_ENqzYVdAP6@pOd^PtAIxA52*EkSpGsbf`c)vEpDZPcvN7L=Bq#J_}QRds_S5#Rm`g=El^}>&@ioBkp`^z;|~uZ{4ik>dNO$ z!uF=@`RV#r$M$02s>S~PSoNSscmJHZ*Mr#lfvdh4tD17$i-#fhACHyZ`014nddZKE zc)G|phwi);J{s`R?Bk5?zs$UUSp4baE#U=&A8%TycQd{8?#;@)VdJO=oYUTY8r73; zNlkV5;o*+k>kN+CVtiBT;=^xsZ^g;`Q(qiyXqnERwwKGFj&d`a+v6(F+k)p#j`^ws z+nLFs30!sTakr-h4fWT&zHhH@+{+Qq;HfJ|O*&Y``ZjUl*Oxsma=b^J@QW`zvF2(9 z;@mZpZU3WbZ;`%Y)xH^Qby%92Pwz;*o57~L+V=e3nA&*b(_7)!yZ7jxMy#6d_~fby z3vX`#4_c(Jds?PNIBA6gU!27ASz+_hSI;zXpJwjE{jt5?B%+A76QR(#l>d7^Xor_reR-q47dnWss%O<>J;TDeeD!eDuRLcpoyE!X4On5}iu0$L7<%KO zfALnok#uD6`1RvA+6s>kp0#gN{>{`E=U$BboAoyJiYqR#%BOk1FJha4x!jEI_^6Y{ z;`ByaI{9~qKi;>!e7V)ybuq#ml4N%S;|j*l^ULp)((CZYD;r_HaMVa92l;J#0PFPOh5r^g_RT7#;PD zCoH`6Xw_GL{J4sNueaucD|~hI1y60d`)=fXo&B7-;}c5{oN#q-51ZCj^ZCU;8sftzM~`WA+ryGCmJVWQq+i@xPmfjaxZrlP zdZvYY{Bf7lckf@UhTb)cQZIR z!sh3@*|!RC_r?90p_UbKLPi!)9B zc&ZOD=tC`My}>XWYZ}TiNA=u^lPCXX zc$zWo=-GFpU)=aU&ECz#=;vmBKdpTFfy4hgQ@{5j-*@Fs9Fs#gT=8&+XY;)6@s&pp zeD#P=9N@v$)6HPP_&lrsG|+$A(GNGcH&e6vFw})>R%YOP?2iWeHYa}EVf#LD^IHn* znarW`T$YQmzK z8CY+Ik6it#@4i3#_|wO?c#jqLzh*ePSL0?sXJXAwjJj6XH^a%QCwcheXjXi3-PzN^ zTM-Kbm;8E>M+ddV$g|Q&eLg+Jo&Me^?Y#lqqS(15>;h`>=4TmOcJ3 z#NdSI&0wi(#ex3Lbj$R}caK#qyu{(54&L~QeVuu)?$l#xB8JA|Xz$(O(wo2^zh7qF zKVHu>`TBsRHXJ!})q_QUob_PuovI_=o$tUKv*I9DooC^ zW@@?fR`G(An#M-NaJ8r%~x$c>{i+h@>;qLPc2lEz>OFgS4 z4!(Q+!{^t7d^6MIuQM8o)q^`eT+Bsnd;K?u-yiqZ-jF&sgC7Qd@~vvX=f};e4j=w> z$4@_c{rFhD6ZP-0($HBwb?kc=`u1k^au4HI8%|o837nh7#ogB#%$qqgXZiYfzL`F7 zO=o(F(?|UEr}vww<-T}vFngEs{fT4c(cAg$w<8ZWEH%H+o2R zQ?9-H=g0oG%2g9*F$_MgR=n}RfvFj{+a8`68ul&Vf}dH*@!Me5ew)OlF@0`EH}|mX z!|dG2(Yu;A6C)o#rZ;+8-QNt~w9ub8JemGJ&ESjCWB@izWLQQTYGWx<(ln>S$FiH zxm=id(%A2iy6)+K8@<)L$I7pU{@~oKo@t~8Zu0ciZ<~00{+z|xDwfF;1OH|?^Xmma z_vS-uIQKC3?wEXi!NS>_t4}lLxBfAc2iqGIZ!UUZy8DBvUopK~ zvGCQz!FR}iGZ^@&p`NonPQJm{nfsf;;iK=TS$fjH`QG+FXWq9yy!r6u$QS!@_FuDf zQA17GOpH9d)x}+p-k@(rtoi&o6Z3A?Oy%oC?VC9_e>n2#Sg$z2az`I^)f9(EJ-cT( z&=xKqE&n}}&yU;9ym4#)w!qZ$Uo&-Zq2V8oJr4B>=N_gHv1Y-qt~))^nJ!;v?s0Io zilIpwKW$HEb-XKY*1sF(1XmyY@}1*ir4`P6nRg~%zjUy|h@beI;o{z$ZpN=axPHU+ z=Bx&;u=wzcyBK%)iK83dR(JOB<*Mt>jPy_Qv~X{(`iBX>8giL=naSH3>Fu90J;TyB z9&m8LjjnRUsskS<__*+kwWkLiX~XZ{TZ0V~4r``r(W-YB2l#zwxBbr<9DKZ&X5_4v z6-IgL>IL8441MhVyT)jOE1vSz)+2tn@~HzuZ9cqdkN3^wz07dE8O-J)2DVz_aD#1+ z2OXX1cQf^H5NAyzXYZ&v+Uo^2413>+JuG?E#$UZ3vv}S1>Wh=Z)RS9`9DHbKrux%2 zE;r+YnU><=&^^BOYQ+cd=4|HAvzzsPk!N3z-T@rnmih5p%@{X& zz``3hIyloNZE2#0esF>R>r9+F&N$u7SsZ+Q!|6?0)lV0=@Y2X0Cca|nuWuU5p_zMJ za8(x`J@rRJ{BclUPk1$3xoW8a&&sEsTxT47_hQv%aBwka_u}E>;H;i^>+GK2+fc*z zE3aI4;u$XZ(?L8A^@Eo^e0_WKu;NXVdzcva&S@wXE}uE}=Bm$^4mhjF)Y1za_i)ty zWu~v!+0Af=AqLLR+0EqDt5|q66l)e{MkjIZ_`l4WgWAp2`w{0(zs?K~J;|q;-`JaZ z*Ubbc+;E5Swx0Z($+efmyenMP(l-oebI=1VZ|1&v^V|E5)v{L$Mm4=1eZq%9JKSLE z#~BZ~H`B)-Gj-+A=4l4+c?QdOD-Rc#{^Zl{X7252q?en)dpGl*#WovpzEiO`(~B9Z zho5tE7K6{1S+lc;tp|TMbEgNma&d*{p4Q$WY^yoo3r`F`jyF?_mj2+&SLE z(;j!&?fbVMt~$Q&o5`2Qe=}Hdr8^utUgTsyUeQY!2o&x zcQx@e)(Z$NfcSP~Fc{>&Y_WQS$Ir)#TXlJd$CsbF@u01HaX0g>UT55x-y^wb6A#~+ z+2l)GE1v4qr+RIkaE5F4X#w+Qu;B7huULE;jx@1{-5xKz%X!w(f>cYWFcYC?`;e$)xkT-YEF!1B+{?{1{xz#7Hy5$w)`)g*zh&5aM z@Q}MYt?=RSwc>#jOmFoEwpwAs`#9r+6V1&N4rbb3K6`69Zu@k=gCBlorhe1d{$}Fr zy~~@gRqmVVuNdzzt!lyBJ>F^Ou72bEeTF|B5>IEC=G3ZwvG}P=9((WV zg+UJ(;^8`5<-+%7?qHQmZD!p1I^!qz?=!K^e)HkeL{2?{VUGu1@Z@o4-}eEFKb~}O z4;Lo?W~?|qay;d^+`+A8 zeRS`9Gw&}mck#8?`?ST6^{%ICrQiLpJzVCyhO0L?!^A@@Tz5=IcBTRd^^5E>Z^JZ{xF*mrF zmHgyZ_s!tg#~Yqr$ww=7y*&&j409~THxj;k7`VFQt5!JqIp0hU+Tp5J+Tc%1bE$Ur zY39wpsq*oGkCPrZ*Xowjw`RRrb;;kX^Or;3IF=hG&T5rQ9G-H@FBay_+|$#_SAOqt zwZiL8&iKdyyWaAxrheb<;Zr=V_|cdy{P0pky1&=My`JC9UQPJW!5L?Fc*Dcz$4oxF ztnlSkySVz|U7x+1gM6Lg+>E|`?=aLKmKkWi_~GJDyjgH}Gk(krew^XWrylr*VA8@H zPWZr3yI9!t#*q(=yu+a9-)G+GFUGqX(&XOl-8uVKVe^xd+0#d!_d2Uv9-4{46(@f3 zw%0?P{J!$X)#^_Dc&XjYz1IMyJ6g!ApSZ}waFqj|H?@b418h0?;$!uGv$u!A?M|)D zjCcCcP3-dw&#>IdE06C)&-v)3J8!s($3fr4dZ!yr)T%~#@Zhf|G3vrAedLBAueet6 zIQxVBG80ELdgz;Tdcb!7X@-{>lS>WE9N?lJHTXW{5bupH&T4>jGj-!ouAkfE2M=ep z>b+XvmM8$Y$n3+rYunhBc9j~l+Q)nz8-#Q{F-KW4P^?hWUg;Vn+x z^+w%tx)X~B4aAAZv-x*!*4*KXBTjLLWtRE+yO}%vuovh1mP4IZ{M_S*hx+0S+q~i} z4z4?Xe8kiI9@ad1r-_;4Z~rn=BRqF}%ZDT0zs=yPUrsuPDTY2`V2HtqzdQ4CGn~YV z(?5N~yLtVx{d;^kpB_GP(3}>y>btvizU|ebW_;z0BR^c^lHcC@FEe*I^ZhoHQ!VfN zj5p4F#N&}}a;eeG!sVkLyu{tiy*RwpZ7+{=erc}X^5f(UPctG8jyO4-&56DI=_C#} zIpp`QcjEMRE)q>DPuNqwVt9OdPQms;)Rqtng2!xQ`K!{jp`-qeKi^9&|_-sq?QaMb9x z`DXeom)_`+oEcm-u;vn1dhxF}a6iv(=Dy!L8uP_NPF!F+VVsPKRxza{s-G{&&}|)!hkQI{p$>Oy>?FnHOYIkYIZM= znC1WmlQX>L8lJs=<8M!YeCf$wUcAD5+g{%6wwD)2+~P%7R;{q)Fr)OBgXs&d^87yI zLl5`%u;I$5PF$U>{P>8)%e|Vsxzj5#_b}SXQ4Q|%#l^qXeHZHB2hSch4QRoKKTh)B z%-jE&#X)|0HdnMTLyS+eDL;IE-)D5<3-`~N9PaqL7b_2LIQV|dC!N%WN4dPiuRpM8 zoksHZZ%y9|AMg5)LwRV292Zwr6jn3ZbBnDsSbj9^%G?R-T zzVhR%HuDP4_iV1{6s~^4yBQ9AaO8h8epWi*CzfCQ?B!Gw4swe5I4d`N8qi*xKYmX$ znD?;eg%1w&!CelR>QbW^@$T{A?~T62if1sbV))|%%iYb~tGT-LNgZ)fw|Dqy9ti}@AkBDFP~Vy8S=u!m2Q4Z z)$ANXFwP*al&#D7o*nH@uZg24E zQfxkQ+JU>e|7V_89$oI@6Q_!H;a!uHOnc7cUb?N!GXco z%9o$|o$cX^$D3ZXWH^}{zV6i-Pq^lY4)V!sPVDv1T)?;2EBxKbV>LhG;o4jI;PYkX z?%tXCm$O{7)@$dR;Ydro>FFK@e(8=sU2Y~%`SQWvn>=t}Se^O2&0c0=amT@3x!ir8 zdB*`CyyWrkMJr8U(n1VPar7=hj(0H;DDRB=b1N{-uQZ#+nlM>-d%IdSB%{5&4F0CUT1wf%@CZQvt~h!zt7;N zfj4pV!xNS~9SD!Oh%Po7GvIJyVBOPFQ%!1xH?a ztoK;)q6yu8ozYJJ)0e;Bnw#;VS^D~J8%;am{+`-{z=AH5OTcDQo;e)%`(#Q0*_a;`|)!v$){4n{^&-;JP+~K1( z{O$GAYJRQ!)#!}V&1j9M-1cz9d*>%F(=T}HV(O%)IQqc&Jaf-qAK%w17M?nB|2o4- ztQz2(FFL`}L;HG0Gx7L&7puSYm+#Zey*YykON?_G;8T7vIPvYfrH^;_f1lk9e)06d z2QM*r^Zz)LPmEYR=)g~Y@AAN*zx~Z#XE4O|F5k`KT|TwYU0+(|f+-Iin&IP}{@%sm z;+=lxuG;z11SS)2{V>y`o2dnk9B~i>!>n25Dz+ZWiAS@lF8Zojt@4!L89rP*X{4^F z+0DG+ASN7|@x{qEfr~xf{9w}1y%@gue4F8Gk24>f+`-|8hj}z#>VT);u<_7q@nX%L z7<;ik~|e z&7u5qnlW|S*EjXabq}kL>M=vKR;L)h7dI2j&;Iurj&Rh@Pfg7$9`yhoZtAsHZ~YbH zO&lHNglBc91~tOEnOJ%G@E7YH9~|7tA(mdai-FU(rfytrR*n4CtRH5;ySJOUhs{T< zo_b?2-RT8h`S8CP&Ah+O^wE9a6RzUD>0fiB);REypHFp|&zqTNzBIr|-EzUfUo0OQ z*yECx=09!gFYf&0@(!Did-b`Khp9m=@|g)*;3?ic4*1IHUcX_e7mk>(GdN<@AeXaP zXW0DRr#U=(c=C96R&RT=07D(>hr{k+bfN=;(G02=H+skeuNhY#KegzM`IE<=xGyt! z_gK@G9}ID7WAt<{hgBZ+s2MkU!1N~09sKwD(68StGpkm<3@(oK#CkLQ%=!lp z2RQs-(4w03iY_#O&F>zjCTA;7R&jFZ&C3kFT=MsAiBS_iF!e%=JuTE9XEE;eRm{^& zUGU)Zg>S~p9nIj<=4Q^g%ZU>odpg6EoAKu>FF$#3;tNl1=X>no$mtyic(ii|4~AOo zy}?L>^x{w3&iB~6(<61lmzU{_JEmrSaGP~|{_2G-H{R9NzbE3wz^pg8;Vzb+IQyHa z1)e(X@l}(R4r1wspPb?tfBna+cq`p+1`7@@dMvN_n>pi02OMGC%$=2=z4?HHuXx|o zJ?yWo{`!5u2~U1zzW)23@q*`_e>`c$&+jxIxXPus?)l>4jTU&*ktW{$HWTBwpnT%x za-TNh#WL^TXE(zqO!qMKU4Gp3z=|&&-e$0!?_uAz@|O!o{`_c9i@4~OIGB1T#$GLY z>x=^&dtAio0Ux+@b%!&};zlF2Ftze$dV))5Z_hLNKR@iY))&6jA}>DPZU&16VSUTvoW0H5iRDAXk2AU4(*_27>&h9ic- zgF!d-%B^00<(5m%z9p+U#?>Cac(FH=TThsK-!eS7?!14Q$yY7z{M+eW4gBSeJ1+9Y z9q;ne8HcgAK!|-IQZV+nQL+OH`8;x+~Wn?-n+V;`SX!84d8owKRfEV zhuOzR4mIJbUt;7^hd-#D&qseL3o%9JJ+sGd#*$tULMW<_!ic z-#C3)y~N3^rJ+^4Rje9tl^>_HqL25Rd4s7=b@Nw?`uK>W3r=*l-pso`;0M>4Hhz1G zht0g>D$mW}x#I@|=Vn5VYR1WLf%@_AMsxA@_OfQcARgfwlwBT2k-LWAUA9n-s5kD)qKk(hA%&RJm~1GRx7_|QEWZ` zzP%W^^$(6Se)9Nz{WMD(HPiTJ>hfmw+bZ6>czgNW`<*p|H>2gx89ct~#05t_;`(0T z;(D_%tzygPO*|~I`la@pIm1*_ny8Df9PXN7c;fT~M|*Gb#lg&(8S(t=#nH)`uUt1% zI~*L`;~^iN`HOYW_`s}QZ~6@5W`CQhnMVBLAIIAr9%|EX_wkTRZv5EIaDW9oJam5DUN61;aZ(oMGKeUb-;8R`LAshk*ybo9PulIg3*>9~`af zNH09-;_f{+_2UDF52LBPzAHN2%ozuq82@s($5CyJ9{g{Hr#rb{X5QG%@P+UD=19N*^F9#@*<0lW7&i1#Ls zI(>8eaOVTlZvr28c>Owq(dNJ?{M9z2|k=Ox90~Bj`#fWpy|!%qrUGm8pn%|I?Xg3-;s0t_{t$3zI**t zk8g=4V%+N&p8UMyA=dvJ<)(*T@RdvM3?K97H;1oP?X>%S22-rF_x1 z`Qz%07hJyX_~RxXws$$Mh6HGC5 z;V)Mj@R3g~u=z4Mtv90wJ@pPBSbA_Xc(CkgVuP|b-Kl}$ zTTObQ=P>#4hv}X9Gb^~L8IPN#lUb6-9nEl1lfKIJZFVzS_?@t)lls`rT~{eRv*O3>ksdL&D2OE^Fv>JZYGANa^T>e2I|EBZN{g$<7Y2#c;a#6pYQkW)hAc? z_?mm%^7m%1Cvf3=r!Rl^?({&N<_k7o@AA3-bA~@%aP#(c=1q@&%;E-5PQL1cg_k<$ z#N6RP3qJY+hqgHJp_QEWVxMPxnLGL9vU=Bdywvjd89eti!WlMS+OvPm+?y}_Z-$3> z{N)J`7Cvf%2?tO7;-sGDNlx16A*-Hy?B$l{(+n4Rc1I( zZ}#HF(AA1ReEiKOKj->juWo+vRF~eE2YBM%YpPz~h4*{x;fbd?UNnHor@4|#Z2I$a z_vvw`Mmo7u6AT6yhxeRsXZZh~+4I4PF5=n&`$)47_I8-ZzRP z4)|E*vgc1zIiF|V;J~x@USFN*seZ9m8d{l|QzNbA#S2fp5a+B;@9BHn$PiW^m=en{TT;dVr&QD-3$v%-o4ppF4er4;Mf0>Y<&!;KScLJlIzEczgRe z(;xBf)Qv|u;n2zNI$SYnDUQLE7Z-0ggJ;gY-D8at9QQ9XeYe+3MsMHu&EC&DY?!#q z>0F(7tI=AGeAME%lm2qVTWr`?zPNeU7xlwaD}Hpfy5oB@`j~b1{PYR8n>o{r|JNBz zzcKjfoqOg^UL5gOpWJeYcedhaFV~M5pPSL#o!oN56x*D@l*63hCbwDR!+b}y!9lM+ z%xES)P2uZ_m4>*`$sHfqH&dtB-mN%^!3)Qm$t$*A@>3&?Zbnyc)qt~piHW=Ufa6{c zb5QTqiJvncdvm5&>QrMsbc7p6dF6oTJN`VQ3!QETQw*!u_VO^X^7ZffZSP(!df{F^ zdN?h3^dyXM6c+2RGhuXe!R$4Co(UcXHJC=7N7crUPs%-#EeN zhpT@6Hp2y`H}~eiT+)v3&Ggh>{`!Km8syZMo555E9~ijv(PMK@vp;4x!;c8lb^F#zc2K67DET|)_TPc|1`kKyp|Uqcl^}D&)e$^ zzI@(qRxWqufUi8hGkMj)oEa_P#tVPBZ|2^=>FUCdj&zNiJAY!CxrVI=-qKN=clCSs zT|2|BmfIdb7~aLJ$;!lb&yVI-_hQmV-OkT5*lJLxd{*yb#LKULczTzo+VP~DHGRa> zLOuTEq?h+F<+L}~&5%CbOdk2*%Fh?R)%n+%8u7=)+xHnf{nlH#t#bckb~Cnorv=W2Z!+G#uaCE!Yq$Beqze2Ccj-?OFnmM5sPzLINwYjxt+b;3~#yh3eL@Fj~8v#S=`U3#WhzCDLH!GYl(^uWi_J{59#u2BR_1)RirEl8I;&U^lwUjCd=5cr?bv{mo#& z0OgJ~-;Qnb>+~uQtB&etMj@{Lk!&Geh+A4p-ms!x@ge z#q*~b+?#nzBX8oJ?fVY+z*L8RsKGf*_qe-f=1onsa8|E;R#$c2}D@q)wWX1-tf?dbuZpSf{{0ZR;{o3(F*k2%1RuUOxSdgT2$!$BUL>4Bp= z9AJq_BlrCl-1f~;y_SoP^5Gzk&&|Z~51Kg*X7-#umdxxzSdZeq>o%h~g)IYOl-|W$a-;#y z%b^B)^Jf)DN0@Sor; z@!KMAF?gCSGeKWI)hpl4_{PuP9mDmn8H~4?Kd~@ix}!5rIN*5iR$A~WUpnC|pEtbq z3m5rlbTeml$o0SZxu-W@Yjrr&&MJ<{;m%6iV$xB({CscL9NDV}HvTwUo%QOsnRoYM zVbg?G>}Kxy$Z3AU@$P%2Pq=z1{(W7}YKN1Cw>`~ppt*U}bC~5yFEMI^N!yp1Jl@su zX+{@!eBIOPW_ZDeOOrV8F`N9%RKGj@mZ?b`KY8`)9((2G z#(Fb6=VbkyCx%-21-Z@>7@f&l#@poW;u9_oFsv{{NoQw_LaVd);8b zuW#aDew}&42?sf7^*Vza7r5}~Ln~PBoUOhS_1uj1u<_Af@9$>>e@3G;r6W%ISWS4; zE7iWA@$|jNp6;J!a`$hol?FJ=f3x!2(+U@OYG|J>&NtIf z8p4*p{y4*x!@OB<=C{E;95aPy^Y`}H<3zi(rI$CHX>c<&=VzbR-eAkuoY3icMmII$ z%U?WgNvpdb5u&9JRnOJIz44dAE;?xuYZed+eR<<&wYEy*w~zM;A5Fw|w4j zhHHCz(B*BWUf<%)#Oj6pdk*ftKkng(r!x&fZSG;P{Qp3H z^Cp%Ku$jEh@c7UsJ-mr;7H)g-W?CzI>W%5uD%U3Vf98Q_%Mo- z7cP$VgU%gnoae$M#QyKj^Z-tbD_`X%0sz!zhc8;0*k zZSG-MakYxG!h@~PxQf9~4ScQM>GK}v9_Q-myW->b!5@xd;oV~|pP7KoXm&IAG*>e% zzRYM82lc2EmRk7Y>uk@L@!?AY-0xw0Xya^V@WxdSo$-jPoVeq}=WV8bx%w_{d;Xth za`Baqzj*l0-qaFj-0b59GY)1w?c~Huyx)?07;Jf+#me_#rhl;2Va4ZWV%<55qfy_q zy*h6u7aZrenY=GE_%y{UJ@oo!dgWa{HPE-*a>)aW5Bg zQ(V1U-NT}Vv%S95-)1;|a+;NXi}1m%Z$&N8h-a54*g zagwjT!BHPSaeU=u_OyY+KRwih2OP1@D;_k)!M%8#Sla5PbKLniOYUw4N6onAf7{nT zcR1ifH#5}UJ)@y}JgON_{<7q4c% zX4M`4IM7mDGortG0ne<_Ic~HO2ZIjsxKnR2u=vZ#SG-kD+?;8or~GK=|3>c3Dy-@; zfhfVt9$t3)7@ZQZ}mCl3yC!&i^_q=#Ca z)$W~d--nvus{>yC^%F)s#JlGU6P7!A+)NI5w0DP(c;ADZw4sA~<@_@HI4jQFiNj3} z-=n=;^1`5*RbS<@r;Gb~Z(h9N2gCkmuaABBa?n$s`7(L%g9R5K*!JFT1`mIJ<+|